The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

use strict;
use Math::FakeDD qw(:all);
my $obj1 = Math::FakeDD->new(8);
my $obj2 = Math::FakeDD->new(0.125);
my $obj3 = dd_add($obj1, $obj2);
my $obj4 = $obj1 + $obj2;
cmp_ok(dd_add('1.3', Math::FakeDD->new('9.1')), '==',
dd_add(Math::FakeDD->new('9.1'), '1.3'), '1: commutativity holds');
cmp_ok('1.3' + Math::FakeDD->new('9.1'), '==',
Math::FakeDD->new('9.1') + '1.3', '2: commutativity holds');
cmp_ok(dd_add(0.125, 8), '==' , $obj1 + $obj2, "1: additions match");
cmp_ok(Math::FakeDD->new(8.125), '==', $obj3 , "2: additions match");
cmp_ok($obj4, '==' , $obj3 , "3: additions match");
$obj3 += '0.125';
$obj4 += $obj2;
cmp_ok($obj3, '==', $obj4, '1: += ok');
dd_add_eq($obj3, '0.125');
cmp_ok($obj3, '==', Math::FakeDD->new(8.375), '2: += ok');
my $dbl_max = Math::MPFR::Rmpfr_get_d(Math::MPFR->new('1.fffffffffffffp+1023', 16), 0);
$obj1 = Math::FakeDD->new($dbl_max);
cmp_ok(dd_is_inf($obj1), '==', 0, "DBL_MAX is not an Inf");
$obj2 = $obj1 + (2 ** 970);
cmp_ok(dd_is_inf($obj2) , '!=', 0, "addition (+) results in Inf");
$obj1 += 2 ** 970;
cmp_ok(dd_is_inf($obj1) , '!=', 0, "addition (+=) results in Inf");
$obj1 = Math::FakeDD->new(-$dbl_max);
cmp_ok(dd_is_inf($obj1), '==', 0, "-DBL_MAX is not an Inf");
$obj2 = $obj1 - (2 ** 970);
cmp_ok($obj2, '==', dd_inf(-1), "subtraction (-) results in -Inf");
$obj1 -= 2 ** 970;
cmp_ok($obj1, '==', dd_inf(-1), "subtraction (-=) results in -Inf");
done_testing();