The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use strict;
use Math::Decimal64 qw(:all);
print "1..6\n";
my $inf = InfD64(-1);
my $nan = NaND64();
if(int($inf) == $inf && is_InfD64(int($inf))){print "ok 1\n"}
else {print "not ok 1\n"}
if($nan != int($nan) && is_NaND64(int($nan))) {print "ok 2\n"}
else {print "not ok 2\n"}
my $ok = 1;
for my $size(1 .. 16) {
for my $prec(0 .. 369) {
for my $eg(1 .. 4) {
my $man = rand_x($size);
$man = '-' . $man if ($eg % 2);
my $d64 = Math::Decimal64->new($man, $prec);
if($d64 != int($d64)) {
warn "\$d64: $d64\nint(\$d64): ", int($d64), "\n";
$ok = 0;
}
}
}
}
if($ok) {print "ok 3\n"}
else {print "not ok 3\n"}
$ok = 1;
my $z = ZeroD64(1);
for my $size(1 .. 16) {
for my $prec(-383 .. -$size) {
for my $eg(1 .. 4) {
my $man = rand_x($size);
if($man =~ /^\-/) {$man =~ s/\-//}
else {$man = '-' . $man}
my $d64 = Math::Decimal64->new($man, $prec);
if($z != int($d64)) {
warn "\$d64: $d64\nint(\$d64): ", int($d64), "\n";
$ok = 0;
}
}
}
}
if($ok) {print "ok 4\n"}
else {print "not ok 4\n"}
$ok = 1;
my $man = '1234567890123456';
my $exp = 0;
my $d64 = MEtoD64($man, $exp);
my $div = MEtoD64(-10,0);
for my $s(1 .. 16) {
$d64 /= $div;
chop $man;
$man = '0' if (!$man || $man eq '-');
if($man =~ /^\-/) {$man =~ s/\-//}
else {$man = '-' . $man}
if(int($d64) != MEtoD64($man, 0)) {
$ok = 0;
warn "int(\$d64): ", int($d64), "\nMEtoD64(\$man, 0): ", MEtoD64($man, 0), "\n";
}
}
if($ok) {print "ok 5\n"}
else {print "not ok 5\n"}
if($d64 != MEtoD64('1234567890123456', -16) || $man != 0) {
warn "\$d64: $d64\n\$man: $man\n";
print "not ok 6\n";
}
else {print "ok 6\n"}
sub rand_x {
if($_[0] > 16 || $_[0] < 0) {die "rand_x() given bad value"}
my $ret;
for(1 ..$_[0]) {$ret .= int(rand(10))}
return $ret;
}