The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use warnings;
use strict;
use Math::Decimal64 qw(:all);

print "1..18\n";

my($man, $exp);

my $minus_one = Math::Decimal64->new(-1, 0);

my $max = Math::Decimal64->new('9999999999999999', 369);

if(!is_InfD64($max)) {print "ok 1\n"}
else {
  warn "\n\$max: $max\n";
  print "not ok 1\n";
}

my $min = Math::Decimal64->new('-9999999999999999', 369);

if(!is_InfD64($min)) {print "ok 2\n"}
else {
  warn "\n\$min: $min\n";
  print "not ok 2\n";
}

if($max * $minus_one == $min && -$max == $min && -$min == $max) {print "ok 3\n"}
else {print "not ok 3\n"}

($man, $exp) = D64toME($max);

if($man eq '9999999999999999' && $exp == 369) {print "ok 4\n"}
else {
  warn "\$man: $man\n\$exp: $exp\n";
  print "not ok 4\n";
}

($man, $exp) = D64toME($min);

if($man eq '-9999999999999999' && $exp == 369) {print "ok 5\n"}
else {
  warn "\$man: $man\n\$exp: $exp\n";
  print "not ok 5\n";
}

my $smallest_pos = Math::Decimal64->new(1, -398);
($man, $exp) = D64toME($smallest_pos);

if($man == 1 && $exp == -398){print "ok 6\n"}
else {
  warn "\$man: $man\n\$exp: $exp\n";
  print "not ok 6\n";
}

my $biggest_neg = Math::Decimal64->new(-1, -398);
($man, $exp) = D64toME($biggest_neg);

if($man == -1 && $exp == -398){print "ok 7\n"}
else {
  warn "\$man: $man\n\$exp: $exp\n";
  print "not ok 7\n";
}

my $zero = Math::Decimal64->new(0, 0);

if(is_ZeroD64($zero) > 0) {print "ok 8\n"}
else {print "not ok 8\n"}

($man, $exp) = D64toME($zero);

if($man eq '0' && $exp eq '0'){print "ok 9\n"}
else {
  warn "\$man: $man\n\$exp: $exp\n";
  print "not ok 9\n";
}

$zero *= $minus_one;

if(is_ZeroD64($zero) < 0) {print "ok 10\n"}
else {print "not ok 10\n"}

($man, $exp) = D64toME($zero);

if($man eq '-0' && $exp eq '0'){print "ok 11\n"}
else {
  warn "\$man: $man\n\$exp: $exp\n";
  print "not ok 11\n";
}

my $pos_test = Math::Decimal64::_testvalD64(1);
my $neg_test = Math::Decimal64::_testvalD64(-1);

($man, $exp) = D64toME($pos_test);
if($man eq '9307199254740993' && $exp == -15) {print "ok 12\n"}
else {print "not ok 12\n"}


($man, $exp) = D64toME($neg_test);
if($man eq '-9307199254740993' && $exp == -15) {print "ok 13\n"}
else {print "not ok 13\n"}

my $pos_check = Math::Decimal64->new('9307199254740993', -15);
if($pos_check == $pos_test) {print "ok 14\n"}
else {
  warn "\$pos_check: $pos_check\n";
  print "not ok 14\n";
}

my $neg_check = Math::Decimal64->new('-9307199254740993', -15);
if($neg_check == $neg_test) {print "ok 15\n"}
else {
  warn "\$neg_check: $neg_check\n";
  print "not ok 15\n";
}

my $pv_check = PVtoD64('-9307199254740993e-15');

if($pv_check == $neg_test) {print "ok 16\n"}
else {
 warn "\$pv_check: $pv_check\n";
 print "not ok 16\n";
}

my $shift = Exp10(-15);
my $cancel = Exp10(15);

if($shift * $cancel == UnityD64(1)){print "ok 17\n"}
else {
  warn "\$shift: $shift \$cancel: $cancel\n";
  print "not ok 17\n";
}

my $pv_check2 = PVtoD64('-9307199254740993');
$pv_check2 *= $shift;

if($pv_check2 == $neg_test) {print "ok 18\n"}
else {
 warn "\$pv_check2: $pv_check2\n";
 print "not ok 18\n";
}