This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Forgot from the M::BI 1.54 update.
[perl5.git] / lib / Math / BigInt / t / upgrade.inc
1 #include this file into another for subclass testing
2
3 # This file is nearly identical to bigintpm.t, except that certain results
4 # are _requird_ to be different due to "upgrading" or "promoting" to BigFloat.
5 # The reverse is not true, any unmarked results can be either BigInt or
6 # BigFloat, depending on how good the internal optimization is (e.g. it
7 # is usually desirable to have 2 ** 2 return an BigInt, not an BigFloat).
8
9 # Results that are required to be BigFloat are marked with an "^" at the end.
10
11 # Please note that the testcount goes up by two for each extra result marked
12 # with ^, since then we test whether it has the proper class and that it left
13 # the upgrade variable alone.
14
15 my $version = ${"$class\::VERSION"};
16
17 ##############################################################################
18 # for testing inheritance of _swap
19
20 package Math::Foo;
21
22 use Math::BigInt lib => $main::CL;
23 use vars qw/@ISA/;
24 @ISA = (qw/Math::BigInt/);
25
26 use overload
27 # customized overload for sub, since original does not use swap there
28 '-'     =>      sub { my @a = ref($_[0])->_swap(@_);
29                    $a[0]->bsub($a[1])};
30
31 sub _swap
32   {
33   # a fake _swap, which reverses the params
34   my $self = shift;                     # for override in subclass
35   if ($_[2])
36     {
37     my $c = ref ($_[0] ) || 'Math::Foo';
38     return ( $_[0]->copy(), $_[1] );
39     }
40   else
41     {
42     return ( Math::Foo->new($_[1]), $_[0] );
43     }
44   }
45
46 ##############################################################################
47 package main;
48
49 my $CALC = $class->config()->{lib}; ok ($CALC,$CL);
50
51 my ($f,$z,$a,$exp,@a,$m,$e,$round_mode,$expected_class);
52
53 while (<DATA>) 
54   {
55   chop;
56   next if /^#/; # skip comments
57   if (s/^&//) 
58     {
59     $f = $_; next;
60     }
61   elsif (/^\$/) 
62     {
63     $round_mode = $_; $round_mode =~ s/^\$/$class\->/; next;
64     }
65
66   @args = split(/:/,$_,99); $ans = pop(@args);
67   $expected_class = $class;
68   if ($ans =~ /\^$/)
69     {
70     $expected_class = $ECL; $ans =~ s/\^$//;
71     }
72   $try = "\$x = $class->new(\"$args[0]\");";
73   if ($f eq "bnorm")
74     {
75     $try = "\$x = $class->bnorm(\"$args[0]\");";
76   # some is_xxx tests
77    } elsif ($f =~ /^is_(zero|one|odd|even|negative|positive|nan|int)$/) {
78     $try .= "\$x->$f();";
79    } elsif ($f eq "as_hex") {
80     $try .= '$x->as_hex();';
81    } elsif ($f eq "as_bin") {
82     $try .= '$x->as_bin();';
83    } elsif ($f eq "is_inf") {
84     $try .= "\$x->is_inf('$args[1]');";
85    } elsif ($f eq "binf") {
86     $try .= "\$x->binf('$args[1]');";
87    } elsif ($f eq "bone") {
88     $try .= "\$x->bone('$args[1]');";
89    # some unary ops
90    } elsif ($f =~ /^b(nan|floor|ceil|sstr|neg|abs|inc|dec|not|sqrt|fac)$/) {
91     $try .= "\$x->$f();";
92    } elsif ($f eq "length") {
93     $try .= '$x->length();';
94    } elsif ($f eq "exponent"){
95     # ->bstr() to see if an object is returned
96     $try .= '$x = $x->exponent()->bstr();';
97    } elsif ($f eq "mantissa"){
98     # ->bstr() to see if an object is returned
99     $try .= '$x = $x->mantissa()->bstr();';
100    } elsif ($f eq "parts"){
101     $try .= '($m,$e) = $x->parts();'; 
102     # ->bstr() to see if an object is returned
103     $try .= '$m = $m->bstr(); $m = "NaN" if !defined $m;';
104     $try .= '$e = $e->bstr(); $e = "NaN" if !defined $e;';
105     $try .= '"$m,$e";';
106    } else {
107     if ($args[1] !~ /\./)
108       {
109       $try .= "\$y = $class->new(\"$args[1]\");";       # BigInt
110       }
111     else
112       {
113       $try .= "\$y = $ECL->new(\"$args[1]\");";         # BigFloat
114       }
115     if ($f eq "bcmp")
116       {
117       $try .= '$x <=> $y;';
118       } elsif ($f eq "bround") {
119       $try .= "$round_mode; \$x->bround(\$y);";
120       } elsif ($f eq "bacmp"){
121       $try .= '$x->bacmp($y);';
122       } elsif ($f eq "badd"){
123       $try .= '$x + $y;';
124       } elsif ($f eq "bsub"){
125       $try .= '$x - $y;';
126       } elsif ($f eq "bmul"){
127       $try .= '$x * $y;';
128       } elsif ($f eq "bdiv"){
129       $try .= '$x / $y;';
130       } elsif ($f eq "bdiv-list"){
131       $try .= 'join (",",$x->bdiv($y));';
132       # overload via x=
133       } elsif ($f =~ /^.=$/){
134       $try .= "\$x $f \$y;";
135       # overload via x
136       } elsif ($f =~ /^.$/){
137       $try .= "\$x $f \$y;";
138       } elsif ($f eq "bmod"){
139       $try .= '$x % $y;';
140       } elsif ($f eq "bgcd")
141         {
142         if (defined $args[2])
143           {
144           $try .= " \$z = $class->new('$args[2]'); ";
145           }
146         $try .= "$class\::bgcd(\$x, \$y";
147         $try .= ", \$z" if (defined $args[2]);
148         $try .= " );";
149         }
150       elsif ($f eq "blcm")
151         {
152         if (defined $args[2])
153           {
154           $try .= " \$z = $class->new('$args[2]'); ";
155           }
156         $try .= "$class\::blcm(\$x, \$y";
157         $try .= ", \$z" if (defined $args[2]);
158         $try .= " );";
159       }elsif ($f eq "blsft"){
160         if (defined $args[2])
161           {
162           $try .= "\$x->blsft(\$y,$args[2]);";
163           }
164         else
165           {
166           $try .= "\$x << \$y;";
167           }
168       }elsif ($f eq "brsft"){
169         if (defined $args[2])
170           {
171           $try .= "\$x->brsft(\$y,$args[2]);";
172           }
173         else
174           {
175           $try .= "\$x >> \$y;";
176           }
177       }elsif ($f eq "band"){
178         $try .= "\$x & \$y;";
179       }elsif ($f eq "bior"){
180         $try .= "\$x | \$y;";
181       }elsif ($f eq "bxor"){
182         $try .= "\$x ^ \$y;";
183       }elsif ($f eq "bpow"){
184         $try .= "\$x ** \$y;";
185       }elsif ($f eq "digit"){
186         $try = "\$x = $class->new('$args[0]'); \$x->digit($args[1]);";
187       } else { warn "Unknown op '$f'"; }
188     } # end else all other ops
189
190   $ans1 = eval $try;
191   # convert hex/binary targets to decimal       
192   if ($ans =~ /^(0x0x|0b0b)/)
193     {
194     $ans =~ s/^0[xb]//; $ans = Math::BigInt->new($ans)->bstr();
195     }
196   if ($ans eq "")
197     {
198     ok_undef ($ans1); 
199     }
200   else
201     {
202     # print "try: $try ans: $ans1 $ans\n";
203     print "# Tried: '$try'\n" if !ok ($ans1, $ans);
204     if ($expected_class ne $class)
205       {
206       ok (ref($ans1),$expected_class);  # also checks that it really is ref!
207       ok ($Math::BigInt::upgrade,'Math::BigFloat');     # still okay?
208       }
209     }
210   # check internal state of number objects
211   is_valid($ans1,$f) if ref $ans1; 
212   } # endwhile data tests
213 close DATA;
214
215 # all tests done
216
217 1;
218
219 ###############################################################################
220 ###############################################################################
221 # Perl 5.005 does not like ok ($x,undef)
222
223 sub ok_undef
224   {
225   my $x = shift;
226
227   ok (1,1) and return if !defined $x;
228   ok ($x,'undef');
229   }
230
231 ###############################################################################
232 # sub to check validity of a BigInt internally, to ensure that no op leaves a
233 # number object in an invalid state (f.i. "-0")
234
235 sub is_valid
236   {
237   my ($x,$f,$c) = @_;
238
239   # The checks here are loosened a bit to allow BigInt or BigFloats to pass
240
241   my $e = 0;                    # error?
242   # ok as reference? 
243   # $e = "Not a reference to $c" if (ref($x) || '') ne $c;
244
245   # has ok sign?
246   $e = "Illegal sign $x->{sign} (expected: '+', '-', '-inf', '+inf' or 'NaN'"
247    if $e eq '0' && $x->{sign} !~ /^(\+|-|\+inf|-inf|NaN)$/;
248
249   $e = "-0 is invalid!" if $e ne '0' && $x->{sign} eq '-' && $x == 0;
250   #$e = $CALC->_check($x->{value}) if $e eq '0';
251
252   # test done, see if error did crop up
253   ok (1,1), return if ($e eq '0');
254
255   ok (1,$e." after op '$f'");
256   }
257
258 __DATA__
259 &.=
260 1234:-345:1234-345
261 &+=
262 1:2:3
263 -1:-2:-3
264 &-=
265 1:2:-1
266 -1:-2:1
267 &*=
268 2:3:6
269 -1:5:-5
270 &%=
271 100:3:1
272 8:9:8
273 &/=
274 100:3:33.33333333333333333333333333333333333333
275 -8:2:-4
276 &|=
277 2:1:3
278 &&=
279 5:7:5
280 &^=
281 5:7:2
282 &is_negative
283 0:0
284 -1:1
285 1:0
286 +inf:0
287 -inf:1
288 NaNneg:0
289 &is_positive
290 0:1
291 -1:0
292 1:1
293 +inf:1
294 -inf:0
295 NaNneg:0
296 &is_odd
297 abc:0
298 0:0
299 1:1
300 3:1
301 -1:1
302 -3:1
303 10000001:1
304 10000002:0
305 2:0
306 120:0
307 121:1
308 &is_int
309 NaN:0
310 inf:0
311 -inf:0
312 1:1
313 12:1
314 123e12:1
315 &is_even
316 abc:0
317 0:1
318 1:0
319 3:0
320 -1:0
321 -3:0
322 10000001:0
323 10000002:1
324 2:1
325 120:1
326 121:0
327 &bacmp
328 +0:-0:0
329 +0:+1:-1
330 -1:+1:0
331 +1:-1:0
332 -1:+2:-1
333 +2:-1:1
334 -123456789:+987654321:-1
335 +123456789:-987654321:-1
336 +987654321:+123456789:1
337 -987654321:+123456789:1
338 -123:+4567889:-1
339 # NaNs
340 acmpNaN:123:
341 123:acmpNaN:
342 acmpNaN:acmpNaN:
343 # infinity
344 +inf:+inf:0
345 -inf:-inf:0
346 +inf:-inf:0
347 -inf:+inf:0
348 +inf:123:1
349 -inf:123:1
350 +inf:-123:1
351 -inf:-123:1
352 # return undef
353 +inf:NaN:
354 NaN:inf:
355 -inf:NaN:
356 NaN:-inf:
357 &bnorm
358 123:123
359 12.3:12.3^
360 # binary input
361 0babc:NaN
362 0b123:NaN
363 0b0:0
364 -0b0:0
365 -0b1:-1
366 0b0001:1
367 0b001:1
368 0b011:3
369 0b101:5
370 0b1001:9
371 0b10001:17
372 0b100001:33
373 0b1000001:65
374 0b10000001:129
375 0b100000001:257
376 0b1000000001:513
377 0b10000000001:1025
378 0b100000000001:2049
379 0b1000000000001:4097
380 0b10000000000001:8193
381 0b100000000000001:16385
382 0b1000000000000001:32769
383 0b10000000000000001:65537
384 0b100000000000000001:131073
385 0b1000000000000000001:262145
386 0b10000000000000000001:524289
387 0b100000000000000000001:1048577
388 0b1000000000000000000001:2097153
389 0b10000000000000000000001:4194305
390 0b100000000000000000000001:8388609
391 0b1000000000000000000000001:16777217
392 0b10000000000000000000000001:33554433
393 0b100000000000000000000000001:67108865
394 0b1000000000000000000000000001:134217729
395 0b10000000000000000000000000001:268435457
396 0b100000000000000000000000000001:536870913
397 0b1000000000000000000000000000001:1073741825
398 0b10000000000000000000000000000001:2147483649
399 0b100000000000000000000000000000001:4294967297
400 0b1000000000000000000000000000000001:8589934593
401 0b10000000000000000000000000000000001:17179869185
402 0b_101:NaN
403 0b1_0_1:5
404 0b0_0_0_1:1
405 # hex input
406 -0x0:0
407 0xabcdefgh:NaN
408 0x1234:4660
409 0xabcdef:11259375
410 -0xABCDEF:-11259375
411 -0x1234:-4660
412 0x12345678:305419896
413 0x1_2_3_4_56_78:305419896
414 0xa_b_c_d_e_f:11259375
415 0x_123:NaN
416 0x9:9
417 0x11:17
418 0x21:33
419 0x41:65
420 0x81:129
421 0x101:257
422 0x201:513
423 0x401:1025
424 0x801:2049
425 0x1001:4097
426 0x2001:8193
427 0x4001:16385
428 0x8001:32769
429 0x10001:65537
430 0x20001:131073
431 0x40001:262145
432 0x80001:524289
433 0x100001:1048577
434 0x200001:2097153
435 0x400001:4194305
436 0x800001:8388609
437 0x1000001:16777217
438 0x2000001:33554433
439 0x4000001:67108865
440 0x8000001:134217729
441 0x10000001:268435457
442 0x20000001:536870913
443 0x40000001:1073741825
444 0x80000001:2147483649
445 0x100000001:4294967297
446 0x200000001:8589934593
447 0x400000001:17179869185
448 0x800000001:34359738369
449 # inf input
450 inf:inf
451 +inf:inf
452 -inf:-inf
453 0inf:NaN
454 # abnormal input
455 :NaN
456 abc:NaN
457    1 a:NaN
458 1bcd2:NaN
459 11111b:NaN
460 +1z:NaN
461 -1z:NaN
462 # only one underscore between two digits
463 _123:NaN
464 _123_:NaN
465 123_:NaN
466 1__23:NaN
467 1E1__2:NaN
468 1_E12:NaN
469 1E_12:NaN
470 1_E_12:NaN
471 +_1E12:NaN
472 +0_1E2:100
473 +0_0_1E2:100
474 -0_0_1E2:-100
475 -0_0_1E+0_0_2:-100
476 E1:NaN
477 E23:NaN
478 1.23E1:12.3^
479 1.23E-1:0.123^
480 # bug with two E's in number beeing valid
481 1e2e3:NaN
482 1e2r:NaN
483 1e2.0:NaN
484 # leading zeros
485 012:12
486 0123:123
487 01234:1234
488 012345:12345
489 0123456:123456
490 01234567:1234567
491 012345678:12345678
492 0123456789:123456789
493 01234567891:1234567891
494 012345678912:12345678912
495 0123456789123:123456789123
496 01234567891234:1234567891234
497 # normal input
498 0:0
499 +0:0
500 +00:0
501 +000:0
502 000000000000000000:0
503 -0:0
504 -0000:0
505 +1:1
506 +01:1
507 +001:1
508 +00000100000:100000
509 123456789:123456789
510 -1:-1
511 -01:-1
512 -001:-1
513 -123456789:-123456789
514 -00000100000:-100000
515 1_2_3:123
516 10000000000E-1_0:1
517 1E2:100
518 1E1:10
519 1E0:1
520 1.23E2:123
521 100E-1:10
522 # floating point input
523 # .2e2:20
524 1.E3:1000
525 1.01E2:101
526 1010E-1:101
527 -1010E0:-1010
528 -1010E1:-10100
529 1234.00:1234
530 # non-integer numbers
531 -1010E-2:-10.1^
532 -1.01E+1:-10.1^
533 -1.01E-1:-0.101^
534 &bnan
535 1:NaN
536 2:NaN
537 abc:NaN
538 &bone
539 2:+:1
540 2:-:-1
541 boneNaN:-:-1
542 boneNaN:+:1
543 2:abc:1
544 3::1
545 &binf
546 1:+:inf
547 2:-:-inf
548 3:abc:inf
549 &is_nan
550 123:0
551 abc:1
552 NaN:1
553 -123:0
554 &is_inf
555 +inf::1
556 -inf::1
557 abc::0
558 1::0
559 NaN::0
560 -1::0
561 +inf:-:0
562 +inf:+:1
563 -inf:-:1
564 -inf:+:0
565 # it must be exactly /^[+-]inf$/
566 +infinity::0
567 -infinity::0
568 &blsft
569 abc:abc:NaN
570 +2:+2:8
571 +1:+32:4294967296
572 +1:+48:281474976710656
573 +8:-2:NaN
574 # excercise base 10
575 +12345:4:10:123450000
576 -1234:0:10:-1234
577 +1234:0:10:1234
578 +2:2:10:200
579 +12:2:10:1200
580 +1234:-3:10:NaN
581 1234567890123:12:10:1234567890123000000000000
582 &brsft
583 abc:abc:NaN
584 +8:+2:2
585 +4294967296:+32:1
586 +281474976710656:+48:1
587 +2:-2:NaN
588 # excercise base 10
589 -1234:0:10:-1234
590 +1234:0:10:1234
591 +200:2:10:2
592 +1234:3:10:1
593 +1234:2:10:12
594 +1234:-3:10:NaN
595 310000:4:10:31
596 12300000:5:10:123
597 1230000000000:10:10:123
598 09876123456789067890:12:10:9876123
599 1234561234567890123:13:10:123456
600 &bsstr
601 1e+34:1e+34
602 123.456E3:123456e+0
603 100:1e+2
604 abc:NaN
605 &bneg
606 bnegNaN:NaN
607 +inf:-inf
608 -inf:inf
609 abd:NaN
610 0:0
611 1:-1
612 -1:1
613 +123456789:-123456789
614 -123456789:123456789
615 &babs
616 babsNaN:NaN
617 +inf:inf
618 -inf:inf
619 0:0
620 1:1
621 -1:1
622 +123456789:123456789
623 -123456789:123456789
624 &bcmp
625 bcmpNaN:bcmpNaN:
626 bcmpNaN:0:
627 0:bcmpNaN:
628 0:0:0
629 -1:0:-1
630 0:-1:1
631 1:0:1
632 0:1:-1
633 -1:1:-1
634 1:-1:1
635 -1:-1:0
636 1:1:0
637 123:123:0
638 123:12:1
639 12:123:-1
640 -123:-123:0
641 -123:-12:-1
642 -12:-123:1
643 123:124:-1
644 124:123:1
645 -123:-124:1
646 -124:-123:-1
647 100:5:1
648 -123456789:987654321:-1
649 +123456789:-987654321:1
650 -987654321:123456789:-1
651 -inf:5432112345:-1
652 +inf:5432112345:1
653 -inf:-5432112345:-1
654 +inf:-5432112345:1
655 +inf:+inf:0
656 -inf:-inf:0
657 +inf:-inf:1
658 -inf:+inf:-1
659 5:inf:-1
660 5:inf:-1
661 -5:-inf:1
662 -5:-inf:1
663 # return undef
664 +inf:NaN:
665 NaN:inf:
666 -inf:NaN:
667 NaN:-inf:
668 &binc
669 abc:NaN
670 +inf:inf
671 -inf:-inf
672 +0:1
673 +1:2
674 -1:0
675 &bdec
676 abc:NaN
677 +inf:inf
678 -inf:-inf
679 +0:-1
680 +1:0
681 -1:-2
682 &badd
683 abc:abc:NaN
684 abc:0:NaN
685 +0:abc:NaN
686 +inf:-inf:NaN
687 -inf:+inf:NaN
688 +inf:+inf:inf
689 -inf:-inf:-inf
690 baddNaN:+inf:NaN
691 baddNaN:+inf:NaN
692 +inf:baddNaN:NaN
693 -inf:baddNaN:NaN
694 0:0:0
695 1:0:1
696 0:1:1
697 1:1:2
698 -1:0:-1
699 0:-1:-1
700 -1:-1:-2
701 -1:+1:0
702 +1:-1:0
703 +9:+1:10
704 +99:+1:100
705 +999:+1:1000
706 +9999:+1:10000
707 +99999:+1:100000
708 +999999:+1:1000000
709 +9999999:+1:10000000
710 +99999999:+1:100000000
711 +999999999:+1:1000000000
712 +9999999999:+1:10000000000
713 +99999999999:+1:100000000000
714 +10:-1:9
715 +100:-1:99
716 +1000:-1:999
717 +10000:-1:9999
718 +100000:-1:99999
719 +1000000:-1:999999
720 +10000000:-1:9999999
721 +100000000:-1:99999999
722 +1000000000:-1:999999999
723 +10000000000:-1:9999999999
724 +123456789:987654321:1111111110
725 -123456789:987654321:864197532
726 -123456789:-987654321:-1111111110
727 +123456789:-987654321:-864197532
728 #2:2.5:4.5^
729 #-123:-1.5:-124.5^
730 #-1.2:1:-0.2^
731 &bsub
732 abc:abc:NaN
733 abc:+0:NaN
734 +0:abc:NaN
735 +inf:-inf:inf
736 -inf:+inf:-inf
737 +inf:+inf:NaN
738 -inf:-inf:NaN
739 +0:+0:0
740 +1:+0:1
741 +0:+1:-1
742 +1:+1:0
743 -1:+0:-1
744 +0:-1:1
745 -1:-1:0
746 -1:+1:-2
747 +1:-1:2
748 +9:+1:8
749 +99:+1:98
750 +999:+1:998
751 +9999:+1:9998
752 +99999:+1:99998
753 +999999:+1:999998
754 +9999999:+1:9999998
755 +99999999:+1:99999998
756 +999999999:+1:999999998
757 +9999999999:+1:9999999998
758 +99999999999:+1:99999999998
759 +10:-1:11
760 +100:-1:101
761 +1000:-1:1001
762 +10000:-1:10001
763 +100000:-1:100001
764 +1000000:-1:1000001
765 +10000000:-1:10000001
766 +100000000:-1:100000001
767 +1000000000:-1:1000000001
768 +10000000000:-1:10000000001
769 +123456789:+987654321:-864197532
770 -123456789:+987654321:-1111111110
771 -123456789:-987654321:864197532
772 +123456789:-987654321:1111111110
773 &bmul
774 abc:abc:NaN
775 abc:+0:NaN
776 +0:abc:NaN
777 NaNmul:+inf:NaN
778 NaNmul:-inf:NaN
779 -inf:NaNmul:NaN
780 +inf:NaNmul:NaN
781 +inf:+inf:inf
782 +inf:-inf:-inf
783 -inf:+inf:-inf
784 -inf:-inf:inf
785 +0:+0:0
786 +0:+1:0
787 +1:+0:0
788 +0:-1:0
789 -1:+0:0
790 123456789123456789:0:0
791 0:123456789123456789:0
792 -1:-1:1
793 -1:+1:-1
794 +1:-1:-1
795 +1:+1:1
796 +2:+3:6
797 -2:+3:-6
798 +2:-3:-6
799 -2:-3:6
800 111:111:12321
801 10101:10101:102030201
802 1001001:1001001:1002003002001
803 100010001:100010001:10002000300020001
804 10000100001:10000100001:100002000030000200001
805 11111111111:9:99999999999
806 22222222222:9:199999999998
807 33333333333:9:299999999997
808 44444444444:9:399999999996
809 55555555555:9:499999999995
810 66666666666:9:599999999994
811 77777777777:9:699999999993
812 88888888888:9:799999999992
813 99999999999:9:899999999991
814 +25:+25:625
815 +12345:+12345:152399025
816 +99999:+11111:1111088889
817 9999:10000:99990000
818 99999:100000:9999900000
819 999999:1000000:999999000000
820 9999999:10000000:99999990000000
821 99999999:100000000:9999999900000000
822 999999999:1000000000:999999999000000000
823 9999999999:10000000000:99999999990000000000
824 99999999999:100000000000:9999999999900000000000
825 999999999999:1000000000000:999999999999000000000000
826 9999999999999:10000000000000:99999999999990000000000000
827 99999999999999:100000000000000:9999999999999900000000000000
828 999999999999999:1000000000000000:999999999999999000000000000000
829 9999999999999999:10000000000000000:99999999999999990000000000000000
830 99999999999999999:100000000000000000:9999999999999999900000000000000000
831 999999999999999999:1000000000000000000:999999999999999999000000000000000000
832 9999999999999999999:10000000000000000000:99999999999999999990000000000000000000
833 3:3.5:10.5^
834 3.5:3:10.5^
835 &bdiv-list
836 100:20:5,0
837 4095:4095:1,0
838 -4095:-4095:1,0
839 4095:-4095:-1,0
840 -4095:4095:-1,0
841 123:2:61.5,1
842 9:5:1.8,4
843 9:4:2.25,1
844 # inf handling and general remainder
845 5:8:0.625,5
846 0:8:0,0
847 11:2:5.5,1
848 11:-2:-5.5,-1
849 -11:2:-5.5,1
850 # see table in documentation in MBI
851 0:inf:0,0
852 0:-inf:0,0
853 5:inf:0,5
854 5:-inf:0,5
855 -5:inf:0,-5
856 -5:-inf:0,-5
857 inf:5:inf,0
858 -inf:5:-inf,0
859 inf:-5:-inf,0
860 -inf:-5:inf,0
861 5:5:1,0
862 -5:-5:1,0
863 inf:inf:NaN,NaN
864 -inf:-inf:NaN,NaN
865 -inf:inf:NaN,NaN
866 inf:-inf:NaN,NaN
867 8:0:inf,8
868 inf:0:inf,inf
869 # exceptions to reminder rule
870 -8:0:-inf,-8
871 -inf:0:-inf,-inf
872 0:0:NaN,NaN
873 &bdiv
874 abc:abc:NaN
875 abc:1:NaN
876 1:abc:NaN
877 0:0:NaN
878 # inf handling (see table in doc)
879 0:inf:0
880 0:-inf:0
881 5:inf:0
882 5:-inf:0
883 -5:inf:0
884 -5:-inf:0
885 inf:5:inf
886 -inf:5:-inf
887 inf:-5:-inf
888 -inf:-5:inf
889 5:5:1
890 -5:-5:1
891 inf:inf:NaN
892 -inf:-inf:NaN
893 -inf:inf:NaN
894 inf:-inf:NaN
895 8:0:inf
896 inf:0:inf
897 -8:0:-inf
898 -inf:0:-inf
899 0:0:NaN
900 11:2:5.5^
901 -11:-2:5.5^
902 -11:2:-5.5^
903 11:-2:-5.5^
904 0:1:0
905 0:-1:0
906 1:1:1
907 -1:-1:1
908 1:-1:-1
909 -1:1:-1
910 1:2:0.5^
911 2:1:2
912 1000000000:9:111111111.1111111111111111111111111111111^
913 2000000000:9:222222222.2222222222222222222222222222222^
914 3000000000:9:333333333.3333333333333333333333333333333^
915 4000000000:9:444444444.4444444444444444444444444444444^
916 5000000000:9:555555555.5555555555555555555555555555556^
917 6000000000:9:666666666.6666666666666666666666666666667^
918 7000000000:9:777777777.7777777777777777777777777777778^
919 8000000000:9:888888888.8888888888888888888888888888889^
920 9000000000:9:1000000000
921 35500000:113:314159.2920353982300884955752212389380531^
922 71000000:226:314159.2920353982300884955752212389380531^
923 106500000:339:314159.2920353982300884955752212389380531^
924 1000000000:3:333333333.3333333333333333333333333333333^
925 +10:+5:2
926 +100:+4:25
927 +1000:+8:125
928 +10000:+16:625
929 999999999999:9:111111111111
930 999999999999:99:10101010101
931 999999999999:999:1001001001
932 999999999999:9999:100010001
933 999999999999999:99999:10000100001
934 +1111088889:99999:11111
935 -5:-3:1.666666666666666666666666666666666666667^
936 -5:3:-1.666666666666666666666666666666666666667^
937 4:3:1.333333333333333333333333333333333333333^
938 4:-3:-1.333333333333333333333333333333333333333^
939 1:3:0.3333333333333333333333333333333333333333^
940 1:-3:-0.3333333333333333333333333333333333333333^
941 -2:-3:0.6666666666666666666666666666666666666667^
942 -2:3:-0.6666666666666666666666666666666666666667^
943 8:5:1.6^
944 -8:5:-1.6^
945 14:-3:-4.666666666666666666666666666666666666667^
946 -14:3:-4.666666666666666666666666666666666666667^
947 -14:-3:4.666666666666666666666666666666666666667^
948 14:3:4.666666666666666666666666666666666666667^
949 # bug in Calc with '99999' vs $BASE-1
950 #10000000000000000000000000000000000000000000000000000000000000000000000000000000000:10000000375084540248994272022843165711074:999999962491547381984643365663244474111576
951 12:24:0.5^
952 &bmod
953 # inf handling, see table in doc
954 0:inf:0
955 0:-inf:0
956 5:inf:5
957 5:-inf:5
958 -5:inf:-5
959 -5:-inf:-5
960 inf:5:0
961 -inf:5:0
962 inf:-5:0
963 -inf:-5:0
964 5:5:0
965 -5:-5:0
966 inf:inf:NaN
967 -inf:-inf:NaN
968 -inf:inf:NaN
969 inf:-inf:NaN
970 8:0:8
971 inf:0:inf
972 # exceptions to reminder rule
973 -inf:0:-inf
974 -8:0:-8
975 0:0:NaN
976 abc:abc:NaN
977 abc:1:abc:NaN
978 1:abc:NaN
979 0:0:NaN
980 0:1:0
981 1:0:1
982 0:-1:0
983 -1:0:-1
984 1:1:0
985 -1:-1:0
986 1:-1:0
987 -1:1:0
988 1:2:1
989 2:1:0
990 1000000000:9:1
991 2000000000:9:2
992 3000000000:9:3
993 4000000000:9:4
994 5000000000:9:5
995 6000000000:9:6
996 7000000000:9:7
997 8000000000:9:8
998 9000000000:9:0
999 35500000:113:33
1000 71000000:226:66
1001 106500000:339:99
1002 1000000000:3:1
1003 10:5:0
1004 100:4:0
1005 1000:8:0
1006 10000:16:0
1007 999999999999:9:0
1008 999999999999:99:0
1009 999999999999:999:0
1010 999999999999:9999:0
1011 999999999999999:99999:0
1012 -9:+5:1
1013 +9:-5:-1
1014 -9:-5:-4
1015 -5:3:1
1016 -2:3:1
1017 4:3:1
1018 1:3:1
1019 -5:-3:-2
1020 -2:-3:-2
1021 4:-3:-2
1022 1:-3:-2
1023 4095:4095:0
1024 100041000510123:3:0
1025 152403346:12345:4321
1026 9:5:4
1027 &bgcd
1028 abc:abc:NaN
1029 abc:+0:NaN
1030 +0:abc:NaN
1031 +0:+0:0
1032 +0:+1:1
1033 +1:+0:1
1034 +1:+1:1
1035 +2:+3:1
1036 +3:+2:1
1037 -3:+2:1
1038 100:625:25
1039 4096:81:1
1040 1034:804:2
1041 27:90:56:1
1042 27:90:54:9
1043 &blcm
1044 abc:abc:NaN
1045 abc:+0:NaN
1046 +0:abc:NaN
1047 +0:+0:NaN
1048 +1:+0:0
1049 +0:+1:0
1050 +27:+90:270
1051 +1034:+804:415668
1052 &band
1053 abc:abc:NaN
1054 abc:0:NaN
1055 0:abc:NaN
1056 1:2:0
1057 3:2:2
1058 +8:+2:0
1059 +281474976710656:0:0
1060 +281474976710656:1:0
1061 +281474976710656:+281474976710656:281474976710656
1062 -2:-3:-4
1063 -1:-1:-1
1064 -6:-6:-6
1065 -7:-4:-8
1066 -7:4:0
1067 -4:7:4
1068 # equal arguments are treated special, so also do some test with unequal ones
1069 0xFFFF:0xFFFF:0x0xFFFF
1070 0xFFFFFF:0xFFFFFF:0x0xFFFFFF
1071 0xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF
1072 0xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF
1073 0xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
1074 0xF0F0:0xF0F0:0x0xF0F0
1075 0x0F0F:0x0F0F:0x0x0F0F
1076 0xF0F0F0:0xF0F0F0:0x0xF0F0F0
1077 0x0F0F0F:0x0F0F0F:0x0x0F0F0F
1078 0xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0
1079 0x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F
1080 0xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0
1081 0x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F
1082 0xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0
1083 0x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F
1084 0x1F0F0F0F0F0F:0x3F0F0F0F0F0F:0x0x1F0F0F0F0F0F
1085 &bior
1086 abc:abc:NaN
1087 abc:0:NaN
1088 0:abc:NaN
1089 1:2:3
1090 +8:+2:10
1091 +281474976710656:0:281474976710656
1092 +281474976710656:1:281474976710657
1093 +281474976710656:281474976710656:281474976710656
1094 -2:-3:-1
1095 -1:-1:-1
1096 -6:-6:-6
1097 -7:4:-3
1098 -4:7:-1
1099 # equal arguments are treated special, so also do some test with unequal ones
1100 0xFFFF:0xFFFF:0x0xFFFF
1101 0xFFFFFF:0xFFFFFF:0x0xFFFFFF
1102 0xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF
1103 0xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF
1104 0xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
1105 0:0xFFFF:0x0xFFFF
1106 0:0xFFFFFF:0x0xFFFFFF
1107 0:0xFFFFFFFF:0x0xFFFFFFFF
1108 0:0xFFFFFFFFFF:0x0xFFFFFFFFFF
1109 0:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
1110 0xFFFF:0:0x0xFFFF
1111 0xFFFFFF:0:0x0xFFFFFF
1112 0xFFFFFFFF:0:0x0xFFFFFFFF
1113 0xFFFFFFFFFF:0:0x0xFFFFFFFFFF
1114 0xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF
1115 0xF0F0:0xF0F0:0x0xF0F0
1116 0x0F0F:0x0F0F:0x0x0F0F
1117 0xF0F0:0x0F0F:0x0xFFFF
1118 0xF0F0F0:0xF0F0F0:0x0xF0F0F0
1119 0x0F0F0F:0x0F0F0F:0x0x0F0F0F
1120 0x0F0F0F:0xF0F0F0:0x0xFFFFFF
1121 0xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0
1122 0x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F
1123 0x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF
1124 0xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0
1125 0x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F
1126 0x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF
1127 0xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0
1128 0x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F
1129 0x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
1130 0x1F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
1131 &bxor
1132 abc:abc:NaN
1133 abc:0:NaN
1134 0:abc:NaN
1135 1:2:3
1136 +8:+2:10
1137 +281474976710656:0:281474976710656
1138 +281474976710656:1:281474976710657
1139 +281474976710656:281474976710656:0
1140 -2:-3:3
1141 -1:-1:0
1142 -6:-6:0
1143 -7:4:-3
1144 -4:7:-5
1145 4:-7:-3
1146 -4:-7:5
1147 # equal arguments are treated special, so also do some test with unequal ones
1148 0xFFFF:0xFFFF:0
1149 0xFFFFFF:0xFFFFFF:0
1150 0xFFFFFFFF:0xFFFFFFFF:0
1151 0xFFFFFFFFFF:0xFFFFFFFFFF:0
1152 0xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0
1153 0:0xFFFF:0x0xFFFF
1154 0:0xFFFFFF:0x0xFFFFFF
1155 0:0xFFFFFFFF:0x0xFFFFFFFF
1156 0:0xFFFFFFFFFF:0x0xFFFFFFFFFF
1157 0:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
1158 0xFFFF:0:0x0xFFFF
1159 0xFFFFFF:0:0x0xFFFFFF
1160 0xFFFFFFFF:0:0x0xFFFFFFFF
1161 0xFFFFFFFFFF:0:0x0xFFFFFFFFFF
1162 0xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF
1163 0xF0F0:0xF0F0:0
1164 0x0F0F:0x0F0F:0
1165 0xF0F0:0x0F0F:0x0xFFFF
1166 0xF0F0F0:0xF0F0F0:0
1167 0x0F0F0F:0x0F0F0F:0
1168 0x0F0F0F:0xF0F0F0:0x0xFFFFFF
1169 0xF0F0F0F0:0xF0F0F0F0:0
1170 0x0F0F0F0F:0x0F0F0F0F:0
1171 0x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF
1172 0xF0F0F0F0F0:0xF0F0F0F0F0:0
1173 0x0F0F0F0F0F:0x0F0F0F0F0F:0
1174 0x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF
1175 0xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0
1176 0x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0
1177 0x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
1178 &bnot
1179 abc:NaN
1180 +0:-1
1181 +8:-9
1182 +281474976710656:-281474976710657
1183 -1:0
1184 -2:1
1185 -12:11
1186 &digit
1187 0:0:0
1188 12:0:2
1189 12:1:1
1190 123:0:3
1191 123:1:2
1192 123:2:1
1193 123:-1:1
1194 123:-2:2
1195 123:-3:3
1196 123456:0:6
1197 123456:1:5
1198 123456:2:4
1199 123456:3:3
1200 123456:4:2
1201 123456:5:1
1202 123456:-1:1
1203 123456:-2:2
1204 123456:-3:3
1205 100000:-3:0
1206 100000:0:0
1207 100000:1:0
1208 &mantissa
1209 abc:NaN
1210 1e4:1
1211 2e0:2
1212 123:123
1213 -1:-1
1214 -2:-2
1215 +inf:inf
1216 -inf:-inf
1217 &exponent
1218 abc:NaN
1219 1e4:4
1220 2e0:0
1221 123:0
1222 -1:0
1223 -2:0
1224 0:1
1225 +inf:inf
1226 -inf:inf
1227 &parts
1228 abc:NaN,NaN
1229 1e4:1,4
1230 2e0:2,0
1231 123:123,0
1232 -1:-1,0
1233 -2:-2,0
1234 0:0,1
1235 +inf:inf,inf
1236 -inf:-inf,inf
1237 &bfac
1238 -1:NaN
1239 NaNfac:NaN
1240 +inf:NaN
1241 -inf:NaN
1242 0:1
1243 1:1
1244 2:2
1245 3:6
1246 4:24
1247 5:120
1248 6:720
1249 10:3628800
1250 11:39916800
1251 12:479001600
1252 &bpow
1253 abc:12:NaN
1254 12:abc:NaN
1255 0:0:1
1256 0:1:0
1257 0:2:0
1258 0:-1:NaN
1259 0:-2:NaN
1260 1:0:1
1261 1:1:1
1262 1:2:1
1263 1:3:1
1264 1:-1:1
1265 1:-2:1
1266 1:-3:1
1267 2:0:1
1268 2:1:2
1269 2:2:4
1270 2:3:8
1271 3:3:27
1272 2:-1:NaN
1273 -2:-1:NaN
1274 2:-2:NaN
1275 -2:-2:NaN
1276 +inf:1234500012:inf
1277 -inf:1234500012:-inf
1278 +inf:-12345000123:inf
1279 -inf:-12345000123:-inf
1280 # 1 ** -x => 1 / (1 ** x)
1281 -1:0:1
1282 -2:0:1
1283 -1:1:-1
1284 -1:2:1
1285 -1:3:-1
1286 -1:4:1
1287 -1:5:-1
1288 -1:-1:-1
1289 -1:-2:1
1290 -1:-3:-1
1291 -1:-4:1
1292 10:2:100
1293 10:3:1000
1294 10:4:10000
1295 10:5:100000
1296 10:6:1000000
1297 10:7:10000000
1298 10:8:100000000
1299 10:9:1000000000
1300 10:20:100000000000000000000
1301 123456:2:15241383936
1302 #2:0.5:1.41^
1303 &length
1304 100:3
1305 10:2
1306 1:1
1307 0:1
1308 12345:5
1309 10000000000000000:17
1310 -123:3
1311 215960156869840440586892398248:30
1312 &bsqrt
1313 145:12.04159457879229548012824103037860805243^
1314 144:12^
1315 143:11.95826074310139802112984075619561661399^
1316 16:4
1317 170:13.03840481040529742916594311485836883306^
1318 169:13
1319 168:12.96148139681572046193193487217599331541^
1320 4:2
1321 3:1.732050807568877293527446341505872366943^
1322 2:1.41421356237309504880168872420969807857^
1323 9:3
1324 12:3.464101615137754587054892683011744733886^
1325 256:16
1326 100000000:10000
1327 4000000000000:2000000
1328 152399026:12345.00004050222755607815159966235881398^
1329 152399025:12345
1330 152399024:12344.99995949777231103967404745303741942^
1331 1:1
1332 0:0
1333 -2:NaN
1334 -123:NaN
1335 Nan:NaN
1336 +inf:NaN
1337 &bround
1338 $round_mode('trunc')
1339 0:12:0
1340 NaNbround:12:NaN
1341 +inf:12:inf
1342 -inf:12:-inf
1343 1234:0:1234
1344 1234:2:1200
1345 123456:4:123400
1346 123456:5:123450
1347 123456:6:123456
1348 +10123456789:5:10123000000
1349 -10123456789:5:-10123000000
1350 +10123456789:9:10123456700
1351 -10123456789:9:-10123456700
1352 +101234500:6:101234000
1353 -101234500:6:-101234000
1354 #+101234500:-4:101234000
1355 #-101234500:-4:-101234000
1356 $round_mode('zero')
1357 +20123456789:5:20123000000
1358 -20123456789:5:-20123000000
1359 +20123456789:9:20123456800
1360 -20123456789:9:-20123456800
1361 +201234500:6:201234000
1362 -201234500:6:-201234000
1363 #+201234500:-4:201234000
1364 #-201234500:-4:-201234000
1365 +12345000:4:12340000
1366 -12345000:4:-12340000
1367 $round_mode('+inf')
1368 +30123456789:5:30123000000
1369 -30123456789:5:-30123000000
1370 +30123456789:9:30123456800
1371 -30123456789:9:-30123456800
1372 +301234500:6:301235000
1373 -301234500:6:-301234000
1374 #+301234500:-4:301235000
1375 #-301234500:-4:-301234000
1376 +12345000:4:12350000
1377 -12345000:4:-12340000
1378 $round_mode('-inf')
1379 +40123456789:5:40123000000
1380 -40123456789:5:-40123000000
1381 +40123456789:9:40123456800
1382 -40123456789:9:-40123456800
1383 +401234500:6:401234000
1384 +401234500:6:401234000
1385 #-401234500:-4:-401235000
1386 #-401234500:-4:-401235000
1387 +12345000:4:12340000
1388 -12345000:4:-12350000
1389 $round_mode('odd')
1390 +50123456789:5:50123000000
1391 -50123456789:5:-50123000000
1392 +50123456789:9:50123456800
1393 -50123456789:9:-50123456800
1394 +501234500:6:501235000
1395 -501234500:6:-501235000
1396 #+501234500:-4:501235000
1397 #-501234500:-4:-501235000
1398 +12345000:4:12350000
1399 -12345000:4:-12350000
1400 $round_mode('even')
1401 +60123456789:5:60123000000
1402 -60123456789:5:-60123000000
1403 +60123456789:9:60123456800
1404 -60123456789:9:-60123456800
1405 +601234500:6:601234000
1406 -601234500:6:-601234000
1407 #+601234500:-4:601234000
1408 #-601234500:-4:-601234000
1409 #-601234500:-9:0
1410 #-501234500:-9:0
1411 #-601234500:-8:0
1412 #-501234500:-8:0
1413 +1234567:7:1234567
1414 +1234567:6:1234570
1415 +12345000:4:12340000
1416 -12345000:4:-12340000
1417 &is_zero
1418 0:1
1419 NaNzero:0
1420 +inf:0
1421 -inf:0
1422 123:0
1423 -1:0
1424 1:0
1425 &is_one
1426 0:0
1427 NaNone:0
1428 +inf:0
1429 -inf:0
1430 1:1
1431 2:0
1432 -1:0
1433 -2:0
1434 # floor and ceil tests are pretty pointless in integer space...but play safe
1435 &bfloor
1436 0:0
1437 NaNfloor:NaN
1438 +inf:inf
1439 -inf:-inf
1440 -1:-1
1441 -2:-2
1442 2:2
1443 3:3
1444 abc:NaN
1445 &bceil
1446 NaNceil:NaN
1447 +inf:inf
1448 -inf:-inf
1449 0:0
1450 -1:-1
1451 -2:-2
1452 2:2
1453 3:3
1454 abc:NaN
1455 &as_hex
1456 128:0x80
1457 -128:-0x80
1458 0:0x0
1459 -0:0x0
1460 1:0x1
1461 0x123456789123456789:0x123456789123456789
1462 +inf:inf
1463 -inf:-inf
1464 NaNas_hex:NaN
1465 &as_bin
1466 128:0b10000000
1467 -128:-0b10000000
1468 0:0b0
1469 -0:0b0
1470 1:0b1
1471 0b1010111101010101010110110110110110101:0b1010111101010101010110110110110110101
1472 +inf:inf
1473 -inf:-inf
1474 NaNas_bin:NaN