DoubleFloats Benchmark Report

Generated by docs/reports/benchmarks.jl on Julia 1.13.0-DEV.1123.

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

operationDouble64Float64D64/F64BigFloatBig/D64
+2 ns0 ns6.8x35 ns14.3x
*2 ns0 ns5.4x50 ns26.1x
/2 ns1 ns3.4x90 ns39.4x
sqrt1 ns1 ns1.0x154 ns131.4x
abs0 ns0 ns1.0x16 ns44.6x
fma4 ns0 ns11.3x75 ns18.3x

Elementary Functions

functionDouble64Float64D64/F64BigFloatBig/D64
exp58 ns2 ns33.0x1.75 µs29.9x
log101 ns2 ns40.8x3.27 µs32.4x
sin76 ns2 ns35.7x2.00 µs26.5x
cos76 ns2 ns34.9x1.67 µs22.0x
tan154 ns4 ns40.5x2.44 µs15.9x
atan163 ns3 ns51.7x9.99 µs61.5x
sinh90 ns3 ns33.6x2.11 µs23.3x
tanh115 ns3 ns35.1x2.30 µs20.1x
asinh148 ns5 ns27.8x4.40 µs29.7x
x^y189 ns19 ns9.9x6.46 µs34.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.

operationDouble64Float64D64/F64
A * B (n=4)800 ns67 ns12.0x
A * B (n=8)6.00 µs200 ns30.0x
A * B (n=16)5.60 µs467 ns12.0x
A * B (n=32)29.77 µs3.13 µs9.5x
A * B (n=64)171.30 µs21.63 µs7.9x
lu(A)134.33 µs4.47 µs30.1x
qr(A)227.80 µs36.00 µs6.3x
A \ b82.03 µs4.73 µs17.3x
eigen(S) symmetric1.22 ms48.73 µs24.9x
eigen(A) general5.36 ms120.90 µs44.3x
svd(A)644.67 µs39.60 µs16.3x

Matrix Functions (n = 32 unless noted)

operationDouble64Float64D64/F64
exp(A) (n=32)757.63 µs32.77 µs23.1x
sqrt(P) spd1.40 ms56.00 µs24.9x
log(P) spd1.52 ms52.03 µs29.3x
sylvester(A, B, S)38.31 ms262.70 µs145.8x

Double32

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

Scalar Arithmetic

operationDouble32Float32D32/F32BigFloatBig/D32
+2 ns0 ns6.5x35 ns14.1x
*2 ns0 ns4.5x50 ns30.0x
/2 ns0 ns4.6x89 ns44.4x
sqrt1 ns1 ns1.0x149 ns213.0x
abs0 ns0 ns1.2x17 ns41.1x
fma3 ns0 ns9.0x77 ns22.7x

Elementary Functions

functionDouble32Float32D32/F32BigFloatBig/D32
exp59 ns2 ns28.7x1.70 µs28.7x
log100 ns3 ns35.2x3.31 µs33.2x
sin82 ns2 ns40.4x1.85 µs22.5x
cos81 ns2 ns38.6x1.37 µs16.9x
tan157 ns3 ns61.7x2.12 µs13.5x
atan167 ns2 ns68.9x8.10 µs48.6x
sinh87 ns2 ns52.2x1.96 µs22.5x
tanh109 ns2 ns45.4x2.07 µs19.1x
asinh155 ns5 ns29.6x3.72 µs23.9x
x^y198 ns9 ns22.8x5.40 µs27.2x

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.

operationDouble32Float32D32/F32
A * B (n=4)333 ns67 ns5.0x
A * B (n=8)2.13 µs133 ns16.0x
A * B (n=16)15.03 µs300 ns50.1x
A * B (n=32)109.67 µs1.10 µs99.7x
A * B (n=64)851.37 µs6.83 µs124.6x
lu(A)47.10 µs2.83 µs16.6x
qr(A)137.23 µs15.57 µs8.8x
A \ b43.27 µs3.20 µs13.5x
eigen(S) symmetric675.30 µs129.73 µs5.2x
eigen(A) general3.03 ms96.37 µs31.4x
svd(A)385.13 µs20.40 µs18.9x

Matrix Functions (n = 32 unless noted)

operationDouble32Float32D32/F32
exp(A) (n=32)11.70 ms25.40 µs460.7x
sqrt(P) spd728.77 µs48.37 µs15.1x
log(P) spd747.97 µs44.67 µs16.7x
sylvester(A, B, S)unavailableunavailable

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).
  • The Double32 Sylvester row is unavailable: its generic Schur path currently fails for Complex{Double32}, so reporting a timing would be misleading.