File tree 2 files changed +20
-18
lines changed
2 files changed +20
-18
lines changed Original file line number Diff line number Diff line change @@ -314,8 +314,6 @@ function ndigits0z(x::UInt128)
314
314
end
315
315
ndigits0z (x:: Integer ) = ndigits0z (unsigned (abs (x)))
316
316
317
- const ndigits_max_mul = Core. sizeof (Int) == 4 ? 69000000 : 290000000000000000
318
-
319
317
function ndigits0znb (n:: Signed , b:: Int )
320
318
d = 0
321
319
while n != 0
@@ -326,23 +324,24 @@ function ndigits0znb(n::Signed, b::Int)
326
324
end
327
325
328
326
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
+
329
333
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
346
345
end
347
346
return d
348
347
end
Original file line number Diff line number Diff line change @@ -89,6 +89,9 @@ let n = rand(Int)
89
89
end
90
90
@test ndigits (Int8 (5 )) == ndigits (5 )
91
91
92
+ # issue #19367
93
+ @test ndigits (Int128 (2 )^ 64 , 256 ) == 9
94
+
92
95
@test bin (' 3' ) == " 110011"
93
96
@test bin (' 3' ,7 ) == " 0110011"
94
97
@test bin (3 ) == " 11"
You can’t perform that action at this time.
0 commit comments