Skip to content

Commit bb8a801

Browse files
Merge pull request #19373 from JuliaLang/sb/ndigits
fix overflow in ndigits0z
2 parents 2caf6a4 + 8809796 commit bb8a801

File tree

2 files changed

+20
-18
lines changed

2 files changed

+20
-18
lines changed

base/intfuncs.jl

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -314,8 +314,6 @@ function ndigits0z(x::UInt128)
314314
end
315315
ndigits0z(x::Integer) = ndigits0z(unsigned(abs(x)))
316316

317-
const ndigits_max_mul = Core.sizeof(Int) == 4 ? 69000000 : 290000000000000000
318-
319317
function ndigits0znb(n::Signed, b::Int)
320318
d = 0
321319
while n != 0
@@ -326,23 +324,24 @@ function ndigits0znb(n::Signed, b::Int)
326324
end
327325

328326
function ndigits0z(n::Unsigned, b::Int)
327+
b < 0 && return ndigits0znb(signed(n), b)
328+
b == 2 && return sizeof(n)<<3 - leading_zeros(n)
329+
b == 8 && return (sizeof(n)<<3 - leading_zeros(n) + 2) ÷ 3
330+
b == 16 && return sizeof(n)<<1 - leading_zeros(n)>>2
331+
b == 10 && return ndigits0z(n)
332+
329333
d = 0
330-
if b < 0
331-
d = ndigits0znb(signed(n), b)
332-
else
333-
b == 2 && return (sizeof(n)<<3-leading_zeros(n))
334-
b == 8 && return div((sizeof(n)<<3)-leading_zeros(n)+2,3)
335-
b == 16 && return (sizeof(n)<<1)-(leading_zeros(n)>>2)
336-
b == 10 && return ndigits0z(n)
337-
while ndigits_max_mul < n
338-
n = div(n,b)
339-
d += 1
340-
end
341-
m = 1
342-
while m <= n
343-
m *= b
344-
d += 1
345-
end
334+
while n > typemax(Int)
335+
n = div(n,b)
336+
d += 1
337+
end
338+
n = div(n,b)
339+
d += 1
340+
341+
m = 1
342+
while m <= n
343+
m *= b
344+
d += 1
346345
end
347346
return d
348347
end

test/intfuncs.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ let n = rand(Int)
8989
end
9090
@test ndigits(Int8(5)) == ndigits(5)
9191

92+
# issue #19367
93+
@test ndigits(Int128(2)^64, 256) == 9
94+
9295
@test bin('3') == "110011"
9396
@test bin('3',7) == "0110011"
9497
@test bin(3) == "11"

0 commit comments

Comments
 (0)