- N.B.
Double64
is the most performant type β
pkg> add DoubleFloats
or
julia> using Pkg
julia> Pkg.add("DoubleFloats")
these results are from BenchmarkTools, on one machine
There is another package, Quadmath.jl, which exports Float128 from GNU’s libquadmath. Float128s have 6 more significant bits than Double64s, and a much wider exponent range (Double64s exponents have the same range as Float64s). Big128 is BigFloat after setprecision(BigFloat, 128).
Benchmarking: vectors (v
) of 1000 values and 50x50 matrices (m
).
Double64 | Float128 | Big128 | Double64 | Float128 | Big128 | ||
---|---|---|---|---|---|---|---|
dot(v,v) |
1 | 3 | 7 | exp.(m) |
1 | 2 | 6 |
v .+ v |
1 | 7 | 16 | m * m |
1 | 3 | 9 |
v .* v |
1 | 12 | 25 | det(m) |
1 | 5 | 11 |
relative performance: smaller is faster, the larger number takes proportionately longer.
julia> using DoubleFloats
julia> dbl64 = sqrt(Double64(2)); 1 - dbl64 * inv(dbl64)
0.0
julia> dbl32 = sqrt(Double32(2)); 1 - dbl32 * inv(dbl32)
0.0
julia> dbl16 = sqrt(Double16(2)); 1 - dbl16 * inv(dbl16)
0.0
julia> typeof(ans) === Double16
true
note: floating-point constants must be used with care, they are evaluated as Float64 values before additional processing
julia> Double64(0.2)
0.2
julia> showall(ans)
2.0000000000000001110223024625156540e-01
julia> Double64(2)/10
0.2
julia> showall(ans)
1.9999999999999999999999999999999937e-01
julia> df64"0.2"
0.2
julia> showall(ans)
1.9999999999999999999999999999999937e-01
julia> x = ComplexDF64(sqrt(df64"2"), cbrt(df64"3"))
1.4142135623730951 + 1.4422495703074083im
julia> showall(x)
1.4142135623730950488016887242096816 + 1.4422495703074083823216383107800998im
julia> y = acosh(x)
1.402873733241199 + 0.8555178360714634im
julia> x - cosh(y)
7.395570986446986e-32 + 0.0im
julia> using DoubleFloats
julia> x = sqrt(Double64(2)) / sqrt(Double64(6))
0.5773502691896257
julia> string(x)
"5.7735026918962576450914878050194151e-01"
julia> show(IOContext(Base.stdout,:compact=>false),x)
5.7735026918962576450914878050194151e-01
julia> showall(x)
0.5773502691896257645091487805019415
julia> showtyped(x)
Double64(0.5773502691896257, 3.3450280739356326e-17)
julia> showtyped(parse(Double64, stringtyped(x)))
Double64(0.5773502691896257, 3.3450280739356326e-17)
julia> Meta.parse(stringtyped(x))
:(Double64(0.5773502691896257, 3.3450280739356326e-17))
julia> x = ComplexDF32(sqrt(df32"2"), cbrt(df32"3"))
1.4142135 + 1.4422495im
julia> string(x)
"1.414213562373094 + 1.442249570307406im"
julia> stringtyped(x)
"ComplexD32(Double32(1.4142135, 2.4203233e-8), Double32(1.4422495, 3.3793125e-8))"
see https://juliamath.github.io/DoubleFloats.jl/stable/ for more information