Upgrade to prereleases of Math::BigInt 1.70 and
[p5sagit/p5-mst-13.2.git] / lib / Math / BigInt / t / upgrade.inc
CommitLineData
c38b2de2 1# include this file into another for subclass testing
b3abae2a 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
79c55733 6# BigFloat, depending on how good the internal optimization is (e.g. it
c38b2de2 7# is usually desirable to have 2 ** 2 return a BigInt, not a BigFloat).
b3abae2a 8
c38b2de2 9# Results that are required to be BigFloat are marked with C<^> at the end.
79c55733 10
11# Please note that the testcount goes up by two for each extra result marked
b3abae2a 12# with ^, since then we test whether it has the proper class and that it left
13# the upgrade variable alone.
14
15my $version = ${"$class\::VERSION"};
16
17##############################################################################
18# for testing inheritance of _swap
19
20package Math::Foo;
21
22use Math::BigInt lib => $main::CL;
23use vars qw/@ISA/;
24@ISA = (qw/Math::BigInt/);
25
26use 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
31sub _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##############################################################################
47package main;
48
49my $CALC = $class->config()->{lib}; ok ($CALC,$CL);
50
51my ($f,$z,$a,$exp,@a,$m,$e,$round_mode,$expected_class);
52
53while (<DATA>)
54 {
d614cd8b 55 chomp;
b3abae2a 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 {
79c55733 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 }
b3abae2a 115 if ($f eq "bcmp")
116 {
117 $try .= '$x <=> $y;';
118 } elsif ($f eq "bround") {
119 $try .= "$round_mode; \$x->bround(\$y);";
c38b2de2 120 } elsif ($f eq "broot") {
121 $try .= "\$x->broot(\$y);";
b3abae2a 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
215close DATA;
216
56d9de68 217my $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
b3abae2a 223# all tests done
224
2251;
226
227###############################################################################
228###############################################################################
229# Perl 5.005 does not like ok ($x,undef)
230
231sub 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
243sub 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&.=
2681234:-345:1234-345
269&+=
2701:2:3
271-1:-2:-3
272&-=
2731:2:-1
274-1:-2:1
275&*=
2762:3:6
277-1:5:-5
278&%=
279100:3:1
2808:9:8
281&/=
79c55733 282100:3:33.33333333333333333333333333333333333333
b3abae2a 283-8:2:-4
284&|=
2852:1:3
286&&=
2875:7:5
288&^=
2895:7:2
290&is_negative
2910:0
292-1:1
2931:0
294+inf:0
295-inf:1
296NaNneg:0
297&is_positive
2980:1
299-1:0
3001:1
301+inf:1
302-inf:0
303NaNneg:0
304&is_odd
305abc:0
3060:0
3071:1
3083:1
309-1:1
310-3:1
31110000001:1
31210000002:0
3132:0
314120:0
315121:1
316&is_int
317NaN:0
318inf:0
319-inf:0
3201:1
32112:1
322123e12:1
323&is_even
324abc:0
3250:1
3261:0
3273:0
328-1:0
329-3:0
33010000001:0
33110000002:1
3322:1
333120:1
334121: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
348acmpNaN:123:
349123:acmpNaN:
350acmpNaN: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:
362NaN:inf:
363-inf:NaN:
364NaN:-inf:
365&bnorm
366123:123
36712.3:12.3^
368# binary input
3690babc:NaN
3700b123:NaN
3710b0:0
372-0b0:0
373-0b1:-1
3740b0001:1
3750b001:1
3760b011:3
3770b101:5
3780b1001:9
3790b10001:17
3800b100001:33
3810b1000001:65
3820b10000001:129
3830b100000001:257
3840b1000000001:513
3850b10000000001:1025
3860b100000000001:2049
3870b1000000000001:4097
3880b10000000000001:8193
3890b100000000000001:16385
3900b1000000000000001:32769
3910b10000000000000001:65537
3920b100000000000000001:131073
3930b1000000000000000001:262145
3940b10000000000000000001:524289
3950b100000000000000000001:1048577
3960b1000000000000000000001:2097153
3970b10000000000000000000001:4194305
3980b100000000000000000000001:8388609
3990b1000000000000000000000001:16777217
4000b10000000000000000000000001:33554433
4010b100000000000000000000000001:67108865
4020b1000000000000000000000000001:134217729
4030b10000000000000000000000000001:268435457
4040b100000000000000000000000000001:536870913
4050b1000000000000000000000000000001:1073741825
4060b10000000000000000000000000000001:2147483649
4070b100000000000000000000000000000001:4294967297
4080b1000000000000000000000000000000001:8589934593
4090b10000000000000000000000000000000001:17179869185
4100b_101:NaN
4110b1_0_1:5
4120b0_0_0_1:1
413# hex input
414-0x0:0
4150xabcdefgh:NaN
4160x1234:4660
4170xabcdef:11259375
418-0xABCDEF:-11259375
419-0x1234:-4660
4200x12345678:305419896
4210x1_2_3_4_56_78:305419896
4220xa_b_c_d_e_f:11259375
4230x_123:NaN
4240x9:9
4250x11:17
4260x21:33
4270x41:65
4280x81:129
4290x101:257
4300x201:513
4310x401:1025
4320x801:2049
4330x1001:4097
4340x2001:8193
4350x4001:16385
4360x8001:32769
4370x10001:65537
4380x20001:131073
4390x40001:262145
4400x80001:524289
4410x100001:1048577
4420x200001:2097153
4430x400001:4194305
4440x800001:8388609
4450x1000001:16777217
4460x2000001:33554433
4470x4000001:67108865
4480x8000001:134217729
4490x10000001:268435457
4500x20000001:536870913
4510x40000001:1073741825
4520x80000001:2147483649
4530x100000001:4294967297
4540x200000001:8589934593
4550x400000001:17179869185
4560x800000001:34359738369
457# inf input
458inf:inf
459+inf:inf
460-inf:-inf
4610inf:NaN
462# abnormal input
463:NaN
464abc:NaN
465 1 a:NaN
4661bcd2:NaN
46711111b:NaN
468+1z:NaN
469-1z:NaN
470# only one underscore between two digits
471_123:NaN
472_123_:NaN
473123_:NaN
4741__23:NaN
4751E1__2:NaN
4761_E12:NaN
4771E_12:NaN
4781_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
484E1:NaN
485E23:NaN
4861.23E1:12.3^
4871.23E-1:0.123^
488# bug with two E's in number beeing valid
4891e2e3:NaN
4901e2r:NaN
4911e2.0:NaN
492# leading zeros
493012:12
4940123:123
49501234:1234
496012345:12345
4970123456:123456
49801234567:1234567
499012345678:12345678
5000123456789:123456789
50101234567891:1234567891
502012345678912:12345678912
5030123456789123:123456789123
50401234567891234:1234567891234
505# normal input
5060:0
507+0:0
508+00:0
509+000:0
510000000000000000000:0
511-0:0
512-0000:0
513+1:1
514+01:1
515+001:1
516+00000100000:100000
517123456789:123456789
518-1:-1
519-01:-1
520-001:-1
521-123456789:-123456789
522-00000100000:-100000
5231_2_3:123
52410000000000E-1_0:1
5251E2:100
5261E1:10
5271E0:1
5281.23E2:123
529100E-1:10
530# floating point input
531# .2e2:20
5321.E3:1000
5331.01E2:101
5341010E-1:101
535-1010E0:-1010
536-1010E1:-10100
5371234.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
5431:NaN
5442:NaN
545abc:NaN
546&bone
5472:+:1
5482:-:-1
549boneNaN:-:-1
550boneNaN:+:1
5512:abc:1
5523::1
553&binf
5541:+:inf
5552:-:-inf
5563:abc:inf
557&is_nan
558123:0
559abc:1
560NaN:1
561-123:0
562&is_inf
563+inf::1
564-inf::1
565abc::0
5661::0
567NaN::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
577abc: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
5891234567890123:12:10:1234567890123000000000000
590&brsft
591abc: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
603310000:4:10:31
60412300000:5:10:123
6051230000000000:10:10:123
60609876123456789067890:12:10:9876123
6071234561234567890123:13:10:123456
608&bsstr
6091e+34:1e+34
610123.456E3:123456e+0
611100:1e+2
612abc:NaN
613&bneg
614bnegNaN:NaN
615+inf:-inf
616-inf:inf
617abd:NaN
6180:0
6191:-1
620-1:1
621+123456789:-123456789
622-123456789:123456789
623&babs
624babsNaN:NaN
625+inf:inf
626-inf:inf
6270:0
6281:1
629-1:1
630+123456789:123456789
631-123456789:123456789
632&bcmp
633bcmpNaN:bcmpNaN:
634bcmpNaN:0:
6350:bcmpNaN:
6360:0:0
637-1:0:-1
6380:-1:1
6391:0:1
6400:1:-1
641-1:1:-1
6421:-1:1
643-1:-1:0
6441:1:0
645123:123:0
646123:12:1
64712:123:-1
648-123:-123:0
649-123:-12:-1
650-12:-123:1
651123:124:-1
652124:123:1
653-123:-124:1
654-124:-123:-1
655100: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
6675:inf:-1
6685:inf:-1
669-5:-inf:1
670-5:-inf:1
671# return undef
672+inf:NaN:
673NaN:inf:
674-inf:NaN:
675NaN:-inf:
676&binc
677abc:NaN
678+inf:inf
679-inf:-inf
680+0:1
681+1:2
682-1:0
683&bdec
684abc:NaN
685+inf:inf
686-inf:-inf
687+0:-1
688+1:0
689-1:-2
690&badd
691abc:abc:NaN
692abc:0:NaN
693+0:abc:NaN
694+inf:-inf:NaN
695-inf:+inf:NaN
696+inf:+inf:inf
697-inf:-inf:-inf
698baddNaN:+inf:NaN
699baddNaN:+inf:NaN
700+inf:baddNaN:NaN
701-inf:baddNaN:NaN
7020:0:0
7031:0:1
7040:1:1
7051:1:2
706-1:0:-1
7070:-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
56b9c951 7362:2.5:4.5^
737-123:-1.5:-124.5^
738-1.2:1:-0.2^
b3abae2a 739&bsub
740abc:abc:NaN
741abc:+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
782abc:abc:NaN
783abc:+0:NaN
784+0:abc:NaN
785NaNmul:+inf:NaN
786NaNmul:-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
798123456789123456789:0:0
7990: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
808111:111:12321
80910101:10101:102030201
8101001001:1001001:1002003002001
811100010001:100010001:10002000300020001
81210000100001:10000100001:100002000030000200001
81311111111111:9:99999999999
81422222222222:9:199999999998
81533333333333:9:299999999997
81644444444444:9:399999999996
81755555555555:9:499999999995
81866666666666:9:599999999994
81977777777777:9:699999999993
82088888888888:9:799999999992
82199999999999:9:899999999991
822+25:+25:625
823+12345:+12345:152399025
824+99999:+11111:1111088889
8259999:10000:99990000
82699999:100000:9999900000
827999999:1000000:999999000000
8289999999:10000000:99999990000000
82999999999:100000000:9999999900000000
830999999999:1000000000:999999999000000000
8319999999999:10000000000:99999999990000000000
83299999999999:100000000000:9999999999900000000000
833999999999999:1000000000000:999999999999000000000000
8349999999999999:10000000000000:99999999999990000000000000
83599999999999999:100000000000000:9999999999999900000000000000
836999999999999999:1000000000000000:999999999999999000000000000000
8379999999999999999:10000000000000000:99999999999999990000000000000000
83899999999999999999:100000000000000000:9999999999999999900000000000000000
839999999999999999999:1000000000000000000:999999999999999999000000000000000000
8409999999999999999999:10000000000000000000:99999999999999999990000000000000000000
79c55733 8413:3.5:10.5^
8423.5:3:10.5^
b3abae2a 843&bdiv-list
844100:20:5,0
8454095:4095:1,0
846-4095:-4095:1,0
8474095:-4095:-1,0
848-4095:4095:-1,0
79c55733 849123:2:61.5,1
8509:5:1.8,4
8519:4:2.25,1
b3abae2a 852# inf handling and general remainder
8535:8:0.625,5
8540:8:0,0
79c55733 85511:2:5.5,1
85611:-2:-5.5,-1
857-11:2:-5.5,1
b3abae2a 858# see table in documentation in MBI
8590:inf:0,0
8600:-inf:0,0
8615:inf:0,5
8625:-inf:0,5
863-5:inf:0,-5
864-5:-inf:0,-5
865inf:5:inf,0
866-inf:5:-inf,0
867inf:-5:-inf,0
868-inf:-5:inf,0
8695:5:1,0
870-5:-5:1,0
871inf:inf:NaN,NaN
872-inf:-inf:NaN,NaN
873-inf:inf:NaN,NaN
874inf:-inf:NaN,NaN
8758:0:inf,8
876inf:0:inf,inf
877# exceptions to reminder rule
878-8:0:-inf,-8
879-inf:0:-inf,-inf
8800:0:NaN,NaN
881&bdiv
882abc:abc:NaN
883abc:1:NaN
8841:abc:NaN
8850:0:NaN
886# inf handling (see table in doc)
8870:inf:0
8880:-inf:0
8895:inf:0
8905:-inf:0
891-5:inf:0
892-5:-inf:0
893inf:5:inf
894-inf:5:-inf
895inf:-5:-inf
896-inf:-5:inf
8975:5:1
898-5:-5:1
899inf:inf:NaN
900-inf:-inf:NaN
901-inf:inf:NaN
902inf:-inf:NaN
9038:0:inf
904inf:0:inf
905-8:0:-inf
906-inf:0:-inf
9070:0:NaN
79c55733 90811:2:5.5^
909-11:-2:5.5^
910-11:2:-5.5^
91111:-2:-5.5^
b3abae2a 9120:1:0
9130:-1:0
9141:1:1
915-1:-1:1
9161:-1:-1
917-1:1:-1
9181:2:0.5^
9192:1:2
79c55733 9201000000000:9:111111111.1111111111111111111111111111111^
9212000000000:9:222222222.2222222222222222222222222222222^
9223000000000:9:333333333.3333333333333333333333333333333^
9234000000000:9:444444444.4444444444444444444444444444444^
9245000000000:9:555555555.5555555555555555555555555555556^
9256000000000:9:666666666.6666666666666666666666666666667^
9267000000000:9:777777777.7777777777777777777777777777778^
9278000000000:9:888888888.8888888888888888888888888888889^
b3abae2a 9289000000000:9:1000000000
79c55733 92935500000:113:314159.2920353982300884955752212389380531^
93071000000:226:314159.2920353982300884955752212389380531^
931106500000:339:314159.2920353982300884955752212389380531^
9321000000000:3:333333333.3333333333333333333333333333333^
b3abae2a 933+10:+5:2
934+100:+4:25
935+1000:+8:125
936+10000:+16:625
937999999999999:9:111111111111
938999999999999:99:10101010101
939999999999999:999:1001001001
940999999999999:9999:100010001
941999999999999999:99999:10000100001
942+1111088889:99999:11111
79c55733 943-5:-3:1.666666666666666666666666666666666666667^
944-5:3:-1.666666666666666666666666666666666666667^
9454:3:1.333333333333333333333333333333333333333^
9464:-3:-1.333333333333333333333333333333333333333^
9471:3:0.3333333333333333333333333333333333333333^
9481:-3:-0.3333333333333333333333333333333333333333^
949-2:-3:0.6666666666666666666666666666666666666667^
950-2:3:-0.6666666666666666666666666666666666666667^
9518:5:1.6^
952-8:5:-1.6^
95314:-3:-4.666666666666666666666666666666666666667^
954-14:3:-4.666666666666666666666666666666666666667^
955-14:-3:4.666666666666666666666666666666666666667^
95614:3:4.666666666666666666666666666666666666667^
b3abae2a 957# bug in Calc with '99999' vs $BASE-1
79c55733 958#10000000000000000000000000000000000000000000000000000000000000000000000000000000000:10000000375084540248994272022843165711074:999999962491547381984643365663244474111576
b3abae2a 95912:24:0.5^
960&bmod
961# inf handling, see table in doc
9620:inf:0
9630:-inf:0
9645:inf:5
9655:-inf:5
966-5:inf:-5
967-5:-inf:-5
968inf:5:0
969-inf:5:0
970inf:-5:0
971-inf:-5:0
9725:5:0
973-5:-5:0
974inf:inf:NaN
975-inf:-inf:NaN
976-inf:inf:NaN
977inf:-inf:NaN
9788:0:8
979inf:0:inf
980# exceptions to reminder rule
981-inf:0:-inf
982-8:0:-8
9830:0:NaN
984abc:abc:NaN
985abc:1:abc:NaN
9861:abc:NaN
9870:0:NaN
9880:1:0
9891:0:1
9900:-1:0
991-1:0:-1
9921:1:0
993-1:-1:0
9941:-1:0
995-1:1:0
9961:2:1
9972:1:0
9981000000000:9:1
9992000000000:9:2
10003000000000:9:3
10014000000000:9:4
10025000000000:9:5
10036000000000:9:6
10047000000000:9:7
10058000000000:9:8
10069000000000:9:0
100735500000:113:33
100871000000:226:66
1009106500000:339:99
10101000000000:3:1
101110:5:0
1012100:4:0
10131000:8:0
101410000:16:0
1015999999999999:9:0
1016999999999999:99:0
1017999999999999:999:0
1018999999999999:9999:0
1019999999999999999:99999:0
1020-9:+5:1
1021+9:-5:-1
1022-9:-5:-4
1023-5:3:1
1024-2:3:1
10254:3:1
10261:3:1
1027-5:-3:-2
1028-2:-3:-2
10294:-3:-2
10301:-3:-2
10314095:4095:0
1032100041000510123:3:0
1033152403346:12345:4321
10349:5:4
1035&bgcd
1036abc:abc:NaN
1037abc:+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
1046100:625:25
10474096:81:1
10481034:804:2
104927:90:56:1
105027:90:54:9
1051&blcm
1052abc:abc:NaN
1053abc:+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
1061abc:abc:NaN
1062abc:0:NaN
10630:abc:NaN
10641:2:0
10653: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
10770xFFFF:0xFFFF:0x0xFFFF
10780xFFFFFF:0xFFFFFF:0x0xFFFFFF
10790xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF
10800xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF
10810xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
10820xF0F0:0xF0F0:0x0xF0F0
10830x0F0F:0x0F0F:0x0x0F0F
10840xF0F0F0:0xF0F0F0:0x0xF0F0F0
10850x0F0F0F:0x0F0F0F:0x0x0F0F0F
10860xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0
10870x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F
10880xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0
10890x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F
10900xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0
10910x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F
10920x1F0F0F0F0F0F:0x3F0F0F0F0F0F:0x0x1F0F0F0F0F0F
1093&bior
1094abc:abc:NaN
1095abc:0:NaN
10960:abc:NaN
10971: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
11080xFFFF:0xFFFF:0x0xFFFF
11090xFFFFFF:0xFFFFFF:0x0xFFFFFF
11100xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF
11110xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF
11120xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
11130:0xFFFF:0x0xFFFF
11140:0xFFFFFF:0x0xFFFFFF
11150:0xFFFFFFFF:0x0xFFFFFFFF
11160:0xFFFFFFFFFF:0x0xFFFFFFFFFF
11170:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
11180xFFFF:0:0x0xFFFF
11190xFFFFFF:0:0x0xFFFFFF
11200xFFFFFFFF:0:0x0xFFFFFFFF
11210xFFFFFFFFFF:0:0x0xFFFFFFFFFF
11220xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF
11230xF0F0:0xF0F0:0x0xF0F0
11240x0F0F:0x0F0F:0x0x0F0F
11250xF0F0:0x0F0F:0x0xFFFF
11260xF0F0F0:0xF0F0F0:0x0xF0F0F0
11270x0F0F0F:0x0F0F0F:0x0x0F0F0F
11280x0F0F0F:0xF0F0F0:0x0xFFFFFF
11290xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0
11300x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F
11310x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF
11320xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0
11330x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F
11340x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF
11350xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0
11360x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F
11370x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
11380x1F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
1139&bxor
1140abc:abc:NaN
1141abc:0:NaN
11420:abc:NaN
11431: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
11534:-7:-3
1154-4:-7:5
1155# equal arguments are treated special, so also do some test with unequal ones
11560xFFFF:0xFFFF:0
11570xFFFFFF:0xFFFFFF:0
11580xFFFFFFFF:0xFFFFFFFF:0
11590xFFFFFFFFFF:0xFFFFFFFFFF:0
11600xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0
11610:0xFFFF:0x0xFFFF
11620:0xFFFFFF:0x0xFFFFFF
11630:0xFFFFFFFF:0x0xFFFFFFFF
11640:0xFFFFFFFFFF:0x0xFFFFFFFFFF
11650:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
11660xFFFF:0:0x0xFFFF
11670xFFFFFF:0:0x0xFFFFFF
11680xFFFFFFFF:0:0x0xFFFFFFFF
11690xFFFFFFFFFF:0:0x0xFFFFFFFFFF
11700xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF
11710xF0F0:0xF0F0:0
11720x0F0F:0x0F0F:0
11730xF0F0:0x0F0F:0x0xFFFF
11740xF0F0F0:0xF0F0F0:0
11750x0F0F0F:0x0F0F0F:0
11760x0F0F0F:0xF0F0F0:0x0xFFFFFF
11770xF0F0F0F0:0xF0F0F0F0:0
11780x0F0F0F0F:0x0F0F0F0F:0
11790x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF
11800xF0F0F0F0F0:0xF0F0F0F0F0:0
11810x0F0F0F0F0F:0x0F0F0F0F0F:0
11820x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF
11830xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0
11840x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0
11850x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
1186&bnot
1187abc:NaN
1188+0:-1
1189+8:-9
1190+281474976710656:-281474976710657
1191-1:0
1192-2:1
1193-12:11
1194&digit
11950:0:0
119612:0:2
119712:1:1
1198123:0:3
1199123:1:2
1200123:2:1
1201123:-1:1
1202123:-2:2
1203123:-3:3
1204123456:0:6
1205123456:1:5
1206123456:2:4
1207123456:3:3
1208123456:4:2
1209123456:5:1
1210123456:-1:1
1211123456:-2:2
1212123456:-3:3
1213100000:-3:0
1214100000:0:0
1215100000:1:0
1216&mantissa
1217abc:NaN
12181e4:1
12192e0:2
1220123:123
1221-1:-1
1222-2:-2
1223+inf:inf
1224-inf:-inf
1225&exponent
1226abc:NaN
12271e4:4
12282e0:0
1229123:0
1230-1:0
1231-2:0
12320:1
1233+inf:inf
1234-inf:inf
1235&parts
1236abc:NaN,NaN
12371e4:1,4
12382e0:2,0
1239123:123,0
1240-1:-1,0
1241-2:-2,0
12420:0,1
1243+inf:inf,inf
1244-inf:-inf,inf
1245&bfac
1246-1:NaN
1247NaNfac:NaN
b282a552 1248+inf:inf
b3abae2a 1249-inf:NaN
12500:1
12511:1
12522:2
12533:6
12544:24
12555:120
12566:720
125710:3628800
125811:39916800
125912:479001600
1260&bpow
1261abc:12:NaN
126212:abc:NaN
12630:0:1
12640:1:0
12650:2:0
9b924220 12660:-1:inf
12670:-2:inf
b3abae2a 12681:0:1
12691:1:1
12701:2:1
12711:3:1
12721:-1:1
12731:-2:1
12741:-3:1
12752:0:1
12762:1:2
12772:2:4
12782:3:8
12793:3:27
12802:-1:NaN
1281-2:-1:NaN
12822:-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
9b924220 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
b3abae2a 130810:2:100
130910:3:1000
131010:4:10000
131110:5:100000
131210:6:1000000
131310:7:10000000
131410:8:100000000
131510:9:1000000000
131610:20:100000000000000000000
1317123456:2:15241383936
79c55733 1318#2:0.5:1.41^
b3abae2a 1319&length
1320100:3
132110:2
13221:1
13230:1
132412345:5
132510000000000000000:17
1326-123:3
1327215960156869840440586892398248:30
c38b2de2 1328# broot always upgrades
1329&broot
1330144:2:12^
1331123:2:11.09053650640941716205160010260993291846^
1332# bsqrt always upgrades
b3abae2a 1333&bsqrt
1334145:12.04159457879229548012824103037860805243^
1335144:12^
1336143:11.95826074310139802112984075619561661399^
133716:4
1338170:13.03840481040529742916594311485836883306^
1339169:13
1340168:12.96148139681572046193193487217599331541^
13414:2
13423:1.732050807568877293527446341505872366943^
13432:1.41421356237309504880168872420969807857^
13449:3
134512:3.464101615137754587054892683011744733886^
1346256:16
1347100000000:10000
13484000000000000:2000000
1349152399026:12345.00004050222755607815159966235881398^
1350152399025:12345
1351152399024:12344.99995949777231103967404745303741942^
13521:1
13530:0
1354-2:NaN
1355-123:NaN
1356Nan:NaN
990fb837 1357+inf:inf
1358-inf:NaN
b3abae2a 1359&bround
1360$round_mode('trunc')
13610:12:0
1362NaNbround:12:NaN
1363+inf:12:inf
1364-inf:12:-inf
13651234:0:1234
13661234:2:1200
1367123456:4:123400
1368123456:5:123450
1369123456: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
14400:1
1441NaNzero:0
1442+inf:0
1443-inf:0
1444123:0
1445-1:0
14461:0
1447&is_one
14480:0
1449NaNone:0
1450+inf:0
1451-inf:0
14521:1
14532:0
1454-1:0
1455-2:0
1456# floor and ceil tests are pretty pointless in integer space...but play safe
1457&bfloor
14580:0
1459NaNfloor:NaN
1460+inf:inf
1461-inf:-inf
1462-1:-1
1463-2:-2
14642:2
14653:3
1466abc:NaN
1467&bceil
1468NaNceil:NaN
1469+inf:inf
1470-inf:-inf
14710:0
1472-1:-1
1473-2:-2
14742:2
14753:3
1476abc:NaN
1477&as_hex
1478128:0x80
1479-128:-0x80
14800:0x0
1481-0:0x0
14821:0x1
14830x123456789123456789:0x123456789123456789
1484+inf:inf
1485-inf:-inf
1486NaNas_hex:NaN
1487&as_bin
1488128:0b10000000
1489-128:-0b10000000
14900:0b0
1491-0:0b0
14921:0b1
14930b1010111101010101010110110110110110101:0b1010111101010101010110110110110110101
1494+inf:inf
1495-inf:-inf
1496NaNas_bin:NaN