Move Math::BigRat from ext/ to cpan/
[p5sagit/p5-mst-13.2.git] / cpan / Math-BigRat / t / bigratpm.inc
1 #include this file into another test for subclass testing...
2
3 ok ($class->config()->{lib},$CL);
4
5 $setup = '';
6
7 while (<DATA>)
8   {
9   chomp;
10   $_ =~ s/#.*$//;       # remove comments
11   $_ =~ s/\s+$//;       # trailing spaces
12   next if /^$/;         # skip empty lines & comments
13   if (s/^&//)
14     {
15     $f = $_;
16     }
17   elsif (/^\$/)
18     {
19     $setup = $_; $setup =~ s/\$/\$${class}::/g; # round_mode, div_scale
20     #print "\$setup== $setup\n";
21     }
22   else
23     {
24     if (m|^(.*?):(/.+)$|)
25       {
26       $ans = $2;
27       @args = split(/:/,$1,99);
28       }
29     else
30       {
31       @args = split(/:/,$_,99); $ans = pop(@args);
32       }
33     $try = "\$x = new $class \"$args[0]\";";
34     if ($f eq "bnorm")
35       {
36         $try .= "\$x;";
37       } elsif ($f eq "finf") {
38         my $a = $args[1] || '';
39         $try .= "\$x->binf('$a');";
40       } elsif ($f eq "is_inf") {
41         $try .= "\$x->is_inf('$args[1]');"; 
42       } elsif ($f eq "fone") {
43         $try .= "\$x->bone('$args[1]');";
44       } elsif ($f eq "fstr") {
45         $try .= "\$x->accuracy($args[1]); \$x->precision($args[2]);";
46         $try .= '$x->bstr();';
47       } elsif ($f eq "parts") {
48         # ->bstr() to see if an object is returned
49         $try .= '($a,$b) = $x->parts(); $a = $a->bstr(); $b = $b->bstr();';
50         $try .= '"$a $b";';
51       } elsif ($f eq "numerator") {
52         # ->bstr() to see if an object is returned
53         $try .= '$x->numerator()->bstr();';
54       } elsif ($f eq "denominator") {
55         # ->bstr() to see if an object is returned
56         $try .= '$x->denominator()->bstr();';
57       } elsif ($f =~ /^(length|numify)$/) {
58         $try .= "\$x->$f();";
59       # some unary ops (can't test the fxxx form, since no AUTOLOAD in BigRat)
60       } elsif ($f =~ /^f(nan|sstr|neg|floor|ceil|abs)$/) {
61         $try .= "\$x->b$1();";
62       # some is_xxx test function       
63       } elsif ($f =~ /^is_(zero|one|pos|neg|negative|positive|odd|even|nan|int)\z/) {
64         $try .= "\$x->$f();";
65       } elsif ($f =~ /^(as_number|as_int)\z/){
66         $try .= "\$x->$1();";
67       } elsif ($f eq "finc") {
68         $try .= '++$x;';
69       } elsif ($f eq "fdec") {
70         $try .= '--$x;';
71       } elsif ($f eq "digit") {
72         $try .= "\$x->digit($args[1]);";
73       } elsif ($f eq "fround") {
74         $try .= "$setup; \$x->bround($args[1]);";
75       } elsif ($f eq "ffround") {
76         $try .= "$setup; \$x->bfround($args[1]);";
77       } elsif ($f eq "fsqrt") {
78         $try .= "$setup; \$x->bsqrt();";
79       } elsif ($f eq "flog") {
80         $try .= "$setup; \$x->blog();";
81       } elsif ($f eq "ffac") {
82         $try .= "$setup; \$x->bfac();";
83       }
84     else
85       {
86       $try .= "\$y = new $class \"$args[1]\";";
87       if ($f eq "bcmp") {
88         $try .= '$x <=> $y;';
89       } elsif ($f eq "bacmp") {
90         $try .= '$x->bacmp($y);';
91       } elsif ($f eq "bpow") {
92         $try .= '$x ** $y;';
93       } elsif ($f eq "fpow") {
94         $try .= '$x->bpow($y);';
95       } elsif ($f eq "badd") {
96         $try .= '$x + $y;';
97       } elsif ($f eq "bsub") {
98         $try .= '$x - $y;';
99       } elsif ($f eq "bmul") {
100         $try .= '$x * $y;';
101       } elsif ($f eq "bdiv") {
102         $try .= "$setup; \$x / \$y;";
103       } elsif ($f eq "fdiv-list") {
104         $try .= "$setup; join(',',\$x->bdiv(\$y));";
105       } elsif ($f eq "brsft") {
106         $try .= '$x >> $y;';
107       } elsif ($f eq "blsft") {
108         $try .= '$x << $y;';
109       } elsif ($f eq "bmod") {
110         $try .= '$x % $y;';
111       } elsif( $f eq "bmodinv") {
112        $try .= "\$x->bmodinv(\$y);";
113       } elsif( $f eq "blog") {
114        $try .= "\$x->blog(\$y);";
115       } else {
116         $try .= "\$z = $class->new(\"$args[2]\");";
117
118         # Functions with three arguments
119         if( $f eq "bmodpow") {
120           $try .= "\$x->bmodpow(\$y,\$z);";
121         } else { warn "Unknown op '$f'"; }
122       }
123     }
124     # print "# Trying: '$try'\n";
125     $ans1 = eval $try;
126     if ($ans =~ m|^/(.*)$|)
127       {
128       my $pat = $1;
129       if ($ans1 =~ /$pat/)
130         {
131         ok (1,1);
132         }
133       else
134         {
135         print "# '$try' expected: /$pat/ got: '$ans1'\n" if !ok(1,0);
136         }
137       }
138     else
139       {
140       if ($ans eq "")
141         {
142         ok_undef ($ans1);
143         }
144       else
145         {
146         print "# Tried: '$try'\n" if !ok ($ans1, $ans);
147 #        if (ref($ans1) eq "$class")
148 #         {
149 #         # float numbers are normalized (for now), so mantissa shouldn't have
150 #         # trailing zeros
151 #         #print $ans1->_trailing_zeros(),"\n";
152 #          print "# Has trailing zeros after '$try'\n"
153 #          if !ok ($ans1->{_m}->_trailing_zeros(), 0);
154 #         }
155         }
156       } # end pattern or string
157     }
158   } # end while
159
160 # check whether $class->new( Math::BigInt->new()) destroys it 
161 # ($y == 12 in this case)
162 $x = Math::BigInt->new(1200); $y = $class->new($x);
163 ok ($y,1200); ok ($x,1200);
164
165 ###############################################################################
166 # zero,inf,one,nan
167
168 $x = $class->new(2); $x->bzero(); ok_undef ($x->{_a}); ok_undef ($x->{_p});
169 $x = $class->new(2); $x->binf();  ok_undef ($x->{_a}); ok_undef ($x->{_p});
170 $x = $class->new(2); $x->bone();  ok_undef ($x->{_a}); ok_undef ($x->{_p});
171 $x = $class->new(2); $x->bnan();  ok_undef ($x->{_a}); ok_undef ($x->{_p});
172         
173 1; # all done
174
175 ###############################################################################
176 # Perl 5.005 does not like ok ($x,undef)
177
178 sub ok_undef
179   {
180   my $x = shift;
181
182   ok (1,1) and return if !defined $x;
183   ok ($x,'undef');
184   }
185
186 __DATA__
187 &digit
188 123:2:1
189 1234:0:4
190 1234:1:3
191 1234:2:2
192 1234:3:1
193 1234:-1:1
194 1234:-2:2
195 1234:-3:3
196 1234:-4:4
197 0:0:0
198 0:1:0
199 &bmodinv
200 # format: number:modulus:result
201 # bmodinv Data errors
202 abc:abc:NaN
203 abc:5:NaN
204 5:abc:NaN
205 # bmodinv Expected Results from normal use
206 1:5:1
207 3:5:2
208 -2:5:2
209 8:5033:4404
210 1234567891:13:6
211 -1234567891:13:7
212 324958749843759385732954874325984357439658735983745:2348249874968739:1741662881064902
213 ## bmodinv Error cases / useless use of function
214 3:-5:NaN
215 inf:5:NaN
216 5:inf:NaN
217 -inf:5:NaN
218 5:-inf:NaN
219 &as_number
220 144/7:20
221 12/1:12
222 -12/1:-12
223 -12/3:-4
224 NaN:NaN
225 +inf:inf
226 -inf:-inf
227 &as_int
228 144/7:20
229 12/1:12
230 -12/1:-12
231 -12/3:-4
232 NaN:NaN
233 +inf:inf
234 -inf:-inf
235 &bmodpow
236 # format: number:exponent:modulus:result
237 # bmodpow Data errors
238 abc:abc:abc:NaN
239 5:abc:abc:NaN
240 abc:5:abc:NaN
241 abc:abc:5:NaN
242 5:5:abc:NaN
243 5:abc:5:NaN
244 abc:5:5:NaN
245 # bmodpow Expected results
246 0:0:2:1
247 1:0:2:1
248 0:0:1:0
249 8:7:5032:3840
250 8:-1:5033:4404
251 98436739867439843769485798542749827593285729587325:43698764986460981048259837659386739857456983759328457:6943857329857295827698367:3104744730915914415259518
252 # bmodpow Error cases
253 8:8:-5:NaN
254 8:-1:16:NaN
255 inf:5:13:NaN
256 5:inf:13:NaN
257 &bmod
258 NaN:1:NaN
259 1:NaN:NaN
260 1:1:0
261 2:2:0
262 12:6:0
263 7/4:4/14:1/28
264 7/4:4/16:0
265 -7/4:4/16:0
266 -7/4:-4/16:0
267 7/4:-4/16:0
268 7/4:4/32:0
269 -7/4:4/32:0
270 -7/4:-4/32:0
271 7/4:-4/32:0
272 7/4:4/28:1/28
273 -7/4:4/28:-1/28
274 7/4:-4/28:1/28
275 -7/4:-4/28:-1/28
276 &fsqrt
277 1:1
278 0:0
279 NaN:NaN
280 +inf:inf
281 -inf:NaN
282 144:12
283 # sqrt(144) / sqrt(4) = 12/2 = 6/1
284 144/4:6
285 25/16:5/4
286 -3:NaN
287 &flog
288 NaN:NaN
289 0:NaN
290 -2:NaN
291 &blog
292 NaN:NaN:NaN
293 0:NaN:NaN
294 NaN:0:NaN
295 NaN:1:NaN
296 1:NaN:NaN
297 0:2:NaN
298 0:-2:NaN
299 3:-2:NaN
300 &finf
301 1:+:inf
302 2:-:-inf
303 3:abc:inf
304 &numify
305 0:0
306 +1:1
307 1234:1234
308 3/4:0.75
309 5/2:2.5
310 3/2:1.5
311 5/4:1.25
312 NaN:NaN
313 +inf:inf
314 -inf:-inf
315 &fnan
316 abc:NaN
317 2:NaN
318 -2:NaN
319 0:NaN
320 &fone
321 2:+:1
322 -2:-:-1
323 -2:+:1
324 2:-:-1
325 0::1
326 -2::1
327 abc::1
328 2:abc:1
329 &fsstr
330 +inf:inf
331 -inf:-inf
332 abcfsstr:NaN
333 1:1/1
334 3/1:3/1
335 0.1:1/10
336 &bnorm
337 1:1
338 -0:0
339 bnormNaN:NaN
340 +inf:inf
341 -inf:-inf
342 inf/inf:NaN
343 5/inf:0
344 5/-inf:0
345 inf/5:inf
346 -inf/5:-inf
347 inf/-5:-inf
348 -inf/-5:inf
349 123:123
350 -123.4567:-1234567/10000
351 # invalid inputs
352 1__2:NaN
353 1E1__2:NaN
354 11__2E2:NaN
355 #1.E3:NaN
356 .2E-3.:NaN
357 #1e3e4:NaN
358 .2E2:20
359 inf:inf
360 +inf:inf
361 -inf:-inf
362 +infinity:NaN
363 +-inf:NaN
364 abc:NaN
365    1 a:NaN
366 1bcd2:NaN
367 11111b:NaN
368 +1z:NaN
369 -1z:NaN
370 0:0
371 +0:0
372 +00:0
373 +0_0_0:0
374 000000_0000000_00000:0
375 -0:0
376 -0000:0
377 +1:1
378 +01:1
379 +001:1
380 +00000100000:100000
381 +00000800/00000010:80
382 -00000800/00000010:-80
383 +00000800/-00000010:-80
384 -00000800/-00000010:80
385 123456789:123456789
386 -1:-1
387 -01:-1
388 -001:-1
389 -123456789:-123456789
390 -00000100000:-100000
391 123.456a:NaN
392 123.456:15432/125
393 0.01:1/100
394 .002:1/500
395 +.2:1/5
396 -0.0003:-3/10000
397 -.0000000004:-1/2500000000
398 123456E2:12345600
399 123456E-2:30864/25
400 -123456E2:-12345600
401 -123456E-2:-30864/25
402 1e1:10
403 2e-11:1/50000000000
404 12/10:6/5
405 0.1/0.1:1
406 100/0.1:1000
407 0.1/10:1/100
408 1 / 3:1/3
409 1/ 3:1/3
410 1 /3:1/3
411 &fneg
412 fnegNaN:NaN
413 +inf:-inf
414 -inf:inf
415 +0:0
416 +1:-1
417 -1:1
418 +123456789:-123456789
419 -123456789:123456789
420 +123.456789:-123456789/1000000
421 -123456.789:123456789/1000
422 123/7:-123/7
423 -123/7:123/7
424 123/-7:123/7
425 &fabs
426 fabsNaN:NaN
427 +inf:inf
428 -inf:inf
429 +0:0
430 +1:1
431 -1:1
432 +123456789:123456789
433 -123456789:123456789
434 +123.456789:123456789/1000000
435 -123456.789:123456789/1000
436 &badd
437 abc:abc:NaN
438 abc:+0:NaN
439 +0:abc:NaN
440 +inf:-inf:NaN
441 -inf:+inf:NaN
442 +inf:+inf:inf
443 -inf:-inf:-inf
444 baddNaN:+inf:NaN
445 baddNaN:+inf:NaN
446 +inf:baddNaN:NaN
447 -inf:baddNaN:NaN
448 +0:+0:0
449 +1:+0:1
450 +0:+1:1
451 +1:+1:2
452 -1:+0:-1
453 +0:-1:-1
454 -1:-1:-2
455 -1:+1:0
456 +1:-1:0
457 +9:+1:10
458 +99:+1:100
459 +999:+1:1000
460 +9999:+1:10000
461 +99999:+1:100000
462 +999999:+1:1000000
463 +9999999:+1:10000000
464 +99999999:+1:100000000
465 +999999999:+1:1000000000
466 +9999999999:+1:10000000000
467 +99999999999:+1:100000000000
468 +10:-1:9
469 +100:-1:99
470 +1000:-1:999
471 +10000:-1:9999
472 +100000:-1:99999
473 +1000000:-1:999999
474 +10000000:-1:9999999
475 +100000000:-1:99999999
476 +1000000000:-1:999999999
477 +10000000000:-1:9999999999
478 +123456789:+987654321:1111111110
479 -123456789:+987654321:864197532
480 -123456789:-987654321:-1111111110
481 +123456789:-987654321:-864197532
482 1/3:1/3:2/3
483 2/3:-1/3:1/3
484 &bsub
485 abc:abc:NaN
486 abc:+0:NaN
487 +0:abc:NaN
488 +inf:-inf:inf
489 -inf:+inf:-inf
490 +inf:+inf:NaN
491 -inf:-inf:NaN
492 baddNaN:+inf:NaN
493 baddNaN:+inf:NaN
494 +inf:baddNaN:NaN
495 -inf:baddNaN:NaN
496 +0:+0:0
497 +1:+0:1
498 +0:+1:-1
499 +1:+1:0
500 -1:+0:-1
501 +0:-1:1
502 -1:-1:0
503 -1:+1:-2
504 +1:-1:2
505 +9:+1:8
506 +99:+1:98
507 +999:+1:998
508 +9999:+1:9998
509 +99999:+1:99998
510 +999999:+1:999998
511 +9999999:+1:9999998
512 +99999999:+1:99999998
513 +999999999:+1:999999998
514 +9999999999:+1:9999999998
515 +99999999999:+1:99999999998
516 +10:-1:11
517 +100:-1:101
518 +1000:-1:1001
519 +10000:-1:10001
520 +100000:-1:100001
521 +1000000:-1:1000001
522 +10000000:-1:10000001
523 +100000000:-1:100000001
524 +1000000000:-1:1000000001
525 +10000000000:-1:10000000001
526 +123456789:+987654321:-864197532
527 -123456789:+987654321:-1111111110
528 -123456789:-987654321:864197532
529 +123456789:-987654321:1111111110
530 2/3:1/3:1/3
531 7/27:3/54:11/54
532 -2/3:+2/3:-4/3
533 -2/3:-2/3:0
534 0:-123:123
535 0:123:-123
536 &bmul
537 abc:abc:NaN
538 abc:+0:NaN
539 +0:abc:NaN
540 +inf:NaNmul:NaN
541 +inf:NaNmul:NaN
542 NaNmul:+inf:NaN
543 NaNmul:-inf:NaN
544 +inf:+inf:inf
545 +inf:-inf:-inf
546 +inf:-inf:-inf
547 +inf:+inf:inf
548 +inf:123.34:inf
549 +inf:-123.34:-inf
550 -inf:123.34:-inf
551 -inf:-123.34:inf
552 123.34:+inf:inf
553 -123.34:+inf:-inf
554 123.34:-inf:-inf
555 -123.34:-inf:inf
556 +0:+0:0
557 +0:+1:0
558 +1:+0:0
559 +0:-1:0
560 -1:+0:0
561 +123456789123456789:+0:0
562 +0:+123456789123456789:0
563 -1:-1:1
564 -1:+1:-1
565 +1:-1:-1
566 +1:+1:1
567 +2:+3:6
568 -2:+3:-6
569 +2:-3:-6
570 -2:-3:6
571 +111:+111:12321
572 +10101:+10101:102030201
573 +1001001:+1001001:1002003002001
574 +100010001:+100010001:10002000300020001
575 +10000100001:+10000100001:100002000030000200001
576 +11111111111:+9:99999999999
577 +22222222222:+9:199999999998
578 +33333333333:+9:299999999997
579 +44444444444:+9:399999999996
580 +55555555555:+9:499999999995
581 +66666666666:+9:599999999994
582 +77777777777:+9:699999999993
583 +88888888888:+9:799999999992
584 +99999999999:+9:899999999991
585 6:120:720
586 10:10000:100000
587 1/4:1/3:1/12
588 &bdiv
589 $div_scale = 40; $round_mode = 'even'
590 abc:abc:NaN
591 abc:+1:abc:NaN
592 +1:abc:NaN
593 -1:abc:NaN
594 0:abc:NaN
595 +0:+0:NaN
596 +0:+1:0
597 +1:+0:inf
598 +3214:+0:inf
599 +0:-1:0
600 -1:+0:-inf
601 -3214:+0:-inf
602 +1:+1:1
603 -1:-1:1
604 +1:-1:-1
605 -1:+1:-1
606 +1:+2:1/2
607 +2:+1:2
608 123:+inf:0
609 123:-inf:0
610 +10:+5:2
611 +100:+4:25
612 +1000:+8:125
613 +10000:+16:625
614 +10000:-16:-625
615 +999999999999:+9:111111111111
616 +999999999999:+99:10101010101
617 +999999999999:+999:1001001001
618 +999999999999:+9999:100010001
619 +999999999999999:+99999:10000100001
620 +1000000000:+9:1000000000/9
621 +2000000000:+9:2000000000/9
622 +3000000000:+9:1000000000/3
623 +4000000000:+9:4000000000/9
624 +5000000000:+9:5000000000/9
625 +6000000000:+9:2000000000/3
626 +7000000000:+9:7000000000/9
627 +8000000000:+9:8000000000/9
628 +9000000000:+9:1000000000
629 +35500000:+113:35500000/113
630 +71000000:+226:35500000/113
631 +106500000:+339:35500000/113
632 +1000000000:+3:1000000000/3
633 2:25.024996000799840031993601279744051189762:1000000000000000000000000000000000000000/12512498000399920015996800639872025594881
634 123456:1:123456
635 1/4:1/3:3/4
636 # reset scale for further tests
637 $div_scale = 40
638 &is_nan
639 123:0
640 abc:1
641 NaN:1
642 -123:0
643 &is_inf
644 +inf::1
645 -inf::1
646 abc::0
647 1::0
648 NaN::0
649 -1::0
650 +inf:-:0
651 +inf:+:1
652 -inf:-:1
653 -inf:+:0
654 # it must be exactly /^[+-]inf$/
655 +infinity::0
656 -infinity::0
657 &is_odd
658 abc:0
659 0:0
660 -1:1
661 -3:1
662 1:1
663 3:1
664 1000001:1
665 1000002:0
666 +inf:0
667 -inf:0
668 123.45:0
669 -123.45:0
670 2:0
671 &is_int
672 NaNis_int:0
673 0:1
674 1:1
675 2:1
676 -2:1
677 -1:1
678 -inf:0
679 +inf:0
680 123.4567:0
681 -0.1:0
682 -0.002:0
683 1/3:0
684 3/1:1
685 &is_even
686 abc:0
687 0:1
688 -1:0
689 -3:0
690 1:0
691 3:0
692 1000001:0
693 1000002:1
694 2:1
695 +inf:0
696 -inf:0
697 123.456:0
698 -123.456:0
699 0.01:0
700 -0.01:0
701 120:1
702 1200:1
703 -1200:1
704 &is_pos
705 0:0
706 1:1
707 -1:0
708 -123:0
709 NaN:0
710 -inf:0
711 +inf:1
712 &is_positive
713 0:0
714 1:1
715 -1:0
716 -123:0
717 NaN:0
718 -inf:0
719 +inf:1
720 &is_neg
721 0:0
722 1:0
723 -1:1
724 -123:1
725 NaN:0
726 -inf:1
727 +inf:0
728 &is_negative
729 0:0
730 1:0
731 -1:1
732 -123:1
733 NaN:0
734 -inf:1
735 +inf:0
736 &parts
737 0:0 1
738 1:1 1
739 123:123 1
740 -123:-123 1
741 -1200:-1200 1
742 5/7:5 7
743 -5/7:-5 7
744 NaNparts:NaN NaN
745 +inf:inf inf
746 -inf:-inf inf
747 &length
748 123:3
749 -123:3
750 0:1
751 1:1
752 12345678901234567890:20
753 &is_zero
754 NaNzero:0
755 +inf:0
756 -inf:0
757 0:1
758 -1:0
759 1:0
760 0/3:1
761 1/3:0
762 -0/3:1
763 5/inf:1
764 &is_one
765 NaNone:0
766 +inf:0
767 -inf:0
768 0:0
769 2:0
770 1:1
771 -1:0
772 -2:0
773 1/3:0
774 100/100:1
775 0.1/0.1:1
776 5/inf:0
777 &ffloor
778 0:0
779 abc:NaN
780 +inf:inf
781 -inf:-inf
782 1:1
783 -51:-51
784 -51.2:-52
785 12.2:12
786 3/7:0
787 6/7:0
788 7/7:1
789 8/7:1
790 13/7:1
791 14/7:2
792 15/7:2
793 -3/7:-1
794 -6/7:-1
795 -7/1:-7
796 -8/7:-2
797 -13/7:-2
798 -14/7:-2
799 -15/7:-3
800 &fceil
801 0:0
802 abc:NaN
803 +inf:inf
804 -inf:-inf
805 1:1
806 -51:-51
807 -51.2:-51
808 12.2:13
809 3/7:1
810 6/7:1
811 8/7:2
812 13/7:2
813 14/7:2
814 15/7:3
815 -3/7:0
816 -6/7:0
817 -8/7:-1
818 -13/7:-1
819 -14/7:-2
820 -15/7:-2
821 &ffac
822 NaN:NaN
823 1:1
824 -1:NaN
825 &bpow
826 # bpow test for overload of **
827 2:2:4
828 3:3:27
829 &bacmp
830 +0:-0:0
831 +0:+1:-1
832 -1:+1:0
833 +1:-1:0
834 -1:+2:-1
835 +2:-1:1
836 -123456789:+987654321:-1
837 +123456789:-987654321:-1
838 +987654321:+123456789:1
839 -987654321:+123456789:1
840 -123:+4567889:-1
841 # NaNs
842 acmpNaN:123:
843 123:acmpNaN:
844 acmpNaN:acmpNaN:
845 # infinity
846 +inf:+inf:0
847 -inf:-inf:0
848 +inf:-inf:0
849 -inf:+inf:0
850 +inf:123:1
851 -inf:123:1
852 +inf:-123:1
853 -inf:-123:1
854 +inf:1/23:1
855 -inf:1/23:1
856 +inf:-1/23:1
857 -inf:-1/23:1
858 +inf:12/3:1
859 -inf:12/3:1
860 +inf:-12/3:1
861 -inf:-12/3:1
862 123:inf:-1
863 -123:inf:-1
864 123:-inf:-1
865 -123:-inf:-1
866 1/23:inf:-1
867 -1/23:inf:-1
868 1/23:-inf:-1
869 -1/23:-inf:-1
870 12/3:inf:-1
871 -12/3:inf:-1
872 12/3:-inf:-1
873 -12/3:-inf:-1
874 # return undef
875 +inf:NaN:
876 NaN:inf:
877 -inf:NaN:
878 NaN:-inf:
879 1/3:2/3:-1
880 2/3:1/3:1
881 2/3:2/3:0
882 &fpow
883 2/1:3/1:8
884 3/1:3/1:27
885 5/2:3/1:125/8
886 -2/1:3/1:-8
887 -3/1:3/1:-27
888 -5/2:3/1:-125/8
889 -2/1:4/1:16
890 -3/1:4/1:81
891 -5/2:4/1:625/16
892 -5/2:-4/1:16/625
893 1/5:-3:125
894 -1/5:-3:-125
895 &numerator
896 NaN:NaN
897 inf:inf
898 -inf:-inf
899 3/7:3
900 -3/7:-3
901 0:0
902 1:1
903 5/-3:-5
904 &denominator
905 NaN:NaN
906 inf:1
907 -inf:1
908 3/7:7
909 0:1
910 1/1:1
911 -1/1:1
912 -3/7:7
913 4/-5:5
914 &finc
915 3/2:5/2
916 -15/6:-3/2
917 NaN:NaN
918 -1/3:2/3
919 -2/7:5/7
920 &fdec
921 15/6:3/2
922 -3/2:-5/2
923 1/3:-2/3
924 2/7:-5/7
925 NaN:NaN