ANNOUCNE: Math::BigRat v0.09
[p5sagit/p5-mst-13.2.git] / lib / Math / BigRat / t / bigratpm.inc
CommitLineData
184f15d5 1#include this file into another test for subclass testing...
2
3ok ($class->config()->{lib},$CL);
4
5while (<DATA>)
6 {
a4e2b1c6 7 chomp;
184f15d5 8 $_ =~ s/#.*$//; # remove comments
9 $_ =~ s/\s+$//; # trailing spaces
10 next if /^$/; # skip empty lines & comments
11 if (s/^&//)
12 {
13 $f = $_;
14 }
15 elsif (/^\$/)
16 {
17 $setup = $_; $setup =~ s/\$/\$${class}::/g; # round_mode, div_scale
18 #print "\$setup== $setup\n";
19 }
20 else
21 {
22 if (m|^(.*?):(/.+)$|)
23 {
24 $ans = $2;
25 @args = split(/:/,$1,99);
26 }
27 else
28 {
29 @args = split(/:/,$_,99); $ans = pop(@args);
30 }
31 $try = "\$x = new $class \"$args[0]\";";
32 if ($f eq "bnorm")
33 {
34 $try .= "\$x;";
35 } elsif ($f eq "finf") {
36 $try .= "\$x->binf('$args[1]');";
37 } elsif ($f eq "is_inf") {
38 $try .= "\$x->is_inf('$args[1]');";
39 } elsif ($f eq "fone") {
40 $try .= "\$x->bone('$args[1]');";
41 } elsif ($f eq "fstr") {
42 $try .= "\$x->accuracy($args[1]); \$x->precision($args[2]);";
43 $try .= '$x->bstr();';
44 } elsif ($f eq "parts") {
45 # ->bstr() to see if an object is returned
46 $try .= '($a,$b) = $x->parts(); $a = $a->bstr(); $b = $b->bstr();';
47 $try .= '"$a $b";';
48 } elsif ($f eq "numerator") {
49 # ->bstr() to see if an object is returned
50 $try .= '$x->numerator()->bstr();';
51 } elsif ($f eq "denominator") {
52 # ->bstr() to see if an object is returned
53 $try .= '$x->denominator()->bstr();';
7d341013 54 } elsif ($f =~ /^(length|numify)$/) {
55 $try .= "\$x->$f();";
56 # some unary ops (can't test the fxxx form, since no AUTOLOAD in BigRat)
184f15d5 57 } elsif ($f =~ /^f(nan|sstr|neg|floor|ceil|abs)$/) {
58 $try .= "\$x->b$1();";
59 # some is_xxx test function
60 } elsif ($f =~ /^is_(zero|one|negative|positive|odd|even|nan|int)$/) {
61 $try .= "\$x->$f();";
62 } elsif ($f eq "as_number") {
63 $try .= '$x->as_number();';
64 } elsif ($f eq "finc") {
65 $try .= '++$x;';
66 } elsif ($f eq "fdec") {
67 $try .= '--$x;';
68 }elsif ($f eq "fround") {
69 $try .= "$setup; \$x->bround($args[1]);";
70 } elsif ($f eq "ffround") {
71 $try .= "$setup; \$x->bfround($args[1]);";
72 } elsif ($f eq "fsqrt") {
73 $try .= "$setup; \$x->bsqrt();";
74 } elsif ($f eq "flog") {
75 $try .= "$setup; \$x->blog();";
76 } elsif ($f eq "ffac") {
77 $try .= "$setup; \$x->bfac();";
78 }
79 else
80 {
81 $try .= "\$y = new $class \"$args[1]\";";
82 if ($f eq "fcmp") {
83 $try .= '$x <=> $y;';
84 } elsif ($f eq "facmp") {
85 $try .= '$x->bacmp($y);';
86 } elsif ($f eq "bpow") {
87 $try .= '$x ** $y;';
a4e2b1c6 88 } elsif ($f eq "fpow") {
89 $try .= '$x->bpow($y);';
184f15d5 90 } elsif ($f eq "badd") {
91 $try .= '$x + $y;';
92 } elsif ($f eq "bsub") {
93 $try .= '$x - $y;';
94 } elsif ($f eq "bmul") {
95 $try .= '$x * $y;';
96 } elsif ($f eq "bdiv") {
97 $try .= "$setup; \$x / \$y;";
98 } elsif ($f eq "fdiv-list") {
99 $try .= "$setup; join(',',\$x->bdiv(\$y));";
100 } elsif ($f eq "brsft") {
101 $try .= '$x >> $y;';
102 } elsif ($f eq "blsft") {
103 $try .= '$x << $y;';
104 } elsif ($f eq "bmod") {
105 $try .= '$x % $y;';
106 } else { warn "Unknown op '$f'"; }
107 }
108 # print "# Trying: '$try'\n";
109 $ans1 = eval $try;
110 if ($ans =~ m|^/(.*)$|)
111 {
112 my $pat = $1;
113 if ($ans1 =~ /$pat/)
114 {
115 ok (1,1);
116 }
117 else
118 {
119 print "# '$try' expected: /$pat/ got: '$ans1'\n" if !ok(1,0);
120 }
121 }
122 else
123 {
124 if ($ans eq "")
125 {
126 ok_undef ($ans1);
127 }
128 else
129 {
130 print "# Tried: '$try'\n" if !ok ($ans1, $ans);
131# if (ref($ans1) eq "$class")
132# {
133# # float numbers are normalized (for now), so mantissa shouldn't have
134# # trailing zeros
135# #print $ans1->_trailing_zeros(),"\n";
136# print "# Has trailing zeros after '$try'\n"
137# if !ok ($ans1->{_m}->_trailing_zeros(), 0);
138# }
139 }
140 } # end pattern or string
141 }
142 } # end while
143
144# check whether $class->new( Math::BigInt->new()) destroys it
145# ($y == 12 in this case)
146$x = Math::BigInt->new(1200); $y = $class->new($x);
147ok ($y,1200); ok ($x,1200);
148
149###############################################################################
150# zero,inf,one,nan
151
152$x = $class->new(2); $x->bzero(); ok_undef ($x->{_a}); ok_undef ($x->{_p});
153$x = $class->new(2); $x->binf(); ok_undef ($x->{_a}); ok_undef ($x->{_p});
154$x = $class->new(2); $x->bone(); ok_undef ($x->{_a}); ok_undef ($x->{_p});
155$x = $class->new(2); $x->bnan(); ok_undef ($x->{_a}); ok_undef ($x->{_p});
156
1571; # all done
158
159###############################################################################
160# Perl 5.005 does not like ok ($x,undef)
161
162sub ok_undef
163 {
164 my $x = shift;
165
166 ok (1,1) and return if !defined $x;
167 ok ($x,'undef');
168 }
169
170__DATA__
171&finf
1721:+:inf
1732:-:-inf
1743:abc:inf
175#&numify
176#0:0e+1
177#+1:1e+0
178#1234:1234e+0
179#NaN:NaN
180#+inf:inf
181#-inf:-inf
182&fnan
183abc:NaN
1842:NaN
185-2:NaN
1860:NaN
187&fone
1882:+:1
189-2:-:-1
190-2:+:1
1912:-:-1
1920::1
193-2::1
194abc::1
1952:abc:1
196&fsstr
197+inf:inf
198-inf:-inf
199abcfsstr:NaN
2001:1/1
2013/1:3/1
2020.1:1/10
203&bnorm
2041:1
205-0:0
206bnormNaN:NaN
207+inf:inf
208-inf:-inf
209123:123
210-123.4567:-1234567/10000
211# invalid inputs
2121__2:NaN
2131E1__2:NaN
21411__2E2:NaN
215#1.E3:NaN
216.2E-3.:NaN
217#1e3e4:NaN
218.2E2:20
219inf:inf
220+inf:inf
221-inf:-inf
222+infinity:NaN
223+-inf:NaN
224abc:NaN
225 1 a:NaN
2261bcd2:NaN
22711111b:NaN
228+1z:NaN
229-1z:NaN
2300:0
231+0:0
232+00:0
233+0_0_0:0
234000000_0000000_00000:0
235-0:0
236-0000:0
237+1:1
238+01:1
239+001:1
240+00000100000:100000
241123456789:123456789
242-1:-1
243-01:-1
244-001:-1
245-123456789:-123456789
246-00000100000:-100000
247123.456a:NaN
248123.456:15432/125
2490.01:1/100
250.002:1/500
251+.2:1/5
252-0.0003:-3/10000
253-.0000000004:-1/2500000000
254123456E2:12345600
255123456E-2:30864/25
256-123456E2:-12345600
257-123456E-2:-30864/25
2581e1:10
2592e-11:1/50000000000
26012/10:6/5
2610.1/0.1:1
262100/0.1:1000
2630.1/10:1/100
2641 / 3:1/3
2651/ 3:1/3
2661 /3:1/3
267&fneg
268fnegNaN:NaN
269+inf:-inf
270-inf:inf
271+0:0
272+1:-1
273-1:1
274+123456789:-123456789
275-123456789:123456789
276+123.456789:-123456789/1000000
277-123456.789:123456789/1000
278&fabs
279fabsNaN:NaN
280+inf:inf
281-inf:inf
282+0:0
283+1:1
284-1:1
285+123456789:123456789
286-123456789:123456789
287+123.456789:123456789/1000000
288-123456.789:123456789/1000
289&badd
290abc:abc:NaN
291abc:+0:NaN
292+0:abc:NaN
293+inf:-inf:NaN
294-inf:+inf:NaN
295+inf:+inf:inf
296-inf:-inf:-inf
297baddNaN:+inf:NaN
298baddNaN:+inf:NaN
299+inf:baddNaN:NaN
300-inf:baddNaN:NaN
301+0:+0:0
302+1:+0:1
303+0:+1:1
304+1:+1:2
305-1:+0:-1
306+0:-1:-1
307-1:-1:-2
308-1:+1:0
309+1:-1:0
310+9:+1:10
311+99:+1:100
312+999:+1:1000
313+9999:+1:10000
314+99999:+1:100000
315+999999:+1:1000000
316+9999999:+1:10000000
317+99999999:+1:100000000
318+999999999:+1:1000000000
319+9999999999:+1:10000000000
320+99999999999:+1:100000000000
321+10:-1:9
322+100:-1:99
323+1000:-1:999
324+10000:-1:9999
325+100000:-1:99999
326+1000000:-1:999999
327+10000000:-1:9999999
328+100000000:-1:99999999
329+1000000000:-1:999999999
330+10000000000:-1:9999999999
331+123456789:+987654321:1111111110
332-123456789:+987654321:864197532
333-123456789:-987654321:-1111111110
334+123456789:-987654321:-864197532
3351/3:1/3:2/3
3362/3:-1/3:1/3
337&bsub
338abc:abc:NaN
339abc:+0:NaN
340+0:abc:NaN
341+inf:-inf:inf
342-inf:+inf:-inf
343+inf:+inf:NaN
344-inf:-inf:NaN
345baddNaN:+inf:NaN
346baddNaN:+inf:NaN
347+inf:baddNaN:NaN
348-inf:baddNaN:NaN
349+0:+0:0
350+1:+0:1
351+0:+1:-1
352+1:+1:0
353-1:+0:-1
354+0:-1:1
355-1:-1:0
356-1:+1:-2
357+1:-1:2
358+9:+1:8
359+99:+1:98
360+999:+1:998
361+9999:+1:9998
362+99999:+1:99998
363+999999:+1:999998
364+9999999:+1:9999998
365+99999999:+1:99999998
366+999999999:+1:999999998
367+9999999999:+1:9999999998
368+99999999999:+1:99999999998
369+10:-1:11
370+100:-1:101
371+1000:-1:1001
372+10000:-1:10001
373+100000:-1:100001
374+1000000:-1:1000001
375+10000000:-1:10000001
376+100000000:-1:100000001
377+1000000000:-1:1000000001
378+10000000000:-1:10000000001
379+123456789:+987654321:-864197532
380-123456789:+987654321:-1111111110
381-123456789:-987654321:864197532
382+123456789:-987654321:1111111110
3832/3:1/3:1/3
3847/27:3/54:11/54
385-2/3:+2/3:-4/3
386-2/3:-2/3:0
387&bmul
388abc:abc:NaN
389abc:+0:NaN
390+0:abc:NaN
391+inf:NaNmul:NaN
392+inf:NaNmul:NaN
393NaNmul:+inf:NaN
394NaNmul:-inf:NaN
395+inf:+inf:inf
396+inf:-inf:-inf
397+inf:-inf:-inf
398+inf:+inf:inf
399+inf:123.34:inf
400+inf:-123.34:-inf
401-inf:123.34:-inf
402-inf:-123.34:inf
403123.34:+inf:inf
404-123.34:+inf:-inf
405123.34:-inf:-inf
406-123.34:-inf:inf
407+0:+0:0
408+0:+1:0
409+1:+0:0
410+0:-1:0
411-1:+0:0
412+123456789123456789:+0:0
413+0:+123456789123456789:0
414-1:-1:1
415-1:+1:-1
416+1:-1:-1
417+1:+1:1
418+2:+3:6
419-2:+3:-6
420+2:-3:-6
421-2:-3:6
422+111:+111:12321
423+10101:+10101:102030201
424+1001001:+1001001:1002003002001
425+100010001:+100010001:10002000300020001
426+10000100001:+10000100001:100002000030000200001
427+11111111111:+9:99999999999
428+22222222222:+9:199999999998
429+33333333333:+9:299999999997
430+44444444444:+9:399999999996
431+55555555555:+9:499999999995
432+66666666666:+9:599999999994
433+77777777777:+9:699999999993
434+88888888888:+9:799999999992
435+99999999999:+9:899999999991
4366:120:720
43710:10000:100000
4381/4:1/3:1/12
439&bdiv
440$div_scale = 40; $round_mode = 'even'
441abc:abc:NaN
442abc:+1:abc:NaN
443+1:abc:NaN
444-1:abc:NaN
4450:abc:NaN
446+0:+0:NaN
447+0:+1:0
448+1:+0:inf
449+3214:+0:inf
450+0:-1:0
451-1:+0:-inf
452-3214:+0:-inf
453+1:+1:1
454-1:-1:1
455+1:-1:-1
456-1:+1:-1
457+1:+2:1/2
458+2:+1:2
459123:+inf:0
460123:-inf:0
461+10:+5:2
462+100:+4:25
463+1000:+8:125
464+10000:+16:625
465+10000:-16:-625
466+999999999999:+9:111111111111
467+999999999999:+99:10101010101
468+999999999999:+999:1001001001
469+999999999999:+9999:100010001
470+999999999999999:+99999:10000100001
471+1000000000:+9:1000000000/9
472+2000000000:+9:2000000000/9
473+3000000000:+9:1000000000/3
474+4000000000:+9:4000000000/9
475+5000000000:+9:5000000000/9
476+6000000000:+9:2000000000/3
477+7000000000:+9:7000000000/9
478+8000000000:+9:8000000000/9
479+9000000000:+9:1000000000
480+35500000:+113:35500000/113
481+71000000:+226:35500000/113
482+106500000:+339:35500000/113
483+1000000000:+3:1000000000/3
4842:25.024996000799840031993601279744051189762:1000000000000000000000000000000000000000/12512498000399920015996800639872025594881
485123456:1:123456
4861/4:1/3:3/4
487# reset scale for further tests
488$div_scale = 40
489&is_nan
490123:0
491abc:1
492NaN:1
493-123:0
494&is_inf
495+inf::1
496-inf::1
497abc::0
4981::0
499NaN::0
500-1::0
501+inf:-:0
502+inf:+:1
503-inf:-:1
504-inf:+:0
505# it must be exactly /^[+-]inf$/
506+infinity::0
507-infinity::0
508&is_odd
509abc:0
5100:0
511-1:1
512-3:1
5131:1
5143:1
5151000001:1
5161000002:0
517+inf:0
518-inf:0
519123.45:0
520-123.45:0
5212:0
522&is_int
523NaNis_int:0
5240:1
5251:1
5262:1
527-2:1
528-1:1
529-inf:0
530+inf:0
531123.4567:0
532-0.1:0
533-0.002:0
5341/3:0
5353/1:1
536&is_even
537abc:0
5380:1
539-1:0
540-3:0
5411:0
5423:0
5431000001:0
5441000002:1
5452:1
546+inf:0
547-inf:0
548123.456:0
549-123.456:0
5500.01:0
551-0.01:0
552120:1
5531200:1
554-1200:1
555&is_positive
5560:1
5571:1
558-1:0
559-123:0
560NaN:0
561-inf:0
562+inf:1
563&is_negative
5640:0
5651:0
566-1:1
567-123:1
568NaN:0
569-inf:1
570+inf:0
a4e2b1c6 571&parts
5720:0 1
5731:1 1
574123:123 1
575-123:-123 1
576-1200:-1200 1
5775/7:5 7
578-5/7:-5 7
579NaNparts:NaN NaN
580+inf:inf inf
581-inf:-inf inf
184f15d5 582#&exponent
583#0:1
584#1:0
585#123:0
586#-123:0
587#-1200:2
588#+inf:inf
589#-inf:inf
590#NaNexponent:NaN
591#&mantissa
592#0:0
593#1:1
594#123:123
595#-123:-123
596#-1200:-12
597#+inf:inf
598#-inf:-inf
599#NaNmantissa:NaN
600#&length
601#123:3
602#-123:3
603#0:1
604#1:1
605#12345678901234567890:20
606&is_zero
607NaNzero:0
608+inf:0
609-inf:0
6100:1
611-1:0
6121:0
6130/3:1
6141/3:0
615&is_one
616NaNone:0
617+inf:0
618-inf:0
6190:0
6202:0
6211:1
622-1:0
623-2:0
6241/3:0
625100/100:1
6260.1/0.1:1
627&ffloor
6280:0
629abc:NaN
630+inf:inf
631-inf:-inf
6321:1
633-51:-51
634-51.2:-52
63512.2:12
a4e2b1c6 6363/7:0
6376/7:0
6387/7:1
6398/7:1
64013/7:1
64114/7:2
64215/7:2
643-3/7:-1
644-6/7:-1
645-7/1:-7
646-8/7:-2
647-13/7:-2
648-14/7:-2
649-15/7:-3
184f15d5 650&fceil
6510:0
652abc:NaN
653+inf:inf
654-inf:-inf
6551:1
656-51:-51
657-51.2:-51
65812.2:13
a4e2b1c6 6593/7:1
6606/7:1
6618/7:2
66213/7:2
66314/7:2
66415/7:3
665-3/7:0
666-6/7:0
667-8/7:-1
668-13/7:-1
669-14/7:-2
670-15/7:-2
671&ffac
672NaN:NaN
6731:1
674-1:NaN
675&bpow
676# bpow test for overload of **
6772:2:4
6783:3:27
679&fpow
6802/1:3/1:8
6813/1:3/1:27
6825/2:3/1:125/8
683-2/1:3/1:-8
684-3/1:3/1:-27
685-5/2:3/1:-125/8
686-2/1:4/1:16
687-3/1:4/1:81
688-5/2:4/1:625/16
689-5/2:-4/1:16/625
6901/5:-3:125
691-1/5:-3:-125
692&numerator
693NaN:NaN
694inf:inf
695-inf:-inf
6963/7:3
697-3/7:-3
6980:0
6991:1
700&denominator
701NaN:NaN
702inf:inf
703-inf:-inf
7043/7:7
7050:1
7061/1:1
707-3/7:7
708&finc
7093/2:5/2
710-15/6:-3/2
711NaN:NaN
712-1/3:2/3
713-2/7:5/7
714&fdec
71515/6:3/2
716-3/2:-5/2
7171/3:-2/3
7182/7:-5/7
719NaN:NaN