This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Test 9**9**9 for Inf and sin(9**9**9) for NaN.
[perl5.git] / t / op / infnan.t
1 #!./perl
2
3 BEGIN {
4     chdir 't' if -d 't';
5     @INC = '../lib';
6     require './test.pl';
7 }
8
9 my $PInf = "Inf"  + 0;
10 my $NInf = "-Inf" + 0;
11 my $NaN  = "NaN"  + 0;
12
13 my @PInf = ("Inf", "inf", "INF", "Infinity", "INFINITY",
14             "1.#INF", "1#INF");
15 my @NInf = map { "-$_" } @PInf;
16
17 my @NaN = ("NAN", "nan", "qnan", "SNAN", "NanQ", "NANS",
18            "1.#QNAN", "1#SNAN", "1.#NAN", "1#IND",
19            "NaN123", "NAN(123)", "nan%",
20            "nanonano"); # RIP, Robin Williams.
21
22 my $inf_tests = 6 + 6 * @PInf + 5;
23 my $nan_tests = 5 + 2 * @NaN + 3;
24 my $infnan_tests = 4;
25
26 plan tests => $inf_tests + $nan_tests + $infnan_tests;
27
28 my $has_inf;
29 my $has_nan;
30
31 SKIP: {
32   if ($PInf == 1 && $NINf == 1) {
33     skip $inf_tests, "no infinity found";
34   }
35
36   $has_inf = 1;
37
38   ok($PInf > 0, "positive infinity");
39   ok($NInf < 0, "negative infinity");
40
41   is($PInf,  "Inf", "$PInf value stringifies as Inf");
42   is($NInf, "-Inf", "$PInf value stringifies as -Inf");
43
44   is(sprintf("%g", $PInf), "Inf", "$PInf sprintf %g is Inf");
45   is(sprintf("%a", $PInf), "Inf", "$PInf sprintf %a is Inf");
46
47   for my $i (@PInf) {
48     is($i + 0, $PInf, "$i is +Inf");
49     ok($i > 0, "$i is positive");
50     is("@{[$i+0]}", "Inf", "$i value stringifies as Inf");
51   }
52
53   for my $i (@NInf) {
54     is($i + 0, $NInf, "$i is -Inf");
55     ok($i < 0, "$i is negative");
56     is("@{[$i+0]}", "-Inf", "$i value stringifies as -Inf");
57   }
58
59   is($PInf + $PInf, $PInf, "+inf plus +inf is +inf");
60   is($NInf + $NInf, $NInf, "-inf plus -inf is -inf");
61
62   is(1/$PInf, 0, "one per +Inf is zero");
63   is(1/$NInf, 0, "one per -Inf is zero");
64
65   is(9**9**9, $PInf, "9**9**9 is +Inf");
66 }
67
68 SKIP: {
69   if ($NaN == 1) {
70     skip $nan_tests, "no nan found";
71   }
72
73   $has_nan = 1;
74
75   ok($NaN != $NaN, "nan is not nan numerically");
76   ok($NaN eq $NaN, "nan is nan stringifically");
77
78   is("$NaN", "NaN", "$NaN value stringies as NaN");
79
80   is(sprintf("%g", $NaN), "NaN", "$NaN sprintf %g is NaN");
81   is(sprintf("%a", $NaN), "NaN", "$NaN sprintf %a is Inf");
82
83   for my $i (@NaN) {
84     cmp_ok($i + 0, '!=', $i + 0, "$i is nan");
85     is("@{[$i+0]}", "NaN", "$i value stringifies as NaN");
86   }
87
88   # is() okay with $NaN because eq is used.
89   is($NaN * 0, $NaN, "NaN times zero is NaN");
90   is($NaN * 2, $NaN, "NaN times two is NaN");
91
92   is(sin(9**9**9), $NaN, "sin(9**9**9) is NaN");
93 }
94
95 SKIP: {
96   unless ($has_inf && $has_nan) {
97     skip $infnan_tests, "no both inf and nan";
98   }
99
100   # is() okay with $NaN because eq is used.
101   is($PInf * 0,     $NaN, "inf times zero is nan");
102   is($PInf * $NaN,  $NaN, "inf times nan is nan");
103   is($PInf + $NaN,  $NaN, "inf plus nan is nan");
104   is($PInf - $PInf, $NaN, "inf minus inf is nan");
105 }