1# -*- mode: perl; -*- 2 3use strict; 4use warnings; 5 6use Test::More tests => 12; 7 8use Math::BigFloat; 9 10use Math::Complex (); 11 12my $inf = $Math::Complex::Inf; 13my $nan = $inf - $inf; 14 15# Compute parameters for relative tolerance. 16# 17# $p is the precision, i.e., the number of bits in the mantissa/significand, as 18# defined in IEEE754. $eps is the smallest number that, when subtracted from 1, 19# gives a number smaller than 1. 20 21my $p = 0; 22my $eps = 1; 23while (((1 + $eps) - 1) != 0) { 24 $eps *= 0.5; 25 $p++; 26} 27my $reltol = 20 * $eps; 28 29############################################################################### 30# Check numify() on finite, floating point values. 31 32for my $entry 33 ( 34 [ 'Math::BigFloat -> new("+1234e+56") -> numify()', +1234e+56 ], 35 [ 'Math::BigFloat -> new("-1234e+56") -> numify()', -1234e+56 ], 36 [ 'Math::BigFloat -> new("+1234e-56") -> numify()', +1234e-56 ], 37 [ 'Math::BigFloat -> new("-1234e-56") -> numify()', -1234e-56 ], 38 [ 'Math::BigFloat -> bpi() -> numify()', atan2(0, -1) ], 39 ) 40{ 41 my ($test, $expected) = @$entry; 42 my $x = eval $test; 43 die $@ if $@; 44 45 my $abserr = $x - $expected; 46 my $relerr = $abserr / $expected; 47 if (abs($relerr) <= $reltol) { 48 pass($test); 49 } else { 50 fail($test); 51 diag(<<EOF); 52 got: $x 53 expected: $expected 54 abs. err.: $abserr 55 rel. err.: $relerr 56 rel. tol.: $reltol 57EOF 58 } 59} 60 61############################################################################### 62# Verify that numify() underflows and overflows when given "extreme" values. 63 64# positive overflow 65cmp_ok(Math::BigFloat -> new("1e9999") -> numify(), "==", $inf, 66 qq|Math::BigFloat -> new("1e9999") -> numify()|); 67 68# negative overflow 69cmp_ok(Math::BigFloat -> new("-1e9999") -> numify(), "==", -$inf, 70 qq|Math::BigFloat -> new("-1e9999") -> numify()|); 71 72# positive underflow 73cmp_ok(Math::BigFloat -> new("1e-9999") -> numify(), "==", 0, 74 qq|Math::BigFloat -> new("1e-9999") -> numify()|); 75 76# negative underflow 77cmp_ok(Math::BigFloat -> new("-1e-9999") -> numify(), "==", 0, 78 qq|Math::BigFloat -> new("-1e-9999") -> numify()|); 79 80############################################################################### 81# Check numify on non-finite objects. 82 83is(Math::BigFloat -> binf("+") -> numify(), $inf, "numify of +Inf"); 84is(Math::BigFloat -> binf("-") -> numify(), -$inf, "numify of -Inf"); 85is(Math::BigFloat -> bnan() -> numify(), $nan, "numify of NaN"); 86