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