Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

StackOverflowError using @printf #1

Closed
GregPlowman opened this issue Oct 28, 2019 · 4 comments
Closed

StackOverflowError using @printf #1

GregPlowman opened this issue Oct 28, 2019 · 4 comments

Comments

@GregPlowman
Copy link

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
Copy link
Owner

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
Copy link
Author

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
Copy link
Owner

@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
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants