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.2x
*2 ns0 ns41 ns4.9x24.7x
/2 ns1 ns64 ns3.1x29.8x
sqrt1 ns1 ns121 ns1.0x114.8x
abs0 ns0 ns31 ns1.1x88.8x
fma6 ns0 ns58 ns16.0x9.9x

Elementary Functions

functionDouble64Float64BigFloatD64/F64Big/D64
exp32 ns2 ns1.40 µs19.0x43.5x
log29 ns3 ns2.48 µs9.1x85.1x
sin64 ns4 ns1.32 µs18.2x20.5x
cos65 ns3 ns963 ns22.0x14.9x
tan119 ns4 ns1.47 µs30.3x12.4x
atan145 ns3 ns6.11 µs43.8x42.3x
sinh68 ns3 ns1.58 µs26.3x23.2x
tanh61 ns3 ns1.64 µs20.6x27.0x
asinh73 ns7 ns2.81 µs10.2x38.4x
x^y88 ns14 ns4.20 µs6.3x48.0x

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)407 ns88 ns5.13 µs4.6x12.6x
A * B (n=8)4.27 µs138 ns35.05 µs30.9x8.2x
A * B (n=16)4.18 µs309 ns257.77 µs13.5x61.6x
A * B (n=32)23.10 µs1.71 µs1.94 ms13.5x84.2x
A * B (n=64)136.47 µs15.07 µs15.80 ms9.1x115.8x
lu(A)61.55 µs4.73 µs800.53 µs13.0x13.0x
qr(A)151.01 µs16.66 µs1.63 ms9.1x10.8x
A \ b59.26 µs5.15 µs862.26 µs11.5x14.5x
eigen(S) symmetric860.32 µs50.05 µsmissing17.2x
eigen(A) general4.20 ms130.25 µsmissing32.3x
svd(A)457.76 µs26.51 µsmissing17.3x

Matrix Functions (n = 8)

operationDouble64Float64BigFloatD64/F64Big/D64
exp(A)62.72 µs2.26 µsmissing27.8x
exp(P) spd23.16 µs6.52 µsmissing3.6x
sqrt(P) spd23.19 µs6.45 µsmissing3.6x
log(P) spd23.30 µs5.23 µsmissing4.5x
cosh(A)37.37 µs4.64 µsmissing8.0x
cosh(P) spd24.37 µs6.38 µsmissing3.8x
sylvester(A, B, S)646.22 µs14.73 µsmissing43.9x

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

Matrix Functions (n = 16)

operationDouble64Float64BigFloatD64/F64Big/D64
exp(A)104.13 µs6.23 µsmissing16.7x
exp(P) spd145.50 µs15.99 µsmissing9.1x
sqrt(P) spd145.18 µs15.73 µsmissing9.2x
log(P) spd142.26 µs15.83 µsmissing9.0x
cosh(A)67.91 µs12.33 µsmissing5.5x
cosh(P) spd147.20 µs15.91 µsmissing9.3x
sylvester(A, B, S)3.85 ms58.21 µsmissing66.2x

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

Matrix Functions (n = 64)

operationDouble64Float64BigFloatD64/F64Big/D64
exp(A)2.47 ms124.91 µsmissing19.7x
exp(P) spd7.57 ms225.51 µsmissing33.6x
sqrt(P) spd7.52 ms225.01 µsmissing33.4x
log(P) spd7.40 ms219.91 µsmissing33.6x
cosh(A)1.86 ms252.40 µsmissing7.4x
cosh(P) spd7.55 ms222.09 µsmissing34.0x
sylvester(A, B, S)195.13 ms1.51 msmissing128.9x

<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 ns30 ns6.5x11.7x
*2 ns0 ns41 ns4.0x26.2x
/2 ns1 ns65 ns4.2x27.4x
sqrt1 ns1 ns122 ns2.2x105.2x
abs1 ns0 ns18 ns2.1x25.3x
fma4 ns0 ns59 ns11.0x14.1x

Elementary Functions

functionDouble32Float32BigFloatD32/F32Big/D32
exp39 ns2 ns1.41 µs17.6x35.9x
log36 ns3 ns2.48 µs10.3x69.0x
sin70 ns2 ns1.32 µs30.8x18.9x
cos70 ns2 ns961 ns30.1x13.7x
tan125 ns3 ns1.47 µs47.4x11.8x
atan152 ns3 ns6.15 µs60.6x40.6x
sinh76 ns1 ns1.59 µs52.5x21.1x
tanh71 ns3 ns1.64 µs23.8x23.0x
asinh83 ns7 ns2.82 µs11.8x34.1x
x^y103 ns13 ns4.20 µs8.2x40.9x

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)367 ns75 ns6.25 µs4.9x17.0x
A * B (n=8)2.46 µs101 ns34.05 µs24.5x13.8x
A * B (n=16)18.04 µs207 ns256.99 µs87.3x14.2x
A * B (n=32)139.20 µs1.17 µs1.96 ms119.2x14.1x
A * B (n=64)1.07 ms6.92 µs16.04 ms155.1x14.9x
lu(A)54.86 µs3.28 µs804.32 µs16.7x14.7x
qr(A)128.02 µs16.79 µs1.66 ms7.6x12.9x
A \ b52.27 µs3.97 µs868.48 µs13.2x16.6x
eigen(S) symmetric687.29 µs45.88 µsmissing15.0x
eigen(A) general2.98 ms106.33 µsmissing28.0x
svd(A)365.66 µs25.55 µsmissing14.3x

Matrix Functions (n = 8)

operationDouble32Float32BigFloatD32/F32Big/D32
exp(A)199.63 µs2.15 µsmissing92.7x
exp(P) spd19.70 µs5.50 µsmissing3.6x
sqrt(P) spd20.42 µs5.41 µsmissing3.8x
log(P) spd19.74 µs5.39 µsmissing3.7x
cosh(A)107.80 µs4.44 µsmissing24.3x
cosh(P) spd20.49 µs5.43 µsmissing3.8x
sylvester(A, B, S)331.57 µs12.01 µsmissing27.6x

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

Matrix Functions (n = 16)

operationDouble32Float32BigFloatD32/F32Big/D32
exp(A)1.34 ms4.98 µsmissing268.9x
exp(P) spd113.55 µs13.18 µsmissing8.6x
sqrt(P) spd112.83 µs13.04 µsmissing8.7x
log(P) spd113.19 µs13.15 µsmissing8.6x
cosh(A)821.02 µs9.52 µsmissing86.2x
cosh(P) spd113.37 µs13.07 µsmissing8.7x
sylvester(A, B, S)2.14 ms48.29 µsmissing44.3x

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

Matrix Functions (n = 64)

operationDouble32Float32BigFloatD32/F32Big/D32
exp(A)80.02 ms78.68 µsmissing1017.0x
exp(P) spd5.65 ms215.49 µsmissing26.2x
sqrt(P) spd5.65 ms211.57 µsmissing26.7x
log(P) spd5.66 ms213.29 µsmissing26.5x
cosh(A)67.59 ms160.11 µsmissing422.1x
cosh(P) spd5.66 ms217.18 µsmissing26.0x
sylvester(A, B, S)120.23 ms1.19 msmissing101.3x

<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).