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