Skip to content

Commit

Permalink
Fix a case in Number parse where Inf was being returned when we want …
Browse files Browse the repository at this point in the history
…to promote to BigFloat (#163)
  • Loading branch information
quinnj authored Mar 4, 2023
1 parent 3168843 commit 4548856
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 11 deletions.
40 changes: 29 additions & 11 deletions src/floats.jl
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ end
code |= INVALID
x = f === nothing ? x : nothing
else
x = scale(T, FT, digits, -signed(frac), neg, f)
x, code = scale(T, FT, digits, -signed(frac), neg, code, f)
code |= OK | EOF
end
@goto done
Expand Down Expand Up @@ -407,7 +407,7 @@ end
x = f === nothing ? x : nothing
@goto done
else
x = scale(T, FT, digits, -signed(frac), neg, f)
x, code = scale(T, FT, digits, -signed(frac), neg, code, f)
end
else
x = handlef(ifelse(neg, -T(digits), T(digits)), f)
Expand Down Expand Up @@ -438,7 +438,7 @@ end
code |= INVALID
x = f === nothing ? x : nothing
else
x = scale(T, FT, digits, ee, neg, f)
x, code = scale(T, FT, digits, ee, neg, code, f)
code |= OK | EOF
end
@goto done
Expand All @@ -451,7 +451,7 @@ end
code |= INVALID
x = f === nothing ? x : nothing
else
x = scale(T, FT, digits, ifelse(negexp, -signed(exp), signed(exp)) - signed(frac), neg, f)
x, code = scale(T, FT, digits, ifelse(negexp, -signed(exp), signed(exp)) - signed(frac), neg, code, f)
code |= OK
end
@goto done
Expand Down Expand Up @@ -487,19 +487,37 @@ pow10(::Type{BigFloat}, e) = (@inbounds v = F64_SHORT_POWERS[e+1]; return v)
_unsigned(x::BigInt) = x
_unsigned(x) = unsigned(x)

@inline function scale(::Type{T}, FT::FloatType, v, exp, neg, f::F) where {T, F}
@inline function scale(::Type{T}, FT::FloatType, v, exp, neg, code, f::F) where {T, F}
if T === Float64
return handlef(__scale(Float64, _unsigned(v), exp, neg), f)
return handlef(__scale(Float64, _unsigned(v), exp, neg), f), code
elseif T === Float32
return handlef(__scale(Float32, _unsigned(v), exp, neg), f)
return handlef(__scale(Float32, _unsigned(v), exp, neg), f), code
elseif T === Float16
return handlef(__scale(Float16, _unsigned(v), exp, neg), f)
return handlef(__scale(Float16, _unsigned(v), exp, neg), f), code
elseif FT == FLOAT64
return handlef(__scale(Float64, _unsigned(v), exp, neg), f)
f64 = __scale(Float64, _unsigned(v), exp, neg)
if isfinite(f64)
return handlef(f64, f), code
else
code |= INVALID
return nothing, code
end
elseif FT == FLOAT32
return handlef(__scale(Float32, _unsigned(v), exp, neg), f)
f32 = __scale(Float32, _unsigned(v), exp, neg)
if isfinite(f32)
return handlef(f32, f), code
else
code |= INVALID
return nothing, code
end
elseif FT == FLOAT16
return handlef(__scale(Float16, _unsigned(v), exp, neg), f)
f16 = __scale(Float16, _unsigned(v), exp, neg)
if isfinite(f16)
return handlef(f16, f), code
else
code |= INVALID
return nothing, code
end
else
error("invalid float type for scale: `$T`")
end
Expand Down
1 change: 1 addition & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -748,6 +748,7 @@ end
@test Parsers.parse(Number, "170141183460469231731687303715884105728") == 170141183460469231731687303715884105728
# BigFloat promotion
@test Parsers.parse(Number, "1e310") == Base.parse(BigFloat, "1e310")
@test Parsers.parse(Number, "1.7976931348623157e310") == big"1.7976931348623157e310"
end

# https://github.com/JuliaData/CSV.jl/issues/1063
Expand Down

0 comments on commit 4548856

Please sign in to comment.