That's tricky: for a number that doesn't fit in UV (integer), Perl automatically stores it in NV (double) which can result in an immediate loss of precision. For my system build (5.26.1 for Ubuntu) the first integer that gets stored as a double distinguishable from ~0 is 18446744073709554600 (which has actually been stored in NV as 2^64 + 2^12):
% perl -E 'say "ok" if 18446744073709554600 > ~0'
ok
% perl -E 'say "ok" if 18446744073709554599 > ~0'
%
This is a bit baffling.
With perl-5.36.0, ivsize == 8, and nvtype eq 'double', it's looking to me that the "first integer that gets stored as a double distinguishable from ~0 is" 18446744073709553665:
>perl -E "say 'ok' if 18446744073709553665 > ~0"
ok
>perl -E "say 'ok' if 18446744073709553664 > ~0"
>
Am I overlooking a bug in perl-5.26.1 ? Or is there something else going on that I've missed ?
For me, 18446744073709554599 is correctly evaluated as being greater than ~0 :
>perl -E "say 'ok' if 18446744073709554599 > ~0"
ok
>
Cheers,
Rob