xref: /openbsd-src/gnu/usr.bin/perl/cpan/Math-BigInt/t/bigrat.t (revision 5486feefcc8cb79b19e014ab332cc5dfd05b3b33)
1*5486feefSafresh1# -*- mode: perl; -*-
2*5486feefSafresh1
3*5486feefSafresh1use strict;
4*5486feefSafresh1use warnings;
5*5486feefSafresh1
6*5486feefSafresh1use Test::More tests => 203;
7*5486feefSafresh1
8*5486feefSafresh1# basic testing of Math::BigRat
9*5486feefSafresh1
10*5486feefSafresh1use Math::BigRat;
11*5486feefSafresh1use Math::BigInt;
12*5486feefSafresh1use Math::BigFloat;
13*5486feefSafresh1
14*5486feefSafresh1# shortcuts
15*5486feefSafresh1my $mbr = 'Math::BigRat';
16*5486feefSafresh1my $mbi = 'Math::BigInt';
17*5486feefSafresh1my $mbf = 'Math::BigFloat';
18*5486feefSafresh1
19*5486feefSafresh1my ($x, $y, $z);
20*5486feefSafresh1
21*5486feefSafresh1$x = Math::BigRat->new(1234);
22*5486feefSafresh1is($x, 1234, 'value of $x');
23*5486feefSafresh1isa_ok($x, 'Math::BigRat');
24*5486feefSafresh1ok(!$x->isa('Math::BigInt'),
25*5486feefSafresh1   "An object of class '" . ref($x) . "' isn't a 'Math::BigInt'");
26*5486feefSafresh1ok(!$x->isa('Math::BigFloat'),
27*5486feefSafresh1   "An object of class '" . ref($x) . "' isn't a 'Math::BigFloat'");
28*5486feefSafresh1
29*5486feefSafresh1##############################################################################
30*5486feefSafresh1# new and bnorm()
31*5486feefSafresh1
32*5486feefSafresh1foreach my $method (qw/ new bnorm /) {
33*5486feefSafresh1    $x = $mbr->$method(1234);
34*5486feefSafresh1    is($x, 1234, qq|\$x = $mbr->$method(1234)|);
35*5486feefSafresh1
36*5486feefSafresh1    $x = $mbr->$method("1234/1");
37*5486feefSafresh1    is($x, 1234, qq|\$x = $mbr->$method("1234/1")|);
38*5486feefSafresh1
39*5486feefSafresh1    $x = $mbr->$method("1234/2");
40*5486feefSafresh1    is($x, 617, qq|\$x = $mbr->$method("1234/2")|);
41*5486feefSafresh1
42*5486feefSafresh1    $x = $mbr->$method("100/1.0");
43*5486feefSafresh1    is($x, 100, qq|\$x = $mbr->$method("100/1.0")|);
44*5486feefSafresh1
45*5486feefSafresh1    $x = $mbr->$method("10.0/1.0");
46*5486feefSafresh1    is($x, 10, qq|\$x = $mbr->$method("10.0/1.0")|);
47*5486feefSafresh1
48*5486feefSafresh1    $x = $mbr->$method("0.1/10");
49*5486feefSafresh1    is($x, "1/100", qq|\$x = $mbr->$method("0.1/10")|);
50*5486feefSafresh1
51*5486feefSafresh1    $x = $mbr->$method("0.1/0.1");
52*5486feefSafresh1    is($x, "1", qq|\$x = $mbr->$method("0.1/0.1")|);
53*5486feefSafresh1
54*5486feefSafresh1    $x = $mbr->$method("1e2/10");
55*5486feefSafresh1    is($x, 10, qq|\$x = $mbr->$method("1e2/10")|);
56*5486feefSafresh1
57*5486feefSafresh1    $x = $mbr->$method("5/1e2");
58*5486feefSafresh1    is($x, "1/20", qq|\$x = $mbr->$method("5/1e2")|);
59*5486feefSafresh1
60*5486feefSafresh1    $x = $mbr->$method("1e2/1e1");
61*5486feefSafresh1    is($x, 10, qq|\$x = $mbr->$method("1e2/1e1")|);
62*5486feefSafresh1
63*5486feefSafresh1    $x = $mbr->$method("1 / 3");
64*5486feefSafresh1    is($x, "1/3", qq|\$x = $mbr->$method("1 / 3")|);
65*5486feefSafresh1
66*5486feefSafresh1    $x = $mbr->$method("-1 / 3");
67*5486feefSafresh1    is($x, "-1/3", qq|\$x = $mbr->$method("-1 / 3")|);
68*5486feefSafresh1
69*5486feefSafresh1    $x = $mbr->$method("NaN");
70*5486feefSafresh1    is($x, "NaN", qq|\$x = $mbr->$method("NaN")|);
71*5486feefSafresh1
72*5486feefSafresh1    $x = $mbr->$method("inf");
73*5486feefSafresh1    is($x, "inf", qq|\$x = $mbr->$method("inf")|);
74*5486feefSafresh1
75*5486feefSafresh1    $x = $mbr->$method("-inf");
76*5486feefSafresh1    is($x, "-inf", qq|\$x = $mbr->$method("-inf")|);
77*5486feefSafresh1
78*5486feefSafresh1    $x = $mbr->$method("1/");
79*5486feefSafresh1    is($x, "NaN", qq|\$x = $mbr->$method("1/")|);
80*5486feefSafresh1
81*5486feefSafresh1    $x = $mbr->$method("0x7e");
82*5486feefSafresh1    is($x, 126, qq|\$x = $mbr->$method("0x7e")|);
83*5486feefSafresh1
84*5486feefSafresh1    # input ala "1+1/3" isn"t parsed ok yet
85*5486feefSafresh1    $x = $mbr->$method("1+1/3");
86*5486feefSafresh1    is($x, "NaN", qq|\$x = $mbr->$method("1+1/3")|);
87*5486feefSafresh1
88*5486feefSafresh1    $x = $mbr->$method("1/1.2");
89*5486feefSafresh1    is($x, "5/6", qq|\$x = $mbr->$method("1/1.2")|);
90*5486feefSafresh1
91*5486feefSafresh1    $x = $mbr->$method("1.3/1.2");
92*5486feefSafresh1    is($x, "13/12", qq|\$x = $mbr->$method("1.3/1.2")|);
93*5486feefSafresh1
94*5486feefSafresh1    $x = $mbr->$method("1.2/1");
95*5486feefSafresh1    is($x, "6/5", qq|\$x = $mbr->$method("1.2/1")|);
96*5486feefSafresh1
97*5486feefSafresh1    ############################################################################
98*5486feefSafresh1    # other classes as input
99*5486feefSafresh1
100*5486feefSafresh1    $x = $mbr->$method($mbi->new(1231));
101*5486feefSafresh1    is($x, "1231", qq|\$x = $mbr->$method($mbi->new(1231))|);
102*5486feefSafresh1
103*5486feefSafresh1    $x = $mbr->$method($mbf->new(1232));
104*5486feefSafresh1    is($x, "1232", qq|\$x = $mbr->$method($mbf->new(1232))|);
105*5486feefSafresh1
106*5486feefSafresh1    $x = $mbr->$method($mbf->new(1232.3));
107*5486feefSafresh1    is($x, "12323/10", qq|\$x = $mbr->$method($mbf->new(1232.3))|);
108*5486feefSafresh1}
109*5486feefSafresh1
110*5486feefSafresh1my $n = 'numerator';
111*5486feefSafresh1my $d = 'denominator';
112*5486feefSafresh1
113*5486feefSafresh1$x = $mbr->new('-0');
114*5486feefSafresh1is($x, '0');
115*5486feefSafresh1is($x->$n(), '0');
116*5486feefSafresh1is($x->$d(), '1');
117*5486feefSafresh1
118*5486feefSafresh1$x = $mbr->new('NaN');
119*5486feefSafresh1is($x, 'NaN');  is($x->$n(), 'NaN');
120*5486feefSafresh1is($x->$d(), 'NaN');
121*5486feefSafresh1
122*5486feefSafresh1$x = $mbr->new('-NaN');
123*5486feefSafresh1is($x, 'NaN');  is($x->$n(), 'NaN');
124*5486feefSafresh1is($x->$d(), 'NaN');
125*5486feefSafresh1
126*5486feefSafresh1$x = $mbr->new('-1r4');
127*5486feefSafresh1is($x, 'NaN');  is($x->$n(), 'NaN');
128*5486feefSafresh1is($x->$d(), 'NaN');
129*5486feefSafresh1
130*5486feefSafresh1$x = $mbr->new('+inf');
131*5486feefSafresh1is($x, 'inf');  is($x->$n(), 'inf');
132*5486feefSafresh1is($x->$d(), '1');
133*5486feefSafresh1
134*5486feefSafresh1$x = $mbr->new('-inf');
135*5486feefSafresh1is($x, '-inf');
136*5486feefSafresh1is($x->$n(), '-inf');
137*5486feefSafresh1is($x->$d(), '1');
138*5486feefSafresh1
139*5486feefSafresh1$x = $mbr->new('123a4');
140*5486feefSafresh1is($x, 'NaN');
141*5486feefSafresh1is($x->$n(), 'NaN');
142*5486feefSafresh1is($x->$d(), 'NaN');
143*5486feefSafresh1
144*5486feefSafresh1# wrong inputs
145*5486feefSafresh1$x = $mbr->new('1e2e2');
146*5486feefSafresh1is($x, 'NaN');
147*5486feefSafresh1is($x->$n(), 'NaN');
148*5486feefSafresh1is($x->$d(), 'NaN');
149*5486feefSafresh1
150*5486feefSafresh1$x = $mbr->new('1+2+2');
151*5486feefSafresh1is($x, 'NaN');
152*5486feefSafresh1is($x->$n(), 'NaN');
153*5486feefSafresh1is($x->$d(), 'NaN');
154*5486feefSafresh1
155*5486feefSafresh1# failed due to BigFloat bug
156*5486feefSafresh1$x = $mbr->new('1.2.2');
157*5486feefSafresh1is($x, 'NaN');
158*5486feefSafresh1is($x->$n(), 'NaN');
159*5486feefSafresh1is($x->$d(), 'NaN');
160*5486feefSafresh1
161*5486feefSafresh1is($mbr->new('123a4'), 'NaN');
162*5486feefSafresh1is($mbr->new('123e4'), '1230000');
163*5486feefSafresh1is($mbr->new('-NaN'), 'NaN');
164*5486feefSafresh1is($mbr->new('NaN'), 'NaN');
165*5486feefSafresh1is($mbr->new('+inf'), 'inf');
166*5486feefSafresh1is($mbr->new('-inf'), '-inf');
167*5486feefSafresh1
168*5486feefSafresh1##############################################################################
169*5486feefSafresh1# two Bigints
170*5486feefSafresh1
171*5486feefSafresh1is($mbr->new($mbi->new(3), $mbi->new(7))->badd(1), '10/7');
172*5486feefSafresh1is($mbr->new($mbi->new(-13), $mbi->new(7)), '-13/7');
173*5486feefSafresh1is($mbr->new($mbi->new(13), $mbi->new(-7)), '-13/7');
174*5486feefSafresh1is($mbr->new($mbi->new(-13), $mbi->new(-7)), '13/7');
175*5486feefSafresh1
176*5486feefSafresh1##############################################################################
177*5486feefSafresh1# mixed arguments
178*5486feefSafresh1
179*5486feefSafresh1is($mbr->new('3/7')->badd(1), '10/7');
180*5486feefSafresh1is($mbr->new('3/10')->badd(1.1), '7/5');
181*5486feefSafresh1is($mbr->new('3/7')->badd($mbi->new(1)), '10/7');
182*5486feefSafresh1is($mbr->new('3/10')->badd($mbf->new('1.1')), '7/5');
183*5486feefSafresh1
184*5486feefSafresh1is($mbr->new('3/7')->bsub(1), '-4/7');
185*5486feefSafresh1is($mbr->new('3/10')->bsub(1.1), '-4/5');
186*5486feefSafresh1is($mbr->new('3/7')->bsub($mbi->new(1)), '-4/7');
187*5486feefSafresh1is($mbr->new('3/10')->bsub($mbf->new('1.1')), '-4/5');
188*5486feefSafresh1
189*5486feefSafresh1is($mbr->new('3/7')->bmul(1), '3/7');
190*5486feefSafresh1is($mbr->new('3/10')->bmul(1.1), '33/100');
191*5486feefSafresh1is($mbr->new('3/7')->bmul($mbi->new(1)), '3/7');
192*5486feefSafresh1is($mbr->new('3/10')->bmul($mbf->new('1.1')), '33/100');
193*5486feefSafresh1
194*5486feefSafresh1is($mbr->new('3/7')->bdiv(1), '3/7');
195*5486feefSafresh1is($mbr->new('3/10')->bdiv(1.1), '3/11');
196*5486feefSafresh1is($mbr->new('3/7')->bdiv($mbi->new(1)), '3/7');
197*5486feefSafresh1is($mbr->new('3/10')->bdiv($mbf->new('1.1')), '3/11');
198*5486feefSafresh1
199*5486feefSafresh1##############################################################################
200*5486feefSafresh1$x = $mbr->new('1/4');
201*5486feefSafresh1$y = $mbr->new('1/3');
202*5486feefSafresh1
203*5486feefSafresh1is($x + $y, '7/12');
204*5486feefSafresh1is($x * $y, '1/12');
205*5486feefSafresh1is($x / $y, '3/4');
206*5486feefSafresh1
207*5486feefSafresh1$x = $mbr->new('7/5');
208*5486feefSafresh1$x *= '3/2';
209*5486feefSafresh1is($x, '21/10');
210*5486feefSafresh1$x -= '0.1';
211*5486feefSafresh1is($x, '2');                    # not 21/10
212*5486feefSafresh1
213*5486feefSafresh1$x = $mbr->new('2/3');
214*5486feefSafresh1$y = $mbr->new('3/2');
215*5486feefSafresh1is($x > $y, '');
216*5486feefSafresh1is($x < $y, 1);
217*5486feefSafresh1is($x == $y, '');
218*5486feefSafresh1
219*5486feefSafresh1$x = $mbr->new('-2/3');
220*5486feefSafresh1$y = $mbr->new('3/2');
221*5486feefSafresh1is($x > $y, '');
222*5486feefSafresh1is($x < $y, '1');
223*5486feefSafresh1is($x == $y, '');
224*5486feefSafresh1
225*5486feefSafresh1$x = $mbr->new('-2/3');
226*5486feefSafresh1$y = $mbr->new('-2/3');
227*5486feefSafresh1is($x > $y, '');
228*5486feefSafresh1is($x < $y, '');
229*5486feefSafresh1is($x == $y, '1');
230*5486feefSafresh1
231*5486feefSafresh1$x = $mbr->new('-2/3');
232*5486feefSafresh1$y = $mbr->new('-1/3');
233*5486feefSafresh1is($x > $y, '');
234*5486feefSafresh1is($x < $y, '1');
235*5486feefSafresh1is($x == $y, '');
236*5486feefSafresh1
237*5486feefSafresh1$x = $mbr->new('-124');
238*5486feefSafresh1$y = $mbr->new('-122');
239*5486feefSafresh1is($x->bacmp($y), 1);
240*5486feefSafresh1
241*5486feefSafresh1$x = $mbr->new('-124');
242*5486feefSafresh1$y = $mbr->new('-122');
243*5486feefSafresh1is($x->bcmp($y), -1);
244*5486feefSafresh1
245*5486feefSafresh1$x = $mbr->new('3/7');
246*5486feefSafresh1$y = $mbr->new('5/7');
247*5486feefSafresh1is($x+$y, '8/7');
248*5486feefSafresh1
249*5486feefSafresh1$x = $mbr->new('3/7');
250*5486feefSafresh1$y = $mbr->new('5/7');
251*5486feefSafresh1is($x*$y, '15/49');
252*5486feefSafresh1
253*5486feefSafresh1$x = $mbr->new('3/5');
254*5486feefSafresh1$y = $mbr->new('5/7');
255*5486feefSafresh1is($x*$y, '3/7');
256*5486feefSafresh1
257*5486feefSafresh1$x = $mbr->new('3/5');
258*5486feefSafresh1$y = $mbr->new('5/7');
259*5486feefSafresh1is($x/$y, '21/25');
260*5486feefSafresh1
261*5486feefSafresh1$x = $mbr->new('7/4');
262*5486feefSafresh1$y = $mbr->new('1');
263*5486feefSafresh1is($x % $y, '3/4');
264*5486feefSafresh1
265*5486feefSafresh1$x = $mbr->new('7/4');
266*5486feefSafresh1$y = $mbr->new('5/13');
267*5486feefSafresh1is($x % $y, '11/52');
268*5486feefSafresh1
269*5486feefSafresh1$x = $mbr->new('7/4');
270*5486feefSafresh1$y = $mbr->new('5/9');
271*5486feefSafresh1is($x % $y, '1/12');
272*5486feefSafresh1
273*5486feefSafresh1$x = $mbr->new('-144/9')->bsqrt();
274*5486feefSafresh1is($x, 'NaN');
275*5486feefSafresh1
276*5486feefSafresh1$x = $mbr->new('144/9')->bsqrt();
277*5486feefSafresh1is($x, '4');
278*5486feefSafresh1
279*5486feefSafresh1$x = $mbr->new('3/4')->bsqrt();
280*5486feefSafresh1is($x,
281*5486feefSafresh1   '4330127018922193233818615853764680917357/' .
282*5486feefSafresh1   '5000000000000000000000000000000000000000');
283*5486feefSafresh1
284*5486feefSafresh1##############################################################################
285*5486feefSafresh1# bpow
286*5486feefSafresh1
287*5486feefSafresh1$x = $mbr->new('2/1');
288*5486feefSafresh1$z = $x->bpow('3/1');
289*5486feefSafresh1is($x, '8');
290*5486feefSafresh1
291*5486feefSafresh1$x = $mbr->new('1/2');
292*5486feefSafresh1$z = $x->bpow('3/1');
293*5486feefSafresh1is($x, '1/8');
294*5486feefSafresh1
295*5486feefSafresh1$x = $mbr->new('1/3');
296*5486feefSafresh1$z = $x->bpow('4/1');
297*5486feefSafresh1is($x, '1/81');
298*5486feefSafresh1
299*5486feefSafresh1$x = $mbr->new('2/3');
300*5486feefSafresh1$z = $x->bpow('4/1');
301*5486feefSafresh1is($x, '16/81');
302*5486feefSafresh1
303*5486feefSafresh1$x = $mbr->new('2/3');
304*5486feefSafresh1$z = $x->bpow('5/3');
305*5486feefSafresh1is($x, '31797617848703662994667839220546583581/62500000000000000000000000000000000000');
306*5486feefSafresh1
307*5486feefSafresh1##############################################################################
308*5486feefSafresh1# bfac
309*5486feefSafresh1
310*5486feefSafresh1$x = $mbr->new('1');
311*5486feefSafresh1$x->bfac();
312*5486feefSafresh1is($x, '1');
313*5486feefSafresh1
314*5486feefSafresh1for (my $i = 0; $i < 8; $i++) {
315*5486feefSafresh1    $x = $mbr->new("$i/1")->bfac();
316*5486feefSafresh1    is($x, $mbi->new($i)->bfac());
317*5486feefSafresh1}
318*5486feefSafresh1
319*5486feefSafresh1# test for $self->bnan() vs. $x->bnan();
320*5486feefSafresh1$x = $mbr->new('-1');
321*5486feefSafresh1$x->bfac();
322*5486feefSafresh1is($x, 'NaN');
323*5486feefSafresh1
324*5486feefSafresh1##############################################################################
325*5486feefSafresh1# binc/bdec
326*5486feefSafresh1
327*5486feefSafresh1note("binc()");
328*5486feefSafresh1$x = $mbr->new('3/2');
329*5486feefSafresh1is($x->binc(), '5/2');
330*5486feefSafresh1
331*5486feefSafresh1note("bdec()");
332*5486feefSafresh1
333*5486feefSafresh1$x = $mbr->new('15/6');
334*5486feefSafresh1is($x->bdec(), '3/2');
335*5486feefSafresh1
336*5486feefSafresh1##############################################################################
337*5486feefSafresh1# bfloor
338*5486feefSafresh1
339*5486feefSafresh1note("bfloor()");
340*5486feefSafresh1$x = $mbr->new('-7/7');
341*5486feefSafresh1is($x->$n(), '-1');
342*5486feefSafresh1is($x->$d(), '1');
343*5486feefSafresh1$x = $mbr->new('-7/7')->bfloor();
344*5486feefSafresh1is($x->$n(), '-1');
345*5486feefSafresh1is($x->$d(), '1');
346*5486feefSafresh1
347*5486feefSafresh1##############################################################################
348*5486feefSafresh1# bsstr
349*5486feefSafresh1
350*5486feefSafresh1$x = $mbr->new('7/5')->bsstr();
351*5486feefSafresh1is($x, '7/5');
352*5486feefSafresh1$x = $mbr->new('-7/5')->bsstr();
353*5486feefSafresh1is($x, '-7/5');
354*5486feefSafresh1
355*5486feefSafresh1##############################################################################
356*5486feefSafresh1
357*5486feefSafresh1note("numify()");
358*5486feefSafresh1
359*5486feefSafresh1my @array = qw/1 2 3 4 5 6 7 8 9/;
360*5486feefSafresh1$x = $mbr->new('8/8');
361*5486feefSafresh1is($array[$x], 2);
362*5486feefSafresh1
363*5486feefSafresh1$x = $mbr->new('16/8');
364*5486feefSafresh1is($array[$x], 3);
365*5486feefSafresh1
366*5486feefSafresh1$x = $mbr->new('17/8');
367*5486feefSafresh1is($array[$x], 3);
368*5486feefSafresh1
369*5486feefSafresh1$x = $mbr->new('33/8');
370*5486feefSafresh1is($array[$x], 5);
371*5486feefSafresh1
372*5486feefSafresh1$x = $mbr->new('-33/8');
373*5486feefSafresh1is($array[$x], 6);
374*5486feefSafresh1
375*5486feefSafresh1$x = $mbr->new('-8/1');
376*5486feefSafresh1is($array[$x], 2);      # -8 => 2
377*5486feefSafresh1
378*5486feefSafresh1require Math::Complex;
379*5486feefSafresh1
380*5486feefSafresh1my $inf = $Math::Complex::Inf;
381*5486feefSafresh1my $nan = $inf - $inf;
382*5486feefSafresh1
383*5486feefSafresh1sub isnumeric {
384*5486feefSafresh1    my $value = shift;
385*5486feefSafresh1    ($value ^ $value) eq "0";
386*5486feefSafresh1}
387*5486feefSafresh1
388*5486feefSafresh1subtest qq|$mbr -> new("33/8") -> numify()| => sub {
389*5486feefSafresh1    plan tests => 3;
390*5486feefSafresh1
391*5486feefSafresh1    $x = $mbr -> new("33/8") -> numify();
392*5486feefSafresh1    is(ref($x), "", '$x is a scalar');
393*5486feefSafresh1    ok(isnumeric($x), '$x is numeric');
394*5486feefSafresh1    cmp_ok($x, "==", 4.125, '$x has the right value');
395*5486feefSafresh1};
396*5486feefSafresh1
397*5486feefSafresh1subtest qq|$mbr -> new("-33/8") -> numify()| => sub {
398*5486feefSafresh1    plan tests => 3;
399*5486feefSafresh1
400*5486feefSafresh1    $x = $mbr -> new("-33/8") -> numify();
401*5486feefSafresh1    is(ref($x), "", '$x is a scalar');
402*5486feefSafresh1    ok(isnumeric($x), '$x is numeric');
403*5486feefSafresh1    cmp_ok($x, "==", -4.125, '$x has the right value');
404*5486feefSafresh1};
405*5486feefSafresh1
406*5486feefSafresh1subtest qq|$mbr -> new("inf") -> numify()| => sub {
407*5486feefSafresh1    plan tests => 3;
408*5486feefSafresh1
409*5486feefSafresh1    $x = $mbr -> new("inf") -> numify();
410*5486feefSafresh1    is(ref($x), "", '$x is a scalar');
411*5486feefSafresh1    ok(isnumeric($x), '$x is numeric');
412*5486feefSafresh1    cmp_ok($x, "==", $inf, '$x has the right value');
413*5486feefSafresh1};
414*5486feefSafresh1
415*5486feefSafresh1subtest qq|$mbr -> new("-inf") -> numify()| => sub {
416*5486feefSafresh1    plan tests => 3;
417*5486feefSafresh1
418*5486feefSafresh1    $x = $mbr -> new("-inf") -> numify();
419*5486feefSafresh1    is(ref($x), "", '$x is a scalar');
420*5486feefSafresh1    ok(isnumeric($x), '$x is numeric');
421*5486feefSafresh1    cmp_ok($x, "==", -$inf, '$x has the right value');
422*5486feefSafresh1};
423*5486feefSafresh1
424*5486feefSafresh1subtest qq|$mbr -> new("NaN") -> numify()| => sub {
425*5486feefSafresh1    plan tests => 3;
426*5486feefSafresh1
427*5486feefSafresh1    $x = $mbr -> new("NaN") -> numify();
428*5486feefSafresh1    is(ref($x), "", '$x is a scalar');
429*5486feefSafresh1    ok(isnumeric($x), '$x is numeric');
430*5486feefSafresh1    cmp_ok($x, "!=", $nan, '$x has the right value');   # Note: NaN != NaN
431*5486feefSafresh1};
432*5486feefSafresh1
433*5486feefSafresh1##############################################################################
434*5486feefSafresh1# as_hex(), as_bin(), as_oct()
435*5486feefSafresh1
436*5486feefSafresh1note("as_hex(), as_bin(), as_oct()");
437*5486feefSafresh1
438*5486feefSafresh1$x = $mbr->new('8/8');
439*5486feefSafresh1is($x->as_hex(), '0x1');
440*5486feefSafresh1is($x->as_bin(), '0b1');
441*5486feefSafresh1is($x->as_oct(), '01');
442*5486feefSafresh1
443*5486feefSafresh1$x = $mbr->new('80/8');
444*5486feefSafresh1is($x->as_hex(), '0xa');
445*5486feefSafresh1is($x->as_bin(), '0b1010');
446*5486feefSafresh1is($x->as_oct(), '012');
447*5486feefSafresh1
448*5486feefSafresh1##############################################################################
449*5486feefSafresh1# broot(), blog(), bmodpow() and bmodinv()
450*5486feefSafresh1
451*5486feefSafresh1note("broot(), blog(), bmodpow(), bmodinv()");
452*5486feefSafresh1
453*5486feefSafresh1$x = $mbr->new(2) ** 32;
454*5486feefSafresh1$y = $mbr->new(4);
455*5486feefSafresh1$z = $mbr->new(3);
456*5486feefSafresh1
457*5486feefSafresh1is($x->copy()->broot($y), 2 ** 8);
458*5486feefSafresh1is(ref($x->copy()->broot($y)), $mbr, "\$x is a $mbr");
459*5486feefSafresh1
460*5486feefSafresh1is($x->copy()->bmodpow($y, $z), 1);
461*5486feefSafresh1is(ref($x->copy()->bmodpow($y, $z)), $mbr, "\$x is a $mbr");
462*5486feefSafresh1
463*5486feefSafresh1$x = $mbr->new(8);
464*5486feefSafresh1$y = $mbr->new(5033);
465*5486feefSafresh1$z = $mbr->new(4404);
466*5486feefSafresh1
467*5486feefSafresh1is($x->copy()->bmodinv($y), $z);
468*5486feefSafresh1is(ref($x->copy()->bmodinv($y)), $mbr, "\$x is a $mbr");
469*5486feefSafresh1
470*5486feefSafresh1# square root with exact result
471*5486feefSafresh1$x = $mbr->new('1.44');
472*5486feefSafresh1is($x->copy()->broot(2), '6/5');
473*5486feefSafresh1is(ref($x->copy()->broot(2)), $mbr, "\$x is a $mbr");
474*5486feefSafresh1
475*5486feefSafresh1# log with exact result
476*5486feefSafresh1$x = $mbr->new('256.1');
477*5486feefSafresh1is($x->copy()->blog(2),
478*5486feefSafresh1   '8000563442710106079310294693803606983661/1000000000000000000000000000000000000000',
479*5486feefSafresh1   "\$x = $mbr->new('256.1')->blog(2)");
480*5486feefSafresh1is(ref($x->copy()->blog(2)), $mbr, "\$x is a $mbr");
481*5486feefSafresh1
482*5486feefSafresh1$x = $mbr->new(144);
483*5486feefSafresh1is($x->copy()->broot('2'), 12, 'v/144 = 12');
484*5486feefSafresh1
485*5486feefSafresh1$x = $mbr->new(12*12*12);
486*5486feefSafresh1is($x->copy()->broot('3'), 12, '(12*12*12) ** 1/3 = 12');
487*5486feefSafresh1
488*5486feefSafresh1##############################################################################
489*5486feefSafresh1# from_hex(), from_bin(), from_oct()
490*5486feefSafresh1
491*5486feefSafresh1note("from_hex(), from_bin(), from_oct()");
492*5486feefSafresh1
493*5486feefSafresh1$x = Math::BigRat->from_hex('0x100');
494*5486feefSafresh1is($x, '256', 'from_hex');
495*5486feefSafresh1
496*5486feefSafresh1$x = $mbr->from_hex('0x100');
497*5486feefSafresh1is($x, '256', 'from_hex');
498*5486feefSafresh1
499*5486feefSafresh1$x = Math::BigRat->from_bin('0b100');
500*5486feefSafresh1is($x, '4', 'from_bin');
501*5486feefSafresh1
502*5486feefSafresh1$x = $mbr->from_bin('0b100');
503*5486feefSafresh1is($x, '4', 'from_bin');
504*5486feefSafresh1
505*5486feefSafresh1$x = Math::BigRat->from_oct('0100');
506*5486feefSafresh1is($x, '64', 'from_oct');
507*5486feefSafresh1
508*5486feefSafresh1$x = $mbr->from_oct('0100');
509*5486feefSafresh1is($x, '64', 'from_oct');
510*5486feefSafresh1
511*5486feefSafresh1##############################################################################
512*5486feefSafresh1# as_float()
513*5486feefSafresh1
514*5486feefSafresh1$x = Math::BigRat->new('1/2');
515*5486feefSafresh1my $f = $x->as_float();
516*5486feefSafresh1
517*5486feefSafresh1is($x, '1/2', '$x unmodified');
518*5486feefSafresh1is($f, '0.5', 'as_float(0.5)');
519*5486feefSafresh1
520*5486feefSafresh1$x = Math::BigRat->new('2/3');
521*5486feefSafresh1$f = $x->as_float(5);
522*5486feefSafresh1
523*5486feefSafresh1is($x, '2/3', '$x unmodified');
524*5486feefSafresh1is($f, '0.66667', 'as_float(2/3, 5)');
525*5486feefSafresh1
526*5486feefSafresh1# Integers should be converted exactly.
527*5486feefSafresh1$x = Math::BigRat->new("3141592653589793238462643383279502884197169399375106");
528*5486feefSafresh1$f = $x->as_float();
529*5486feefSafresh1
530*5486feefSafresh1is($x, "3141592653589793238462643383279502884197169399375106", '$x unmodified');
531*5486feefSafresh1is($f, "3141592653589793238462643383279502884197169399375106",
532*5486feefSafresh1   'as_float(3141592653589793238462643383279502884197169399375106, 5)');
533*5486feefSafresh1
534*5486feefSafresh1##############################################################################
535*5486feefSafresh1# int()
536*5486feefSafresh1
537*5486feefSafresh1$x = Math::BigRat->new('5/2');
538*5486feefSafresh1is(int($x), '2', '5/2 converted to integer');
539*5486feefSafresh1
540*5486feefSafresh1$x = Math::BigRat->new('-1/2');
541*5486feefSafresh1is(int($x), '0', '-1/2 converted to integer');
542*5486feefSafresh1
543*5486feefSafresh1##############################################################################
544*5486feefSafresh1# done
545*5486feefSafresh1
546*5486feefSafresh11;
547