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