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