1# include this file into another for subclass testing
2
3# This file is nearly identical to bigintpm.t, except that certain results are
4# _requird_ to be different due to "upgrading" or "promoting" to
5# Math::BigFloat. The reverse is not true. Any unmarked results can be either
6# Math::BigInt or Math::BigFloat, depending on how good the internal
7# optimization is (e.g., it is usually desirable to have 2 ** 2 return a
8# Math::BigInt, not a Math::BigFloat).
9
10# Results that are required to be Math::BigFloat are marked with C<^> at the
11# end.
12
13# Please note that the testcount goes up by two for each extra result marked
14# with ^, since then we test whether it has the proper class and that it left
15# the upgrade variable alone.
16
17use strict;
18use warnings;
19
20our ($CLASS, $LIB, $EXPECTED_CLASS);
21
22##############################################################################
23# for testing inheritance of _swap
24
25package Math::Foo;
26
27use Math::BigInt lib => $main::LIB;
28our @ISA = ('Math::BigInt');
29
30use overload
31  # customized overload for sub, since original does not use swap there
32  '-'     =>      sub { my @a = ref($_[0])->_swap(@_);
33                        $a[0]->bsub($a[1]);
34                      };
35
36sub _swap {
37    # a fake _swap, which reverses the params
38    my $self = shift;           # for override in subclass
39    if ($_[2]) {
40        my $c = ref ($_[0] ) || 'Math::Foo';
41        return ( $_[0]->copy(), $_[1] );
42    } else {
43        return ( Math::Foo->new($_[1]), $_[0] );
44    }
45}
46
47##############################################################################
48package main;
49
50is($CLASS->config('lib'), $LIB, "$CLASS->config('lib')");
51
52my ($x, $y, $z, @args, $a, $m, $e, $try, $got, $want, $exp);
53my ($f, $round_mode, $expected_class);
54
55while (<DATA>) {
56    s/#.*$//;                   # remove comments
57    s/\s+$//;                   # remove trailing whitespace
58    next unless length;         # skip empty lines
59
60    if (s/^&//) {
61        $f = $_;
62        next;
63    }
64
65    if (/^\$/) {
66        $round_mode = $_;
67        $round_mode =~ s/^\$/$CLASS\->/;
68        next;
69    }
70
71    @args = split(/:/, $_, 99);
72    $want = pop(@args);
73    $expected_class = $CLASS;
74
75    if ($want =~ /\^$/) {
76        $expected_class = $EXPECTED_CLASS;
77        $want =~ s/\^$//;
78    }
79
80    $try = qq|\$x = $CLASS->new("$args[0]");|;
81    if ($f eq "bnorm") {
82        $try = qq|\$x = $CLASS->bnorm("$args[0]");|;
83    } elsif ($f =~ /^is_(zero|one|odd|even||(non_)?(negative|positive)|nan|int)$/) {
84        $try .= " \$x->$f();";
85    } elsif ($f =~ /^(to|as)_(hex|oct|bin)$/) {
86        $try .= " \$x->$f();";
87    } elsif ($f eq "is_inf") {
88        $try .= " \$x->is_inf('$args[1]');";
89    } elsif ($f eq "binf") {
90        $try .= " \$x->binf('$args[1]');";
91    } elsif ($f eq "bone") {
92        $try .= " \$x->bone('$args[1]');";
93    # some unary ops
94    } elsif ($f =~ /^b(nan|floor|ceil|int|sstr|neg|abs|inc|dec|not|sqrt)$/) {
95        $try .= " \$x->$f();";
96    } elsif ($f eq "length") {
97        $try .= ' $x->length();';
98    } elsif ($f eq "exponent") {
99        # ->bstr() to see if an object is returned
100        $try .= ' $x = $x->exponent()->bstr();';
101    } elsif ($f eq "mantissa") {
102        # ->bstr() to see if an object is returned
103        $try .= ' $x = $x->mantissa()->bstr();';
104    } elsif ($f eq "parts") {
105        $try .= ' ($m, $e) = $x->parts();';
106        # ->bstr() to see if an object is returned
107        $try .= ' $m = $m->bstr(); $m = "NaN" if !defined $m;';
108        $try .= ' $e = $e->bstr(); $e = "NaN" if !defined $e;';
109        $try .= ' "$m,$e";';
110    } else {
111        if ($args[1] !~ /\./) {
112            $try .= qq| \$y = $CLASS->new("$args[1]");|;
113        } else {
114            $try .= qq| \$y = $EXPECTED_CLASS->new("$args[1]");|;
115        }
116        if ($f eq "bcmp") {
117            $try .= ' $x->bcmp($y);';
118        } elsif ($f eq "bacmp") {
119            $try .= ' $x->bacmp($y);';
120        } elsif ($f eq "bround") {
121            $try .= " $round_mode; \$x->bround(\$y);";
122        } elsif ($f eq "broot") {
123            $try .= " \$x->broot(\$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            if (defined $args[2]) {
144                $try .= qq| \$z = $CLASS->new("$args[2]");|;
145            }
146            $try .= " $CLASS\::bgcd(\$x, \$y";
147            $try .= ", \$z" if defined $args[2];
148            $try .= ");";
149        } elsif ($f eq "blcm") {
150            if (defined $args[2]) {
151                $try .= qq| \$z = $CLASS->new("$args[2]");|;
152            }
153            $try .= " $CLASS\::blcm(\$x, \$y";
154            $try .= ", \$z" if defined $args[2];
155            $try .= ");";
156        } elsif ($f eq "blsft") {
157            if (defined $args[2]) {
158                $try .= " \$x->blsft(\$y, $args[2]);";
159            } else {
160                $try .= " \$x << \$y;";
161            }
162        } elsif ($f eq "brsft") {
163            if (defined $args[2]) {
164                $try .= " \$x->brsft(\$y, $args[2]);";
165            } else {
166                $try .= " \$x >> \$y;";
167            }
168        } elsif ($f eq "band") {
169            $try .= " \$x & \$y;";
170        } elsif ($f eq "bior") {
171            $try .= " \$x | \$y;";
172        } elsif ($f eq "bxor") {
173            $try .= " \$x ^ \$y;";
174        } elsif ($f eq "bpow") {
175            $try .= " \$x ** \$y;";
176        } elsif ($f eq "digit") {
177            $try = qq|\$x = $CLASS->new("$args[0]"); \$x->digit($args[1]);|;
178        } else {
179            warn "Unknown op '$f'";
180        }
181    }                           # end else all other ops
182
183    $got = eval $try;
184    print "# Error: $@\n" if $@;
185
186    # convert hex/binary targets to decimal
187    if ($want =~ /^(0x0x|0b0b)/) {
188        $want =~ s/^0[xb]//;
189        $want = Math::BigInt->new($want)->bstr();
190    }
191    if ($want eq "") {
192        is($got, undef, $try);
193    } else {
194        # print "try: $try ans: $got $want\n";
195        is($got, $want, $try);
196        if ($expected_class ne $CLASS) {
197            is(ref($got), $expected_class, 'ref($got)');
198            is($Math::BigInt::upgrade, 'Math::BigFloat',
199               '$Math::BigInt::upgrade');
200        }
201    }
202    # check internal state of number objects
203    is_valid($got, $f) if ref $got;
204}                               # endwhile data tests
205close DATA;
206
207my $warn = '';
208$SIG{__WARN__} = sub { $warn = shift; };
209
210# these should not warn
211
212$warn = '';
213eval '$z = 3.17 <= $y';
214is($z, 1, '$z = 3.17 <= $y');
215is($warn, '', 'the code "$z = 3.17 <= $y" issued no warning');
216
217$warn = '';
218eval '$z = $y >= 3.17';
219is($z, 1, '$z = $y >= 3.17');
220is($warn, '', 'the code "$z = $y >= 3.17" issued no warning');
221
222# all tests done
223
2241;
225
226###############################################################################
227# sub to check validity of a Math::BigInt internally, to ensure that no op
228# leaves a number object in an invalid state (f.i. "-0")
229
230sub is_valid {
231    my ($x, $f, $c) = @_;
232
233    # The checks here are loosened a bit to allow Math::BigInt or
234    # Math::BigFloat objects to pass
235
236    my $e = 0;         # error?
237
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 = $LIB->_check($x->{value}) if $e eq '0';
247
248    # test done, see if error did crop up
249    if ($e eq '0') {
250        pass('is a valid object');
251        return;
252    }
253
254    fail($e . " after op '$f'");
255}
256
257__DATA__
258
259&.=
2601234:-345:1234-345
261
262&+=
2631:2:3
264-1:-2:-3
265
266&-=
2671:2:-1
268-1:-2:1
269
270&*=
2712:3:6
272-1:5:-5
273
274&%=
275100:3:1
2768:9:8
277
278&/=
279100:3:33.33333333333333333333333333333333333333
280-8:2:-4
281
282&|=
2832:1:3
284
285&&=
2865:7:5
287
288&^=
2895:7:2
290
291&is_negative
2920:0
293-1:1
2941:0
295+inf:0
296-inf:1
297NaNneg:0
298
299&is_positive
3000:0
301-1:0
3021:1
303+inf:1
304-inf:0
305NaNneg:0
306
307&is_non_negative
3080:1
309-1:0
3101:1
311+inf:1
312-inf:0
313NaN:0
314
315&is_non_positive
3160:1
317-1:1
3181:0
319+inf:0
320-inf:1
321NaN:0
322
323&is_odd
324abc:0
3250:0
3261:1
3273:1
328-1:1
329-3:1
33010000001:1
33110000002:0
3322:0
333120:0
334121:1
335
336&is_int
337NaN:0
338inf:0
339-inf:0
3401:1
34112:1
342123e12:1
343
344&is_even
345abc:0
3460:1
3471:0
3483:0
349-1:0
350-3:0
35110000001:0
35210000002:1
3532:1
354120:1
355121:0
356
357&bacmp
358+0:-0:0
359+0:+1:-1
360-1:+1:0
361+1:-1:0
362-1:+2:-1
363+2:-1:1
364-123456789:+987654321:-1
365+123456789:-987654321:-1
366+987654321:+123456789:1
367-987654321:+123456789:1
368-123:+4567889:-1
369# NaNs
370acmpNaN:123:
371123:acmpNaN:
372acmpNaN:acmpNaN:
373# infinity
374+inf:+inf:0
375-inf:-inf:0
376+inf:-inf:0
377-inf:+inf:0
378+inf:123:1
379-inf:123:1
380+inf:-123:1
381-inf:-123:1
382# return undef
383+inf:NaN:
384NaN:inf:
385-inf:NaN:
386NaN:-inf:
387
388&bnorm
389123:123
39012.3:12.3^
391# binary input
3920babc:NaN
3930b123:NaN
3940b0:0
395-0b0:0
396-0b1:-1
3970b0001:1
3980b001:1
3990b011:3
4000b101:5
4010b1001:9
4020b10001:17
4030b100001:33
4040b1000001:65
4050b10000001:129
4060b100000001:257
4070b1000000001:513
4080b10000000001:1025
4090b100000000001:2049
4100b1000000000001:4097
4110b10000000000001:8193
4120b100000000000001:16385
4130b1000000000000001:32769
4140b10000000000000001:65537
4150b100000000000000001:131073
4160b1000000000000000001:262145
4170b10000000000000000001:524289
4180b100000000000000000001:1048577
4190b1000000000000000000001:2097153
4200b10000000000000000000001:4194305
4210b100000000000000000000001:8388609
4220b1000000000000000000000001:16777217
4230b10000000000000000000000001:33554433
4240b100000000000000000000000001:67108865
4250b1000000000000000000000000001:134217729
4260b10000000000000000000000000001:268435457
4270b100000000000000000000000000001:536870913
4280b1000000000000000000000000000001:1073741825
4290b10000000000000000000000000000001:2147483649
4300b100000000000000000000000000000001:4294967297
4310b1000000000000000000000000000000001:8589934593
4320b10000000000000000000000000000000001:17179869185
4330b1_0_1:5
4340b0_0_0_1:1
435# hex input
436-0x0:0
4370xabcdefgh:NaN
4380x1234:4660
4390xabcdef:11259375
440-0xABCDEF:-11259375
441-0x1234:-4660
4420x12345678:305419896
4430x1_2_3_4_56_78:305419896
4440xa_b_c_d_e_f:11259375
4450x9:9
4460x11:17
4470x21:33
4480x41:65
4490x81:129
4500x101:257
4510x201:513
4520x401:1025
4530x801:2049
4540x1001:4097
4550x2001:8193
4560x4001:16385
4570x8001:32769
4580x10001:65537
4590x20001:131073
4600x40001:262145
4610x80001:524289
4620x100001:1048577
4630x200001:2097153
4640x400001:4194305
4650x800001:8388609
4660x1000001:16777217
4670x2000001:33554433
4680x4000001:67108865
4690x8000001:134217729
4700x10000001:268435457
4710x20000001:536870913
4720x40000001:1073741825
4730x80000001:2147483649
4740x100000001:4294967297
4750x200000001:8589934593
4760x400000001:17179869185
4770x800000001:34359738369
478# inf input
479inf:inf
480+inf:inf
481-inf:-inf
4820inf:NaN
483# abnormal input
484:NaN
485abc:NaN
486   1 a:NaN
4871bcd2:NaN
48811111b:NaN
489+1z:NaN
490-1z:NaN
491# only one underscore between two digits
492_123:NaN
493_123_:NaN
4941E_12:NaN
4951_E_12:NaN
496+_1E12:NaN
497+0_1E2:100
498+0_0_1E2:100
499-0_0_1E2:-100
500-0_0_1E+0_0_2:-100
501E1:NaN
502E23:NaN
5031.23E1:12.3^
5041.23E-1:0.123^
505# bug with two E's in number being valid
5061e2e3:NaN
5071e2r:NaN
5081e2.0:NaN
509# leading zeros
510012:12
5110123:123
51201234:1234
513012345:12345
5140123456:123456
51501234567:1234567
516012345678:12345678
5170123456789:123456789
51801234567891:1234567891
519012345678912:12345678912
5200123456789123:123456789123
52101234567891234:1234567891234
522# normal input
5230:0
524+0:0
525+00:0
526+000:0
527000000000000000000:0
528-0:0
529-0000:0
530+1:1
531+01:1
532+001:1
533+00000100000:100000
534123456789:123456789
535-1:-1
536-01:-1
537-001:-1
538-123456789:-123456789
539-00000100000:-100000
5401_2_3:123
54110000000000E-1_0:1
5421E2:100
5431E1:10
5441E0:1
5451.23E2:123
546100E-1:10
547# floating point input
548# .2e2:20
5491.E3:1000
5501.01E2:101
5511010E-1:101
552-1010E0:-1010
553-1010E1:-10100
5541234.00:1234
555# non-integer numbers
556-1010E-2:-10.1^
557-1.01E+1:-10.1^
558-1.01E-1:-0.101^
559
560&bnan
5611:NaN
5622:NaN
563abc:NaN
564
565&bone
5662:+:1
5672:-:-1
568boneNaN:-:-1
569boneNaN:+:1
5702:abc:1
5713::1
572
573&binf
5741:+:inf
5752:-:-inf
5763:+inf:inf
577
578&is_nan
579123:0
580abc:1
581NaN:1
582-123:0
583
584&is_inf
585+inf::1
586-inf::1
587abc::0
5881::0
589NaN::0
590-1::0
591+inf:-:0
592+inf:+:1
593-inf:-:1
594-inf:+:0
595+iNfInItY::1
596-InFiNiTy::1
597
598&blsft
599abc:abc:NaN
600+2:+2:8
601+1:+32:4294967296
602+1:+48:281474976710656
603+8:-2:NaN
604# exercise base 10
605+12345:4:10:123450000
606-1234:0:10:-1234
607+1234:0:10:1234
608+2:2:10:200
609+12:2:10:1200
610+1234:-3:10:NaN
6111234567890123:12:10:1234567890123000000000000
612
613&brsft
614abc:abc:NaN
615+8:+2:2
616+4294967296:+32:1
617+281474976710656:+48:1
618+2:-2:NaN
619# exercise base 10
620-1234:0:10:-1234
621+1234:0:10:1234
622+200:2:10:2
623+1234:3:10:1.234
624+1234:2:10:12.34
625+1234:-3:10:NaN
626310000:4:10:31
62712300000:5:10:123
6281230000000000:10:10:123
62909876123456789067890:12:10:9876123.45678906789
6301234561234567890123:13:10:123456.1234567890123
631
632&bsstr
6331e+34:1e+34
634123.456E3:123456e+0
635100:1e+2
636abc:NaN
637
638&bneg
639bnegNaN:NaN
640+inf:-inf
641-inf:inf
642abd:NaN
6430:0
6441:-1
645-1:1
646+123456789:-123456789
647-123456789:123456789
648
649&babs
650babsNaN:NaN
651+inf:inf
652-inf:inf
6530:0
6541:1
655-1:1
656+123456789:123456789
657-123456789:123456789
658
659&bcmp
660bcmpNaN:bcmpNaN:
661bcmpNaN:0:
6620:bcmpNaN:
6630:0:0
664-1:0:-1
6650:-1:1
6661:0:1
6670:1:-1
668-1:1:-1
6691:-1:1
670-1:-1:0
6711:1:0
672123:123:0
673123:12:1
67412:123:-1
675-123:-123:0
676-123:-12:-1
677-12:-123:1
678123:124:-1
679124:123:1
680-123:-124:1
681-124:-123:-1
682100:5:1
683-123456789:987654321:-1
684+123456789:-987654321:1
685-987654321:123456789:-1
686-inf:5432112345:-1
687+inf:5432112345:1
688-inf:-5432112345:-1
689+inf:-5432112345:1
690+inf:+inf:0
691-inf:-inf:0
692+inf:-inf:1
693-inf:+inf:-1
6945:inf:-1
6955:inf:-1
696-5:-inf:1
697-5:-inf:1
698# return undef
699+inf:NaN:
700NaN:inf:
701-inf:NaN:
702NaN:-inf:
703
704&binc
705abc:NaN
706+inf:inf
707-inf:-inf
708+0:1
709+1:2
710-1:0
711
712&bdec
713abc:NaN
714+inf:inf
715-inf:-inf
716+0:-1
717+1:0
718-1:-2
719
720&badd
721abc:abc:NaN
722abc:0:NaN
723+0:abc:NaN
724+inf:-inf:NaN
725-inf:+inf:NaN
726+inf:+inf:inf
727-inf:-inf:-inf
728baddNaN:+inf:NaN
729baddNaN:+inf:NaN
730+inf:baddNaN:NaN
731-inf:baddNaN:NaN
7320:0:0
7331:0:1
7340:1:1
7351:1:2
736-1:0:-1
7370:-1:-1
738-1:-1:-2
739-1:+1:0
740+1:-1:0
741+9:+1:10
742+99:+1:100
743+999:+1:1000
744+9999:+1:10000
745+99999:+1:100000
746+999999:+1:1000000
747+9999999:+1:10000000
748+99999999:+1:100000000
749+999999999:+1:1000000000
750+9999999999:+1:10000000000
751+99999999999:+1:100000000000
752+10:-1:9
753+100:-1:99
754+1000:-1:999
755+10000:-1:9999
756+100000:-1:99999
757+1000000:-1:999999
758+10000000:-1:9999999
759+100000000:-1:99999999
760+1000000000:-1:999999999
761+10000000000:-1:9999999999
762+123456789:987654321:1111111110
763-123456789:987654321:864197532
764-123456789:-987654321:-1111111110
765+123456789:-987654321:-864197532
7662:2.5:4.5^
767-123:-1.5:-124.5^
768-1.2:1:-0.2^
769
770&bsub
771abc:abc:NaN
772abc:+0:NaN
773+0:abc:NaN
774+inf:-inf:inf
775-inf:+inf:-inf
776+inf:+inf:NaN
777-inf:-inf:NaN
778+0:+0:0
779+1:+0:1
780+0:+1:-1
781+1:+1:0
782-1:+0:-1
783+0:-1:1
784-1:-1:0
785-1:+1:-2
786+1:-1:2
787+9:+1:8
788+99:+1:98
789+999:+1:998
790+9999:+1:9998
791+99999:+1:99998
792+999999:+1:999998
793+9999999:+1:9999998
794+99999999:+1:99999998
795+999999999:+1:999999998
796+9999999999:+1:9999999998
797+99999999999:+1:99999999998
798+10:-1:11
799+100:-1:101
800+1000:-1:1001
801+10000:-1:10001
802+100000:-1:100001
803+1000000:-1:1000001
804+10000000:-1:10000001
805+100000000:-1:100000001
806+1000000000:-1:1000000001
807+10000000000:-1:10000000001
808+123456789:+987654321:-864197532
809-123456789:+987654321:-1111111110
810-123456789:-987654321:864197532
811+123456789:-987654321:1111111110
812
813&bmul
814abc:abc:NaN
815abc:+0:NaN
816+0:abc:NaN
817NaNmul:+inf:NaN
818NaNmul:-inf:NaN
819-inf:NaNmul:NaN
820+inf:NaNmul:NaN
821+inf:+inf:inf
822+inf:-inf:-inf
823-inf:+inf:-inf
824-inf:-inf:inf
825+0:+0:0
826+0:+1:0
827+1:+0:0
828+0:-1:0
829-1:+0:0
830123456789123456789:0:0
8310:123456789123456789:0
832-1:-1:1
833-1:+1:-1
834+1:-1:-1
835+1:+1:1
836+2:+3:6
837-2:+3:-6
838+2:-3:-6
839-2:-3:6
840111:111:12321
84110101:10101:102030201
8421001001:1001001:1002003002001
843100010001:100010001:10002000300020001
84410000100001:10000100001:100002000030000200001
84511111111111:9:99999999999
84622222222222:9:199999999998
84733333333333:9:299999999997
84844444444444:9:399999999996
84955555555555:9:499999999995
85066666666666:9:599999999994
85177777777777:9:699999999993
85288888888888:9:799999999992
85399999999999:9:899999999991
854+25:+25:625
855+12345:+12345:152399025
856+99999:+11111:1111088889
8579999:10000:99990000
85899999:100000:9999900000
859999999:1000000:999999000000
8609999999:10000000:99999990000000
86199999999:100000000:9999999900000000
862999999999:1000000000:999999999000000000
8639999999999:10000000000:99999999990000000000
86499999999999:100000000000:9999999999900000000000
865999999999999:1000000000000:999999999999000000000000
8669999999999999:10000000000000:99999999999990000000000000
86799999999999999:100000000000000:9999999999999900000000000000
868999999999999999:1000000000000000:999999999999999000000000000000
8699999999999999999:10000000000000000:99999999999999990000000000000000
87099999999999999999:100000000000000000:9999999999999999900000000000000000
871999999999999999999:1000000000000000000:999999999999999999000000000000000000
8729999999999999999999:10000000000000000000:99999999999999999990000000000000000000
8733:3.5:10.5^
8743.5:3:10.5^
875
876&bdiv-list
877100:20:5,0
8784095:4095:1,0
879-4095:-4095:1,0
8804095:-4095:-1,0
881-4095:4095:-1,0
882123:2:61,1
8839:5:1,4
8849:4:2,1
885# inf handling and general remainder
8865:8:0,5
8870:8:0,0
88811:2:5,1
88911:-2:-6,-1
890-11:2:-6,1
891# see table in documentation in MBI
8920:inf:0,0
8930:-inf:0,0
8945:inf:0,5
8955:-inf:-1,-inf
896-5:inf:-1,inf
897-5:-inf:0,-5
898inf:5:inf,NaN
899-inf:5:-inf,NaN
900inf:-5:-inf,NaN
901-inf:-5:inf,NaN
9025:5:1,0
903-5:-5:1,0
904inf:inf:NaN,NaN
905-inf:-inf:NaN,NaN
906-inf:inf:NaN,NaN
907inf:-inf:NaN,NaN
9088:0:inf,8
909inf:0:inf,inf
910# exceptions to remainder rule
911-8:0:-inf,-8
912-inf:0:-inf,-inf
9130:0:NaN,0
914
915&bdiv
916abc:abc:NaN
917abc:1:NaN
9181:abc:NaN
9190:0:NaN
920# inf handling (see table in doc)
9210:inf:0
9220:-inf:0
9235:inf:0
9245:-inf:-1
925-5:inf:-1
926-5:-inf:0
927inf:5:inf
928-inf:5:-inf
929inf:-5:-inf
930-inf:-5:inf
9315:5:1
932-5:-5:1
933inf:inf:NaN
934-inf:-inf:NaN
935-inf:inf:NaN
936inf:-inf:NaN
9378:0:inf
938inf:0:inf
939-8:0:-inf
940-inf:0:-inf
94111:2:5.5^
942-11:-2:5.5^
943-11:2:-5.5^
94411:-2:-5.5^
9450:1:0
9460:-1:0
9471:1:1
948-1:-1:1
9491:-1:-1
950-1:1:-1
9511:2:0.5^
9522:1:2
9531000000000:9:111111111.1111111111111111111111111111111^
9542000000000:9:222222222.2222222222222222222222222222222^
9553000000000:9:333333333.3333333333333333333333333333333^
9564000000000:9:444444444.4444444444444444444444444444444^
9575000000000:9:555555555.5555555555555555555555555555556^
9586000000000:9:666666666.6666666666666666666666666666667^
9597000000000:9:777777777.7777777777777777777777777777778^
9608000000000:9:888888888.8888888888888888888888888888889^
9619000000000:9:1000000000
96235500000:113:314159.2920353982300884955752212389380531^
96371000000:226:314159.2920353982300884955752212389380531^
964106500000:339:314159.2920353982300884955752212389380531^
9651000000000:3:333333333.3333333333333333333333333333333^
966+10:+5:2
967+100:+4:25
968+1000:+8:125
969+10000:+16:625
970999999999999:9:111111111111
971999999999999:99:10101010101
972999999999999:999:1001001001
973999999999999:9999:100010001
974999999999999999:99999:10000100001
975+1111088889:99999:11111
976-5:-3:1.666666666666666666666666666666666666667^
977-5:3:-1.666666666666666666666666666666666666667^
9784:3:1.333333333333333333333333333333333333333^
9794:-3:-1.333333333333333333333333333333333333333^
9801:3:0.3333333333333333333333333333333333333333^
9811:-3:-0.3333333333333333333333333333333333333333^
982-2:-3:0.6666666666666666666666666666666666666667^
983-2:3:-0.6666666666666666666666666666666666666667^
9848:5:1.6^
985-8:5:-1.6^
98614:-3:-4.666666666666666666666666666666666666667^
987-14:3:-4.666666666666666666666666666666666666667^
988-14:-3:4.666666666666666666666666666666666666667^
98914:3:4.666666666666666666666666666666666666667^
990# bug in Calc with '99999' vs $BASE-1
991#10000000000000000000000000000000000000000000000000000000000000000000000000000000000:10000000375084540248994272022843165711074:999999962491547381984643365663244474111576
99212:24:0.5^
993
994&bmod
995# inf handling, see table in doc
9960:inf:0
9970:-inf:0
9985:inf:5
9995:-inf:-inf
1000-5:inf:inf
1001-5:-inf:-5
1002inf:5:NaN
1003-inf:5:NaN
1004inf:-5:NaN
1005-inf:-5:NaN
10065:5:0
1007-5:-5:0
1008inf:inf:NaN
1009-inf:-inf:NaN
1010-inf:inf:NaN
1011inf:-inf:NaN
10128:0:8
1013inf:0:inf
1014-inf:0:-inf
1015-8:0:-8
10160:0:0
1017abc:abc:NaN
1018abc:1:abc:NaN
10191:abc:NaN
10200:1:0
10211:0:1
10220:-1:0
1023-1:0:-1
10241:1:0
1025-1:-1:0
10261:-1:0
1027-1:1:0
10281:2:1
10292:1:0
10301000000000:9:1
10312000000000:9:2
10323000000000:9:3
10334000000000:9:4
10345000000000:9:5
10356000000000:9:6
10367000000000:9:7
10378000000000:9:8
10389000000000:9:0
103935500000:113:33
104071000000:226:66
1041106500000:339:99
10421000000000:3:1
104310:5:0
1044100:4:0
10451000:8:0
104610000:16:0
1047999999999999:9:0
1048999999999999:99:0
1049999999999999:999:0
1050999999999999:9999:0
1051999999999999999:99999:0
1052-9:+5:1
1053+9:-5:-1
1054-9:-5:-4
1055-5:3:1
1056-2:3:1
10574:3:1
10581:3:1
1059-5:-3:-2
1060-2:-3:-2
10614:-3:-2
10621:-3:-2
10634095:4095:0
1064100041000510123:3:0
1065152403346:12345:4321
10669:5:4
1067
1068&bgcd
1069abc:abc:NaN
1070abc:+0:NaN
1071+0:abc:NaN
1072+0:+0:0
1073+0:+1:1
1074+1:+0:1
1075+1:+1:1
1076+2:+3:1
1077+3:+2:1
1078-3:+2:1
1079100:625:25
10804096:81:1
10811034:804:2
108227:90:56:1
108327:90:54:9
1084
1085&blcm
1086abc:abc:NaN
1087abc:+0:NaN
1088+0:abc:NaN
1089+0:+0:0
1090+1:+0:0
1091+0:+1:0
1092+27:+90:270
1093+1034:+804:415668
1094
1095&band
1096abc:abc:NaN
1097abc:0:NaN
10980:abc:NaN
10991:2:0
11003:2:2
1101+8:+2:0
1102+281474976710656:0:0
1103+281474976710656:1:0
1104+281474976710656:+281474976710656:281474976710656
1105-2:-3:-4
1106-1:-1:-1
1107-6:-6:-6
1108-7:-4:-8
1109-7:4:0
1110-4:7:4
1111# equal arguments are treated special, so also do some test with unequal ones
11120xFFFF:0xFFFF:0x0xFFFF
11130xFFFFFF:0xFFFFFF:0x0xFFFFFF
11140xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF
11150xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF
11160xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
11170xF0F0:0xF0F0:0x0xF0F0
11180x0F0F:0x0F0F:0x0x0F0F
11190xF0F0F0:0xF0F0F0:0x0xF0F0F0
11200x0F0F0F:0x0F0F0F:0x0x0F0F0F
11210xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0
11220x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F
11230xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0
11240x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F
11250xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0
11260x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F
11270x1F0F0F0F0F0F:0x3F0F0F0F0F0F:0x0x1F0F0F0F0F0F
1128
1129&bior
1130abc:abc:NaN
1131abc:0:NaN
11320:abc:NaN
11331:2:3
1134+8:+2:10
1135+281474976710656:0:281474976710656
1136+281474976710656:1:281474976710657
1137+281474976710656:281474976710656:281474976710656
1138-2:-3:-1
1139-1:-1:-1
1140-6:-6:-6
1141-7:4:-3
1142-4:7:-1
1143# equal arguments are treated special, so also do some test with unequal ones
11440xFFFF:0xFFFF:0x0xFFFF
11450xFFFFFF:0xFFFFFF:0x0xFFFFFF
11460xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF
11470xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF
11480xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
11490:0xFFFF:0x0xFFFF
11500:0xFFFFFF:0x0xFFFFFF
11510:0xFFFFFFFF:0x0xFFFFFFFF
11520:0xFFFFFFFFFF:0x0xFFFFFFFFFF
11530:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
11540xFFFF:0:0x0xFFFF
11550xFFFFFF:0:0x0xFFFFFF
11560xFFFFFFFF:0:0x0xFFFFFFFF
11570xFFFFFFFFFF:0:0x0xFFFFFFFFFF
11580xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF
11590xF0F0:0xF0F0:0x0xF0F0
11600x0F0F:0x0F0F:0x0x0F0F
11610xF0F0:0x0F0F:0x0xFFFF
11620xF0F0F0:0xF0F0F0:0x0xF0F0F0
11630x0F0F0F:0x0F0F0F:0x0x0F0F0F
11640x0F0F0F:0xF0F0F0:0x0xFFFFFF
11650xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0
11660x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F
11670x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF
11680xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0
11690x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F
11700x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF
11710xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0
11720x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F
11730x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
11740x1F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
1175
1176&bxor
1177abc:abc:NaN
1178abc:0:NaN
11790:abc:NaN
11801:2:3
1181+8:+2:10
1182+281474976710656:0:281474976710656
1183+281474976710656:1:281474976710657
1184+281474976710656:281474976710656:0
1185-2:-3:3
1186-1:-1:0
1187-6:-6:0
1188-7:4:-3
1189-4:7:-5
11904:-7:-3
1191-4:-7:5
1192# equal arguments are treated special, so also do some test with unequal ones
11930xFFFF:0xFFFF:0
11940xFFFFFF:0xFFFFFF:0
11950xFFFFFFFF:0xFFFFFFFF:0
11960xFFFFFFFFFF:0xFFFFFFFFFF:0
11970xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0
11980:0xFFFF:0x0xFFFF
11990:0xFFFFFF:0x0xFFFFFF
12000:0xFFFFFFFF:0x0xFFFFFFFF
12010:0xFFFFFFFFFF:0x0xFFFFFFFFFF
12020:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
12030xFFFF:0:0x0xFFFF
12040xFFFFFF:0:0x0xFFFFFF
12050xFFFFFFFF:0:0x0xFFFFFFFF
12060xFFFFFFFFFF:0:0x0xFFFFFFFFFF
12070xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF
12080xF0F0:0xF0F0:0
12090x0F0F:0x0F0F:0
12100xF0F0:0x0F0F:0x0xFFFF
12110xF0F0F0:0xF0F0F0:0
12120x0F0F0F:0x0F0F0F:0
12130x0F0F0F:0xF0F0F0:0x0xFFFFFF
12140xF0F0F0F0:0xF0F0F0F0:0
12150x0F0F0F0F:0x0F0F0F0F:0
12160x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF
12170xF0F0F0F0F0:0xF0F0F0F0F0:0
12180x0F0F0F0F0F:0x0F0F0F0F0F:0
12190x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF
12200xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0
12210x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0
12220x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
1223
1224&bnot
1225abc:NaN
1226+0:-1
1227+8:-9
1228+281474976710656:-281474976710657
1229-1:0
1230-2:1
1231-12:11
1232
1233&digit
12340:0:0
123512:0:2
123612:1:1
1237123:0:3
1238123:1:2
1239123:2:1
1240123:-1:1
1241123:-2:2
1242123:-3:3
1243123456:0:6
1244123456:1:5
1245123456:2:4
1246123456:3:3
1247123456:4:2
1248123456:5:1
1249123456:-1:1
1250123456:-2:2
1251123456:-3:3
1252100000:-3:0
1253100000:0:0
1254100000:1:0
1255
1256&mantissa
1257abc:NaN
12581e4:1
12592e0:2
1260123:123
1261-1:-1
1262-2:-2
1263+inf:inf
1264-inf:-inf
1265
1266&exponent
1267abc:NaN
12681e4:4
12692e0:0
1270123:0
1271-1:0
1272-2:0
12730:0
1274+inf:inf
1275-inf:inf
1276
1277&parts
1278abc:NaN,NaN
12791e4:1,4
12802e0:2,0
1281123:123,0
1282-1:-1,0
1283-2:-2,0
12840:0,0
1285+inf:inf,inf
1286-inf:-inf,inf
1287
1288&bpow
1289abc:12:NaN
129012:abc:NaN
12910:0:1
12920:1:0
12930:2:0
12940:-1:inf
12950:-2:inf
12961:0:1
12971:1:1
12981:2:1
12991:3:1
13001:-1:1
13011:-2:1
13021:-3:1
13032:0:1
13042:1:2
13052:2:4
13062:3:8
13073:3:27
13082:-1:0.5^
1309-2:-1:-0.5^
13102:-2:0.25^
1311# Y is even => result positive
1312-2:-2:0.25^
1313# Y is odd => result negative
1314-2:-3:-0.125^
1315+inf:1234500012:inf
1316-inf:1234500012:inf
1317-inf:1234500013:-inf
1318+inf:-12345000123:0
1319-inf:-12345000123:0
1320# 1 ** -x => 1 / (1 ** x)
1321-1:0:1
1322-2:0:1
1323-1:1:-1
1324-1:2:1
1325-1:3:-1
1326-1:4:1
1327-1:5:-1
1328-1:-1:-1
1329-1:-2:1
1330-1:-3:-1
1331-1:-4:1
1332-2:2:4
1333-2:3:-8
1334-2:4:16
1335-2:5:-32
1336-3:2:9
1337-3:3:-27
1338-3:4:81
1339-3:5:-243
134010:2:100
134110:3:1000
134210:4:10000
134310:5:100000
134410:6:1000000
134510:7:10000000
134610:8:100000000
134710:9:1000000000
134810:20:100000000000000000000
1349123456:2:15241383936
1350#2:0.5:1.41^
1351
1352&length
1353100:3
135410:2
13551:1
13560:1
135712345:5
135810000000000000000:17
1359-123:3
1360215960156869840440586892398248:30
1361# broot always upgrades
1362
1363&broot
1364144:2:12^
1365123:2:11.09053650640941716205160010260993291846^
1366# bsqrt always upgrades
1367
1368&bsqrt
1369145:12.04159457879229548012824103037860805243^
1370144:12^
1371143:11.95826074310139802112984075619561661399^
137216:4
1373170:13.03840481040529742916594311485836883306^
1374169:13
1375168:12.96148139681572046193193487217599331541^
13764:2
13773:1.732050807568877293527446341505872366943^
13782:1.41421356237309504880168872420969807857^
13799:3
138012:3.464101615137754587054892683011744733886^
1381256:16
1382100000000:10000
13834000000000000:2000000
1384152399026:12345.00004050222755607815159966235881398^
1385152399025:12345
1386152399024:12344.99995949777231103967404745303741942^
13871:1
13880:0
1389-2:NaN
1390-123:NaN
1391Nan:NaN
1392+inf:inf
1393-inf:NaN
1394
1395&bround
1396$round_mode('trunc')
13970:12:0
1398NaNbround:12:NaN
1399+inf:12:inf
1400-inf:12:-inf
14011234:0:1234
14021234:2:1200
1403123456:4:123400
1404123456:5:123450
1405123456:6:123456
1406+10123456789:5:10123000000
1407-10123456789:5:-10123000000
1408+10123456789:9:10123456700
1409-10123456789:9:-10123456700
1410+101234500:6:101234000
1411-101234500:6:-101234000
1412#+101234500:-4:101234000
1413#-101234500:-4:-101234000
1414$round_mode('zero')
1415+20123456789:5:20123000000
1416-20123456789:5:-20123000000
1417+20123456789:9:20123456800
1418-20123456789:9:-20123456800
1419+201234500:6:201234000
1420-201234500:6:-201234000
1421#+201234500:-4:201234000
1422#-201234500:-4:-201234000
1423+12345000:4:12340000
1424-12345000:4:-12340000
1425$round_mode('+inf')
1426+30123456789:5:30123000000
1427-30123456789:5:-30123000000
1428+30123456789:9:30123456800
1429-30123456789:9:-30123456800
1430+301234500:6:301235000
1431-301234500:6:-301234000
1432#+301234500:-4:301235000
1433#-301234500:-4:-301234000
1434+12345000:4:12350000
1435-12345000:4:-12340000
1436$round_mode('-inf')
1437+40123456789:5:40123000000
1438-40123456789:5:-40123000000
1439+40123456789:9:40123456800
1440-40123456789:9:-40123456800
1441+401234500:6:401234000
1442+401234500:6:401234000
1443#-401234500:-4:-401235000
1444#-401234500:-4:-401235000
1445+12345000:4:12340000
1446-12345000:4:-12350000
1447$round_mode('odd')
1448+50123456789:5:50123000000
1449-50123456789:5:-50123000000
1450+50123456789:9:50123456800
1451-50123456789:9:-50123456800
1452+501234500:6:501235000
1453-501234500:6:-501235000
1454#+501234500:-4:501235000
1455#-501234500:-4:-501235000
1456+12345000:4:12350000
1457-12345000:4:-12350000
1458$round_mode('even')
1459+60123456789:5:60123000000
1460-60123456789:5:-60123000000
1461+60123456789:9:60123456800
1462-60123456789:9:-60123456800
1463+601234500:6:601234000
1464-601234500:6:-601234000
1465#+601234500:-4:601234000
1466#-601234500:-4:-601234000
1467#-601234500:-9:0
1468#-501234500:-9:0
1469#-601234500:-8:0
1470#-501234500:-8:0
1471+1234567:7:1234567
1472+1234567:6:1234570
1473+12345000:4:12340000
1474-12345000:4:-12340000
1475
1476&is_zero
14770:1
1478NaNzero:0
1479+inf:0
1480-inf:0
1481123:0
1482-1:0
14831:0
1484
1485&is_one
14860:0
1487NaNone:0
1488+inf:0
1489-inf:0
14901:1
14912:0
1492-1:0
1493-2:0
1494# floor and ceil are pretty pointless in integer space, but play safe
1495
1496&bfloor
14970:0
1498NaNfloor:NaN
1499+inf:inf
1500-inf:-inf
1501-1:-1
1502-2:-2
15032:2
15043:3
1505abc:NaN
1506
1507&bceil
1508NaNceil:NaN
1509+inf:inf
1510-inf:-inf
15110:0
1512-1:-1
1513-2:-2
15142:2
15153:3
1516abc:NaN
1517
1518&bint
1519NaN:NaN
1520+inf:inf
1521-inf:-inf
15220:0
1523-1:-1
1524-2:-2
15252:2
15263:3
1527
1528&to_hex
1529128:80
1530-128:-80
15310:0
1532-0:0
15331:1
15340x123456789123456789:123456789123456789
1535+inf:inf
1536-inf:-inf
1537NaNto_hex:NaN
1538
1539&to_oct
1540128:200
1541-128:-200
15420:0
1543-0:0
15441:1
15450b1010111101010101010110110110110110101:1275252666665
15460x123456789123456789:44321263611044321263611
1547+inf:inf
1548-inf:-inf
1549NaNto_oct:NaN
1550
1551&to_bin
1552128:10000000
1553-128:-10000000
15540:0
1555-0:0
15561:1
15570b1010111101010101010110110110110110101:1010111101010101010110110110110110101
1558+inf:inf
1559-inf:-inf
1560NaNto_bin:NaN
1561
1562&as_hex
1563128:0x80
1564-128:-0x80
15650:0x0
1566-0:0x0
15671:0x1
15680x123456789123456789:0x123456789123456789
1569+inf:inf
1570-inf:-inf
1571NaNas_hex:NaN
1572
1573&as_bin
1574128:0b10000000
1575-128:-0b10000000
15760:0b0
1577-0:0b0
15781:0b1
15790b1010111101010101010110110110110110101:0b1010111101010101010110110110110110101
1580+inf:inf
1581-inf:-inf
1582NaNas_bin:NaN
1583
1584&as_oct
1585128:0200
1586-128:-0200
15870:00
1588-0:00
15891:01
15900b1010111101010101010110110110110110101:01275252666665
15910x123456789123456789:044321263611044321263611
1592+inf:inf
1593-inf:-inf
1594NaNas_oct:NaN
1595