dzhang314 / MultiFloats.jl

Fast, SIMD-accelerated extended-precision arithmetic for Julia
MIT License
75 stars 10 forks source link

StackOverflowError using @printf #1

Closed GregPlowman closed 4 years ago

GregPlowman commented 4 years ago
using MultiFloats
using Printf
@printf("%f", Float64x2(3))
ERROR: StackOverflowError:
Stacktrace:
 [1] fix_dec(::MultiFloat{Float64,2}, ::Int64, ::Array{UInt8,1}) at .\printf.jl:987 (repeats 80000 times)

Probably similar to issue with DoubleFloats:

dzhang314 commented 4 years ago

Hey Greg, thanks for taking a look at my project! I'm also aware of the issue and working on a fix, forwarding Base.Printf calls for MultiFloat{T,N} through conversion to BigFloat, just like I've done with Base.show. This is kind of janky, but print performance isn't a very high priority for me, so for interactive use this ought to be sufficient.

GregPlowman commented 4 years ago

Here's a possible solution:

using MultiFloats
using Printf

import Printf: fix_dec, ini_dec

if VERSION < v"1.1"
    fix_dec(out, d::MultiFloat, flags::String, width::Int, precision::Int, c::Char) =
        fix_dec(out, BigFloat(d), flags, width, precision, c)

    ini_dec(out, d::MultiFloat, ndigits::Int, flags::String, width::Int, precision::Int, c::Char) =
        ini_dec(out, BigFloat(d), ndigits, flags, width, precision, c)
else
    fix_dec(out, d::MultiFloat, flags::String, width::Int, precision::Int, c::Char, digits) =
        fix_dec(out, BigFloat(d), flags, width, precision, c, digits)

    ini_dec(out, d::MultiFloat, ndigits::Int, flags::String, width::Int, precision::Int, c::Char, digits) =
        ini_dec(out, BigFloat(d), ndigits, flags, width, precision, c, digits)
end
dzhang314 commented 4 years ago

@GregPlowman Nice, thanks! There needs to be a little more logic involving renormalization and setprecision to ensure that no bits are lost in the conversion to BigFloat, but it looks like those are definitely the right functions to implement. I really appreciate the tip about Julia versions, by the way -- I probably wouldn't have caught that myself.

Would you like to be credited in any way besides a mention in this comment?

GregPlowman commented 4 years ago

Just updated to new version. All looks good. Thanks for fixing this, and fast response. (Please, no need for credit/mention)