DoubleFloats Benchmark Report

Generated by docs/reports/benchmarks.jl on Julia 1.12.6.

This report covers a representative sample of operations; it does not cover all available functions. Timings are best-of-trials amortized averages on the machine that ran the script — treat them as indicative magnitudes, not precise measurements.

Double64

Double64 carries ~32 significant decimal digits. Float64 is the native baseline; BigFloat timings use the default 256-bit precision.

Scalar Arithmetic

operationDouble64Float64BigFloatD64/F64Big/D64
+2 ns0 ns31 ns6.9x13.1x
*2 ns0 ns41 ns4.9x24.4x
/2 ns1 ns64 ns3.1x29.8x
sqrt1 ns1 ns131 ns1.0x124.3x
abs0 ns0 ns18 ns1.1x50.4x
fma6 ns0 ns59 ns17.3x10.0x

Elementary Functions

functionDouble64Float64BigFloatD64/F64Big/D64
exp73 ns2 ns1.41 µs43.2x19.2x
log54 ns3 ns2.49 µs16.7x46.3x
sin80 ns3 ns1.32 µs30.0x16.6x
cos80 ns3 ns973 ns28.3x12.1x
tan135 ns4 ns1.48 µs33.7x10.9x
atan148 ns3 ns6.15 µs45.1x41.5x
sinh94 ns3 ns1.58 µs36.3x16.7x
tanh90 ns3 ns1.65 µs30.9x18.3x
asinh100 ns7 ns2.81 µs13.4x28.2x
x^y140 ns14 ns4.21 µs10.1x30.1x

Linear Algebra

Float64 timings use LAPACK/BLAS; Double64 uses pure-Julia generic algorithms (GenericLinearAlgebra / GenericSchur), so these ratios combine the precision cost with the loss of BLAS blocking and SIMD. Matrix multiplication is measured at several square sizes; the remaining operations use n = 32.

operationDouble64Float64BigFloatD64/F64Big/D64
A * B (n=4)406 ns87 ns5.17 µs4.6x12.7x
A * B (n=8)4.26 µs132 ns35.40 µs32.3x8.3x
A * B (n=16)4.14 µs307 ns264.57 µs13.5x63.9x
A * B (n=32)24.16 µs1.90 µs1.95 ms12.7x80.9x
A * B (n=64)136.20 µs15.62 µs15.49 ms8.7x113.8x
lu(A)61.75 µs5.03 µs796.37 µs12.3x12.9x
qr(A)150.86 µs16.48 µs1.65 ms9.2x11.0x
A \ b59.28 µs5.55 µs1.21 ms10.7x20.5x
eigen(S) symmetric860.22 µs50.46 µsmissing17.0x
eigen(A) general4.22 ms131.64 µsmissing32.1x
svd(A)458.27 µs26.57 µsmissing17.2x

Matrix Functions (n = 8)

operationDouble64Float64BigFloatD64/F64Big/D64
exp(A)51.09 µs2.23 µsmissing23.0x
exp(P) spd24.16 µs6.63 µsmissing3.6x
sqrt(P) spd22.96 µs6.50 µsmissing3.5x
log(P) spd23.30 µs5.79 µsmissing4.0x
cosh(A)36.94 µs4.72 µsmissing7.8x
cosh(P) spd24.31 µs6.46 µsmissing3.8x
sylvester(A, B, S)660.35 µs14.76 µsmissing44.7x

<p align="center"><em>spd = symmetric positive definite</em></p>

Matrix Functions (n = 16)

operationDouble64Float64BigFloatD64/F64Big/D64
exp(A)98.74 µs5.96 µsmissing16.6x
exp(P) spd153.30 µs15.58 µsmissing9.8x
sqrt(P) spd147.38 µs15.82 µsmissing9.3x
log(P) spd144.34 µs15.65 µsmissing9.2x
cosh(A)64.75 µs12.39 µsmissing5.2x
cosh(P) spd148.98 µs15.64 µsmissing9.5x
sylvester(A, B, S)3.97 ms59.09 µsmissing67.2x

<p align="center"><em>spd = symmetric positive definite</em></p>

Matrix Functions (n = 64)

operationDouble64Float64BigFloatD64/F64Big/D64
exp(A)2.48 ms126.02 µsmissing19.7x
exp(P) spd8.07 ms229.45 µsmissing35.2x
sqrt(P) spd7.62 ms222.10 µsmissing34.3x
log(P) spd7.48 ms223.22 µsmissing33.5x
cosh(A)1.93 ms258.16 µsmissing7.5x
cosh(P) spd7.58 ms224.60 µsmissing33.8x
sylvester(A, B, S)200.88 ms1.53 msmissing131.1x

<p align="center"><em>spd = symmetric positive definite</em></p>

Double32

Double32 carries ~14 significant decimal digits. Float32 is the native baseline; BigFloat timings use the default 256-bit precision.

Scalar Arithmetic

operationDouble32Float32BigFloatD32/F32Big/D32
+3 ns0 ns31 ns6.8x12.1x
*2 ns0 ns41 ns4.1x26.4x
/2 ns1 ns65 ns4.3x27.2x
sqrt1 ns1 ns130 ns2.2x112.5x
abs1 ns0 ns17 ns2.1x24.7x
fma4 ns0 ns59 ns10.7x14.2x

Elementary Functions

functionDouble32Float32BigFloatD32/F32Big/D32
exp79 ns2 ns1.40 µs35.5x17.7x
log59 ns3 ns2.48 µs16.9x42.1x
sin85 ns2 ns1.32 µs37.8x15.5x
cos86 ns2 ns952 ns36.7x11.1x
tan140 ns3 ns1.49 µs53.4x10.7x
atan154 ns3 ns6.16 µs61.4x40.1x
sinh101 ns1 ns1.58 µs70.3x15.6x
tanh99 ns3 ns1.63 µs33.5x16.4x
asinh106 ns7 ns2.81 µs15.2x26.4x
x^y153 ns13 ns4.20 µs12.2x27.6x

Linear Algebra

Float32 timings use LAPACK/BLAS; Double32 uses pure-Julia generic algorithms (GenericLinearAlgebra / GenericSchur), so these ratios combine the precision cost with the loss of BLAS blocking and SIMD. Matrix multiplication is measured at several square sizes; the remaining operations use n = 32.

operationDouble32Float32BigFloatD32/F32Big/D32
A * B (n=4)365 ns67 ns5.13 µs5.5x14.0x
A * B (n=8)3.13 µs136 ns35.27 µs23.0x11.3x
A * B (n=16)18.10 µs210 ns259.57 µs86.2x14.3x
A * B (n=32)139.26 µs1.10 µs1.97 ms126.7x14.1x
A * B (n=64)1.08 ms7.23 µs16.66 ms148.9x15.5x
lu(A)54.71 µs3.29 µs806.39 µs16.6x14.7x
qr(A)127.89 µs16.26 µs1.65 ms7.9x12.9x
A \ b52.06 µs4.07 µs921.27 µs12.8x17.7x
eigen(S) symmetric686.83 µs46.01 µsmissing14.9x
eigen(A) general2.97 ms106.43 µsmissing27.9x
svd(A)363.99 µs25.27 µsmissing14.4x

Matrix Functions (n = 8)

operationDouble32Float32BigFloatD32/F32Big/D32
exp(A)199.33 µs2.08 µsmissing96.0x
exp(P) spd19.66 µs5.36 µsmissing3.7x
sqrt(P) spd19.05 µs5.38 µsmissing3.5x
log(P) spd19.64 µs5.33 µsmissing3.7x
cosh(A)107.75 µs4.37 µsmissing24.7x
cosh(P) spd19.78 µs5.37 µsmissing3.7x
sylvester(A, B, S)332.10 µs12.12 µsmissing27.4x

<p align="center"><em>spd = symmetric positive definite</em></p>

Matrix Functions (n = 16)

operationDouble32Float32BigFloatD32/F32Big/D32
exp(A)1.34 ms4.96 µsmissing270.7x
exp(P) spd114.20 µs13.27 µsmissing8.6x
sqrt(P) spd112.69 µs13.07 µsmissing8.6x
log(P) spd113.61 µs12.96 µsmissing8.8x
cosh(A)821.90 µs10.07 µsmissing81.6x
cosh(P) spd113.92 µs13.07 µsmissing8.7x
sylvester(A, B, S)2.14 ms48.52 µsmissing44.2x

<p align="center"><em>spd = symmetric positive definite</em></p>

Matrix Functions (n = 64)

operationDouble32Float32BigFloatD32/F32Big/D32
exp(A)80.08 ms78.75 µsmissing1016.9x
exp(P) spd5.70 ms217.07 µsmissing26.2x
sqrt(P) spd5.67 ms218.18 µsmissing26.0x
log(P) spd5.68 ms215.54 µsmissing26.4x
cosh(A)67.63 ms159.03 µsmissing425.2x
cosh(P) spd5.67 ms214.26 µsmissing26.5x
sylvester(A, B, S)120.53 ms1.20 msmissing100.4x

<p align="center"><em>spd = symmetric positive definite</em></p>

Notes

  • Entries below ~10 ns are at the resolution of the timing loop; treat them (and their ratios) as "too fast to matter" rather than exact.
  • Double64 and Double32 values are immutable bitstypes; vectors of them are stored inline, which is where much of the advantage over BigFloat comes from.
  • Matrix-function timings include the full dense algorithm (scaling-and-squaring for exp, Schur-based methods for sqrt/log).
  • missing BigFloat entries mark operations with no BigFloat method to benchmark against (generic eigen/svd and the dense matrix functions).