int uv_fits_double(UV arg) {
if(arg < 9007199254740993)
return 1;
while(!(arg & 1)) {
arg >>= 1;
if(arg < 9007199254740993) return 1;
}
return 0;
}
####
sub uv_fits_double {
my $arg = shift;
return 1 if $arg < 9007199254740993;
while(!($arg & 1)) {
$arg >>= 1;
return 1 if $arg < 9007199254740993;
}
return 0;
}
##
##
use strict;
use warnings;
use Config;
die "This script not meant for this perl configuration"
unless $Config{ivsize} == $Config{nvsize};
# The integer value 2251799813685249 is
# representable exactly as a double.
# Therefore 2251799813685249 * (2 ** 10)
# is exactly representable as a double,
# since 10 is well within the allowable
# exponent range.
# 2251799813685249 * (2 ** 10) is also
# within the bounds of allowable integer
# values.
my $fits_d = 2305843009213694976; # 2251799813685249 * (2 ** 10)
my $no_fits_d = $fits_d + (2 ** 6);
print uv_fits_double(2251799813685249); # fits
print uv_fits_double($fits_d); # fits
print uv_fits_double($no_fits_d); # doesn't fit
print uv_fits_double($fits_d + (2 ** 15)); # fits
print "\n";
sub uv_fits_double {
my $arg = shift;
return 1 if $arg < 9007199254740993;
while(!($arg & 1)) {
$arg >>= 1;
return 1 if $arg < 9007199254740993;
}
return 0;
}
__END__
Should output 1101
The 4th value fits, even though it's greater
than the 3rd value (which doesn't fit).