This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade Math::BigInt from 1.999701 to 1.999704
[perl5.git] / cpan / Math-BigInt / t / blog-mbi.t
1 #!perl
2
3 BEGIN {
4     unless ($ENV{AUTHOR_TESTING}) {
5         require Test::More;
6         Test::More::plan(skip_all => 'these tests are for release candidate testing');
7     }
8 }
9
10 use strict;
11 use warnings;
12
13 use Test::More tests => 97;
14 use Scalar::Util qw< refaddr >;
15
16 my $class;
17
18 BEGIN { $class = 'Math::BigInt'; }
19 BEGIN { use_ok($class) }
20
21 while (<DATA>) {
22     s/\s+\z//;
23     next if /^#/ || ! /\S/;
24
25     # $in0 - the x value
26     # $in1 - the base
27     # $out0 - the wanted output value
28     # $type - the type of the wanted number (real, non-real, ...)
29     # $expr - mathematical expression of the wanted number
30
31     my ($in0, $in1, $out0, $type, $expr) = split /:/;
32
33     # Some of the test data use rational numbers.
34     # - with Math::BigInt, we skip them
35     # - with Math::BigFloat, we convert them to floats
36     # - with Math::BigRat, we use them as they are
37
38     next if ($in0  =~ m|/| ||
39              $in1  =~ m|/| ||
40              $out0 =~ m|/|);
41
42     my ($x, $y);        # input values as objects
43     my ($yo);           # copy of input value
44     my ($got);          # test output
45
46     my $test = qq|\$x = $class -> new("$in0"); | .
47                qq|\$y = $class -> new("$in1"); | .
48                qq|\$yo = \$y -> copy(); | .
49                qq|\$got = \$x -> blog(\$y);|;
50
51     my $desc = "logarithm of $in0 to base $in1";
52
53     print("#\n",
54           "# Now about to execute the following test.\n",
55           "#\n",
56           "# $test\n",
57           "#\n");
58
59     if ($in0 ne 'NaN' && $in1 ne 'NaN') {
60         print("# Enter log($in1, $in0) into Wolfram Alpha",
61               " (http://www.wolframalpha.com/), and it says that the result",
62               " is ", length($type) ? $type : "real",
63               length($expr) ? ": $expr" : "",
64               ".", "\n",
65               "#\n");
66     }
67
68     eval $test;
69     die $@ if $@;       # this should never happen
70
71     subtest $desc, sub {
72         plan tests => 5,
73
74         # Check output.
75
76         is(ref($got), $class, "output arg is a $class");
77         is($got, $out0, 'output arg has the right value');
78         is(refaddr($got), refaddr($x), 'output arg is the invocand');
79
80         # The second argument (if the invocand is the first) shall *not* be
81         # modified.
82
83         is(ref($y), $class, "second input arg is still a $class");
84         is_deeply($y, $yo, 'second output arg is unmodified');
85
86     };
87
88 }
89
90 __END__
91
92 # base = -inf
93
94 -inf:-inf:NaN:undefined:
95 -4:-inf:0::
96 -2:-inf:0::
97 -1:-inf:0::
98 -1/2:-inf:0::
99 0:-inf:NaN:undefined:
100 1/2:-inf:0::
101 1:-inf:0::
102 2:-inf:0::
103 4:-inf:0::
104 inf:-inf:NaN:undefined:
105 NaN:-inf:NaN:undefined:
106
107 # base = -4
108
109 -4:-4:1::
110 -2:-4:NaN:non-real and finite:(log(2)+i pi)/(log(4)+i pi)
111 0:-4:NaN:non-real (directed) infinity:(-sqrt(pi^2+log^2(4))/(log(4)+i pi))infinity
112 1/2:-4:NaN:non-real and finite:-(log(2))/(log(4)+i pi)
113 1:-4:0::
114 2:-4:NaN:non-real and finite:(log(2))/(log(4)+i pi)
115 4:-4:NaN:non-real and finite:(log(4))/(log(4)+i pi)
116 NaN:-4:NaN:undefined:
117
118 # base = -2
119
120 -inf:-2:NaN:non-real (directed) infinity:sqrt(pi^2+log^2(2))/(log(2)+i pi)infinity
121 -4:-2:NaN:non-real and finite:(log(4)+i pi)/(log(2)+i pi)
122 -2:-2:1::
123 -1:-2:NaN:non-real and finite:(i pi)/(log(2)+i pi)
124 -1/2:-2:NaN:non-real and finite:(-log(2)+i pi)/(log(2)+i pi)
125 0:-2:NaN:complex infinity:
126 1/2:-2:NaN:non-real and finite:-(log(2))/(log(2)+i pi)
127 1:-2:0::
128 2:-2:NaN:non-real and finite:(log(2))/(log(2)+i pi)
129 4:-2:NaN:non-real and finite:(log(4))/(log(2)+i pi)
130 inf:-2:NaN:non-real (directed) infinity:
131 NaN:-2:NaN:undefined:
132
133 # base = -1
134
135 -inf:-1:NaN:non-real (directed) infinity:
136 -4:-1:NaN:non-real and finite:-(i (log(4)+i pi))/pi
137 -2:-1:NaN:non-real and finite:-(i (log(2)+i pi))/pi
138 -1:-1:1::
139 -1/2:-1:NaN:non-real and finite:-(i (-log(2)+i pi))/pi
140 0:-1:NaN:complex infinity:
141 1:-1:0::
142 1/2:-1:NaN:non-real and finite:(i log(2))/pi
143 2:-1:NaN:non-real and finite:-(i log(2))/pi
144 4:-1:NaN:non-real and finite:-(i log(4))/pi
145 inf:-1:NaN:non-real (directed) infinity:
146 NaN:-1:NaN:undefined:
147
148 # base = -1/2
149
150 -inf:-1/2:NaN:non-real (directed) infinity:
151 -4:-1/2:NaN:non-real and finite:(log(4)+i pi)/(-log(2)+i pi)
152 -2:-1/2:NaN:non-real and finite:(log(2)+i pi)/(-log(2)+i pi)
153 -1:-1/2:NaN:non-real and finite:(i pi)/(-log(2)+i pi)
154 -1/2:-1/2:1::
155 0:-1/2:NaN:complex infinity:
156 1:-1/2:0::
157 1/2:-1/2:NaN:non-real and finite:-(log(2))/(-log(2)+i pi)
158 2:-1/2:NaN:non-real and finite:(log(2))/(-log(2)+i pi)
159 4:-1/2:NaN:non-real and finite:(log(4))/(-log(2)+i pi)
160 inf:-1/2:NaN:non-real (directed) infinity:
161 NaN:-1/2:NaN:undefined:
162
163 # base = 0
164
165 -inf:0:NaN:undefined:
166 -4:0:0::
167 -2:0:0::
168 -1:0:0::
169 -1/2:0:0::
170 0:0:NaN:undefined:
171 1/2:0:0::
172 1:0:0::
173 2:0:0::
174 4:0:0::
175 inf:0:NaN:undefined:
176 NaN:0:NaN:undefined:
177
178 # base = 1/2
179
180 -inf:1/2:-inf::
181 -2:-1/2:NaN:non-real and finite:(log(2)+i pi)/(-log(2)+i pi)
182 -1:1/2:NaN:non-real and finite:-(i pi)/(log(2))
183 -1/2:1/2:NaN:non-real and finite:-(-log(2)+i pi)/(log(2))
184 0:1/2:inf::
185 1/2:1/2:1::
186 1:1/2:0::
187 2:1/2:-1::
188 inf:1/2:-inf::
189 NaN:1/2:NaN:undefined:
190
191 # base = 1
192
193 -inf:1:NaN:complex infinity:
194 -4:1:NaN:complex infinity:
195 -2:1:NaN:complex infinity:
196 -1:1:NaN:complex infinity:
197 -1/2:1:NaN:complex infinity:
198 0:1:NaN:complex infinity:
199 1/2:1:NaN:complex infinity:
200 1:1:NaN:undefined:
201 2:1:NaN:complex infinity:
202 4:1:NaN:complex infinity:
203 inf:1:NaN:complex infinity:
204 NaN:1:NaN:undefined:
205
206 # base = 2
207
208 -inf:2:inf::
209 -4:2:NaN:non-real and finite:(log(4)+i pi)/(log(2))
210 -2:2:NaN:non-real and finite:(log(2)+i pi)/(log(2))
211 -1:2:NaN:non-real and finite:(i pi)/(log(2))
212 -1/2:2:NaN:non-real and finite:(-log(2)+i pi)/(log(2))
213 0:2:-inf::
214 1/2:2:-1::
215 1:2:0::
216 2:2:1::
217 4:2:2::
218 4:4:1::
219 inf:2:inf::
220 NaN:2:NaN:undefined:
221
222 # base = 4
223
224 -inf:4:inf::
225 -4:4:NaN:non-real and finite:(log(4)+i pi)/(log(4))
226 -2:4:NaN:non-real and finite:(log(2)+i pi)/(log(4))
227 -1/2:4:NaN:non-real and finite:(-log(2)+i pi)/(log(4))
228 0:4:-inf::
229 1:4:0::
230 1/2:4:-1/2::
231 2:4:1/2::
232 4:4:1::
233 inf:4:inf::
234 NaN:4:NaN:undefined:
235
236 # base = inf
237
238 -inf:inf:NaN:undefined:
239 -4:inf:0::
240 -2:inf:0::
241 -1:inf:0::
242 -1/2:inf:0::
243 0:inf:NaN:undefined:
244 1:inf:0::
245 1/2:inf:0::
246 2:inf:0::
247 4:inf:0::
248 inf:inf:NaN:undefined:
249 NaN:inf:NaN:undefined:
250
251 # base is NaN
252
253 -inf:NaN:NaN:undefined:
254 -4:NaN:NaN:undefined:
255 -2:NaN:NaN:undefined:
256 -1:NaN:NaN:undefined:
257 -1/2:NaN:NaN:undefined:
258 0:NaN:NaN:undefined:
259 1:NaN:NaN:undefined:
260 1/2:NaN:NaN:undefined:
261 2:NaN:NaN:undefined:
262 4:NaN:NaN:undefined:
263 inf:NaN:NaN:undefined:
264 NaN:NaN:NaN:undefined: