diff --git a/base/intfuncs.jl b/base/intfuncs.jl index 42ffc46046823..ab6bd06fe888a 100644 --- a/base/intfuncs.jl +++ b/base/intfuncs.jl @@ -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 @@ -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 diff --git a/test/intfuncs.jl b/test/intfuncs.jl index 6b250ffb80e2c..190a4fc88a273 100644 --- a/test/intfuncs.jl +++ b/test/intfuncs.jl @@ -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"