Skip to content

Commit

Permalink
fix overflow in ndigits0z
Browse files Browse the repository at this point in the history
Fixes issue JuliaLang#19367
  • Loading branch information
simonbyrne authored and fcard committed Feb 28, 2017
1 parent 0ed555c commit 5042fcb
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 18 deletions.
35 changes: 17 additions & 18 deletions base/intfuncs.jl
Original file line number Diff line number Diff line change
Expand Up @@ -314,8 +314,6 @@ function ndigits0z(x::UInt128)
end
ndigits0z(x::Integer) = ndigits0z(unsigned(abs(x)))

const ndigits_max_mul = Core.sizeof(Int) == 4 ? 69000000 : 290000000000000000

function ndigits0znb(n::Signed, b::Int)
d = 0
while n != 0
Expand All @@ -326,23 +324,24 @@ function ndigits0znb(n::Signed, b::Int)
end

function ndigits0z(n::Unsigned, b::Int)
b < 0 && return ndigits0znb(signed(n), b)
b == 2 && return (sizeof(n)<<3-leading_zeros(n))
b == 8 && return div((sizeof(n)<<3)-leading_zeros(n)+2,3)
b == 16 && return (sizeof(n)<<1)-(leading_zeros(n)>>2)
b == 10 && return ndigits0z(n)

d = 0
if b < 0
d = ndigits0znb(signed(n), b)
else
b == 2 && return (sizeof(n)<<3-leading_zeros(n))
b == 8 && return div((sizeof(n)<<3)-leading_zeros(n)+2,3)
b == 16 && return (sizeof(n)<<1)-(leading_zeros(n)>>2)
b == 10 && return ndigits0z(n)
while ndigits_max_mul < n
n = div(n,b)
d += 1
end
m = 1
while m <= n
m *= b
d += 1
end
while n > typemax(Int)
n = div(n,b)
d += 1
end
n = div(n,b)
d += 1

m = 1
while m <= n
m *= b
d += 1
end
return d
end
Expand Down
3 changes: 3 additions & 0 deletions test/intfuncs.jl
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ let n = rand(Int)
end
@test ndigits(Int8(5)) == ndigits(5)

# issue #19367
@test ndigits(Int128(2)^64, 256) == 9

@test bin('3') == "110011"
@test bin('3',7) == "0110011"
@test bin(3) == "11"
Expand Down

0 comments on commit 5042fcb

Please sign in to comment.