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