Data-Float

 view release on metacpan or  search on metacpan

t/nextafter.t  view on Meta::CPAN

sub zpat($) { my($z) = @_; my $nz = -$z; sprintf("%+.f%+.f%+.f",$z,$nz,-$nz) }
my($za, $zb, $r);

if(have_signed_zero) {
	$za = +0.0; $zb = +0.0; $r = nextafter($za, $zb);
	is zpat($za), "+0-0+0"; is zpat($zb), "+0-0+0";
	is zpat($r), "+0-0+0"; ok $r == 0;
	$za = -0.0; $zb = +0.0; $r = nextafter($za, $zb);
	is zpat($za), "-0+0-0"; is zpat($zb), "+0-0+0";
	is zpat($r), "+0-0+0"; ok $r == 0;
	$za = +0.0; $zb = -0.0; $r = nextafter($za, $zb);
	is zpat($za), "+0-0+0"; is zpat($zb), "-0+0-0";
	is zpat($r), "-0+0-0"; ok $r == 0;
	$za = -0.0; $zb = -0.0; $r = nextafter($za, $zb);
	is zpat($za), "-0+0-0"; is zpat($zb), "-0+0-0";
	is zpat($r), "-0+0-0"; ok $r == 0;
} else {
	$za = 0; $zb = 0; $r = nextafter($za, $zb);
	is zpat($za), "+0+0+0"; is zpat($zb), "+0+0+0";
	is zpat($r), "+0+0+0"; ok $r == 0;
	SKIP: { skip "no signed zero", 12; }
}

$za = +0.0; ok nextup(   $za)     == +min_finite(); is zpat($za), zpat(+0.0);
$za = +0.0; ok nextafter($za, +9) == +min_finite(); is zpat($za), zpat(+0.0);
$za = +0.0; ok nextdown( $za)     == -min_finite(); is zpat($za), zpat(+0.0);
$za = +0.0; ok nextafter($za, -9) == -min_finite(); is zpat($za), zpat(+0.0);
SKIP: {
	skip "negative zero not available", 8 unless have_signed_zero;
	$za = -0.0; ok nextup(   $za)     == +min_finite();
	is zpat($za), zpat(-0.0);
	$za = -0.0; ok nextafter($za, +9) == +min_finite();
	is zpat($za), zpat(-0.0);
	$za = -0.0; ok nextdown( $za)     == -min_finite();
	is zpat($za), zpat(-0.0);
	$za = -0.0; ok nextafter($za, -9) == -min_finite();
	is zpat($za), zpat(-0.0);
}

$r = nextup(   -min_finite());     is zpat($r), zpat(-0.0); ok $r == 0.0;
$r = nextafter(-min_finite(), +9); is zpat($r), zpat(-0.0); ok $r == 0.0;
$r = nextdown( +min_finite());     is zpat($r), zpat(+0.0); ok $r == 0.0;
$r = nextafter(+min_finite(), -9); is zpat($r), zpat(+0.0); ok $r == 0.0;

SKIP: {
	skip "infinities not available", 8 unless have_infinite;
	no strict "refs";
	my $pinf = &{"Data::Float::pos_infinity"};
	my $ninf = &{"Data::Float::neg_infinity"};
	ok nextup(   +max_finite())        == $pinf;
	ok nextafter(+max_finite(), $pinf) == $pinf;
	ok nextdown( -max_finite())        == $ninf;
	ok nextafter(-max_finite(), $ninf) == $ninf;
	ok nextup(   $ninf)        == -max_finite();
	ok nextafter($ninf, $pinf) == -max_finite();
	ok nextdown( $pinf)        == +max_finite();
	ok nextafter($pinf, $ninf) == +max_finite();
}

SKIP: {
	skip "NaN not available", 5 unless have_nan;
	no strict "refs";
	my $nan = &{"Data::Float::nan"};
	ok float_is_nan(nextup($nan));
	ok float_is_nan(nextdown($nan));
	ok float_is_nan(nextafter($nan, +9));
	ok float_is_nan(nextafter(+1.2, $nan));
	ok float_is_nan(nextafter($nan, $nan));
}

1;



( run in 0.590 second using v1.01-cache-2.11-cpan-39bf76dae61 )