This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to Math::BigInt v1.65, Math::BigRat v0.10,
[perl5.git] / lib / Math / BigInt / t / upgrade.inc
CommitLineData
b3abae2a
JH
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
79c55733
JH
6# BigFloat, depending on how good the internal optimization is (e.g. it
7# is usually desirable to have 2 ** 2 return an BigInt, not an BigFloat).
b3abae2a 8
79c55733
JH
9# Results that are required to be BigFloat are marked with an "^" at the end.
10
11# Please note that the testcount goes up by two for each extra result marked
b3abae2a
JH
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
JH
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
JH
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
JH
115 if ($f eq "bcmp")
116 {
117 $try .= '$x <=> $y;';
118 } elsif ($f eq "bround") {
119 $try .= "$round_mode; \$x->bround(\$y);";
120 } elsif ($f eq "bacmp"){
121 $try .= '$x->bacmp($y);';
122 } elsif ($f eq "badd"){
123 $try .= '$x + $y;';
124 } elsif ($f eq "bsub"){
125 $try .= '$x - $y;';
126 } elsif ($f eq "bmul"){
127 $try .= '$x * $y;';
128 } elsif ($f eq "bdiv"){
129 $try .= '$x / $y;';
130 } elsif ($f eq "bdiv-list"){
131 $try .= 'join (",",$x->bdiv($y));';
132 # overload via x=
133 } elsif ($f =~ /^.=$/){
134 $try .= "\$x $f \$y;";
135 # overload via x
136 } elsif ($f =~ /^.$/){
137 $try .= "\$x $f \$y;";
138 } elsif ($f eq "bmod"){
139 $try .= '$x % $y;';
140 } elsif ($f eq "bgcd")
141 {
142 if (defined $args[2])
143 {
144 $try .= " \$z = $class->new('$args[2]'); ";
145 }
146 $try .= "$class\::bgcd(\$x, \$y";
147 $try .= ", \$z" if (defined $args[2]);
148 $try .= " );";
149 }
150 elsif ($f eq "blcm")
151 {
152 if (defined $args[2])
153 {
154 $try .= " \$z = $class->new('$args[2]'); ";
155 }
156 $try .= "$class\::blcm(\$x, \$y";
157 $try .= ", \$z" if (defined $args[2]);
158 $try .= " );";
159 }elsif ($f eq "blsft"){
160 if (defined $args[2])
161 {
162 $try .= "\$x->blsft(\$y,$args[2]);";
163 }
164 else
165 {
166 $try .= "\$x << \$y;";
167 }
168 }elsif ($f eq "brsft"){
169 if (defined $args[2])
170 {
171 $try .= "\$x->brsft(\$y,$args[2]);";
172 }
173 else
174 {
175 $try .= "\$x >> \$y;";
176 }
177 }elsif ($f eq "band"){
178 $try .= "\$x & \$y;";
179 }elsif ($f eq "bior"){
180 $try .= "\$x | \$y;";
181 }elsif ($f eq "bxor"){
182 $try .= "\$x ^ \$y;";
183 }elsif ($f eq "bpow"){
184 $try .= "\$x ** \$y;";
185 }elsif ($f eq "digit"){
186 $try = "\$x = $class->new('$args[0]'); \$x->digit($args[1]);";
187 } else { warn "Unknown op '$f'"; }
188 } # end else all other ops
189
190 $ans1 = eval $try;
191 # convert hex/binary targets to decimal
192 if ($ans =~ /^(0x0x|0b0b)/)
193 {
194 $ans =~ s/^0[xb]//; $ans = Math::BigInt->new($ans)->bstr();
195 }
196 if ($ans eq "")
197 {
198 ok_undef ($ans1);
199 }
200 else
201 {
202 # print "try: $try ans: $ans1 $ans\n";
203 print "# Tried: '$try'\n" if !ok ($ans1, $ans);
204 if ($expected_class ne $class)
205 {
206 ok (ref($ans1),$expected_class); # also checks that it really is ref!
207 ok ($Math::BigInt::upgrade,'Math::BigFloat'); # still okay?
208 }
209 }
210 # check internal state of number objects
211 is_valid($ans1,$f) if ref $ans1;
212 } # endwhile data tests
213close DATA;
214
56d9de68
T
215my $warn = ''; $SIG{__WARN__} = sub { $warn = shift; };
216
217# these should not warn
218$warn = ''; eval "\$z = 3.17 <= \$y"; ok ($z, 1); ok ($warn, '');
219$warn = ''; eval "\$z = \$y >= 3.17"; ok ($z, 1); ok ($warn, '');
220
b3abae2a
JH
221# all tests done
222
2231;
224
225###############################################################################
226###############################################################################
227# Perl 5.005 does not like ok ($x,undef)
228
229sub ok_undef
230 {
231 my $x = shift;
232
233 ok (1,1) and return if !defined $x;
234 ok ($x,'undef');
235 }
236
237###############################################################################
238# sub to check validity of a BigInt internally, to ensure that no op leaves a
239# number object in an invalid state (f.i. "-0")
240
241sub is_valid
242 {
243 my ($x,$f,$c) = @_;
244
245 # The checks here are loosened a bit to allow BigInt or BigFloats to pass
246
247 my $e = 0; # error?
248 # ok as reference?
249 # $e = "Not a reference to $c" if (ref($x) || '') ne $c;
250
251 # has ok sign?
252 $e = "Illegal sign $x->{sign} (expected: '+', '-', '-inf', '+inf' or 'NaN'"
253 if $e eq '0' && $x->{sign} !~ /^(\+|-|\+inf|-inf|NaN)$/;
254
255 $e = "-0 is invalid!" if $e ne '0' && $x->{sign} eq '-' && $x == 0;
256 #$e = $CALC->_check($x->{value}) if $e eq '0';
257
258 # test done, see if error did crop up
259 ok (1,1), return if ($e eq '0');
260
261 ok (1,$e." after op '$f'");
262 }
263
264__DATA__
265&.=
2661234:-345:1234-345
267&+=
2681:2:3
269-1:-2:-3
270&-=
2711:2:-1
272-1:-2:1
273&*=
2742:3:6
275-1:5:-5
276&%=
277100:3:1
2788:9:8
279&/=
79c55733 280100:3:33.33333333333333333333333333333333333333
b3abae2a
JH
281-8:2:-4
282&|=
2832:1:3
284&&=
2855:7:5
286&^=
2875:7:2
288&is_negative
2890:0
290-1:1
2911:0
292+inf:0
293-inf:1
294NaNneg:0
295&is_positive
2960:1
297-1:0
2981:1
299+inf:1
300-inf:0
301NaNneg:0
302&is_odd
303abc:0
3040:0
3051:1
3063:1
307-1:1
308-3:1
30910000001:1
31010000002:0
3112:0
312120:0
313121:1
314&is_int
315NaN:0
316inf:0
317-inf:0
3181:1
31912:1
320123e12:1
321&is_even
322abc:0
3230:1
3241:0
3253:0
326-1:0
327-3:0
32810000001:0
32910000002:1
3302:1
331120:1
332121:0
333&bacmp
334+0:-0:0
335+0:+1:-1
336-1:+1:0
337+1:-1:0
338-1:+2:-1
339+2:-1:1
340-123456789:+987654321:-1
341+123456789:-987654321:-1
342+987654321:+123456789:1
343-987654321:+123456789:1
344-123:+4567889:-1
345# NaNs
346acmpNaN:123:
347123:acmpNaN:
348acmpNaN:acmpNaN:
349# infinity
350+inf:+inf:0
351-inf:-inf:0
352+inf:-inf:0
353-inf:+inf:0
354+inf:123:1
355-inf:123:1
356+inf:-123:1
357-inf:-123:1
358# return undef
359+inf:NaN:
360NaN:inf:
361-inf:NaN:
362NaN:-inf:
363&bnorm
364123:123
36512.3:12.3^
366# binary input
3670babc:NaN
3680b123:NaN
3690b0:0
370-0b0:0
371-0b1:-1
3720b0001:1
3730b001:1
3740b011:3
3750b101:5
3760b1001:9
3770b10001:17
3780b100001:33
3790b1000001:65
3800b10000001:129
3810b100000001:257
3820b1000000001:513
3830b10000000001:1025
3840b100000000001:2049
3850b1000000000001:4097
3860b10000000000001:8193
3870b100000000000001:16385
3880b1000000000000001:32769
3890b10000000000000001:65537
3900b100000000000000001:131073
3910b1000000000000000001:262145
3920b10000000000000000001:524289
3930b100000000000000000001:1048577
3940b1000000000000000000001:2097153
3950b10000000000000000000001:4194305
3960b100000000000000000000001:8388609
3970b1000000000000000000000001:16777217
3980b10000000000000000000000001:33554433
3990b100000000000000000000000001:67108865
4000b1000000000000000000000000001:134217729
4010b10000000000000000000000000001:268435457
4020b100000000000000000000000000001:536870913
4030b1000000000000000000000000000001:1073741825
4040b10000000000000000000000000000001:2147483649
4050b100000000000000000000000000000001:4294967297
4060b1000000000000000000000000000000001:8589934593
4070b10000000000000000000000000000000001:17179869185
4080b_101:NaN
4090b1_0_1:5
4100b0_0_0_1:1
411# hex input
412-0x0:0
4130xabcdefgh:NaN
4140x1234:4660
4150xabcdef:11259375
416-0xABCDEF:-11259375
417-0x1234:-4660
4180x12345678:305419896
4190x1_2_3_4_56_78:305419896
4200xa_b_c_d_e_f:11259375
4210x_123:NaN
4220x9:9
4230x11:17
4240x21:33
4250x41:65
4260x81:129
4270x101:257
4280x201:513
4290x401:1025
4300x801:2049
4310x1001:4097
4320x2001:8193
4330x4001:16385
4340x8001:32769
4350x10001:65537
4360x20001:131073
4370x40001:262145
4380x80001:524289
4390x100001:1048577
4400x200001:2097153
4410x400001:4194305
4420x800001:8388609
4430x1000001:16777217
4440x2000001:33554433
4450x4000001:67108865
4460x8000001:134217729
4470x10000001:268435457
4480x20000001:536870913
4490x40000001:1073741825
4500x80000001:2147483649
4510x100000001:4294967297
4520x200000001:8589934593
4530x400000001:17179869185
4540x800000001:34359738369
455# inf input
456inf:inf
457+inf:inf
458-inf:-inf
4590inf:NaN
460# abnormal input
461:NaN
462abc:NaN
463 1 a:NaN
4641bcd2:NaN
46511111b:NaN
466+1z:NaN
467-1z:NaN
468# only one underscore between two digits
469_123:NaN
470_123_:NaN
471123_:NaN
4721__23:NaN
4731E1__2:NaN
4741_E12:NaN
4751E_12:NaN
4761_E_12:NaN
477+_1E12:NaN
478+0_1E2:100
479+0_0_1E2:100
480-0_0_1E2:-100
481-0_0_1E+0_0_2:-100
482E1:NaN
483E23:NaN
4841.23E1:12.3^
4851.23E-1:0.123^
486# bug with two E's in number beeing valid
4871e2e3:NaN
4881e2r:NaN
4891e2.0:NaN
490# leading zeros
491012:12
4920123:123
49301234:1234
494012345:12345
4950123456:123456
49601234567:1234567
497012345678:12345678
4980123456789:123456789
49901234567891:1234567891
500012345678912:12345678912
5010123456789123:123456789123
50201234567891234:1234567891234
503# normal input
5040:0
505+0:0
506+00:0
507+000:0
508000000000000000000:0
509-0:0
510-0000:0
511+1:1
512+01:1
513+001:1
514+00000100000:100000
515123456789:123456789
516-1:-1
517-01:-1
518-001:-1
519-123456789:-123456789
520-00000100000:-100000
5211_2_3:123
52210000000000E-1_0:1
5231E2:100
5241E1:10
5251E0:1
5261.23E2:123
527100E-1:10
528# floating point input
529# .2e2:20
5301.E3:1000
5311.01E2:101
5321010E-1:101
533-1010E0:-1010
534-1010E1:-10100
5351234.00:1234
536# non-integer numbers
537-1010E-2:-10.1^
538-1.01E+1:-10.1^
539-1.01E-1:-0.101^
540&bnan
5411:NaN
5422:NaN
543abc:NaN
544&bone
5452:+:1
5462:-:-1
547boneNaN:-:-1
548boneNaN:+:1
5492:abc:1
5503::1
551&binf
5521:+:inf
5532:-:-inf
5543:abc:inf
555&is_nan
556123:0
557abc:1
558NaN:1
559-123:0
560&is_inf
561+inf::1
562-inf::1
563abc::0
5641::0
565NaN::0
566-1::0
567+inf:-:0
568+inf:+:1
569-inf:-:1
570-inf:+:0
571# it must be exactly /^[+-]inf$/
572+infinity::0
573-infinity::0
574&blsft
575abc:abc:NaN
576+2:+2:8
577+1:+32:4294967296
578+1:+48:281474976710656
579+8:-2:NaN
580# excercise base 10
581+12345:4:10:123450000
582-1234:0:10:-1234
583+1234:0:10:1234
584+2:2:10:200
585+12:2:10:1200
586+1234:-3:10:NaN
5871234567890123:12:10:1234567890123000000000000
588&brsft
589abc:abc:NaN
590+8:+2:2
591+4294967296:+32:1
592+281474976710656:+48:1
593+2:-2:NaN
594# excercise base 10
595-1234:0:10:-1234
596+1234:0:10:1234
597+200:2:10:2
598+1234:3:10:1
599+1234:2:10:12
600+1234:-3:10:NaN
601310000:4:10:31
60212300000:5:10:123
6031230000000000:10:10:123
60409876123456789067890:12:10:9876123
6051234561234567890123:13:10:123456
606&bsstr
6071e+34:1e+34
608123.456E3:123456e+0
609100:1e+2
610abc:NaN
611&bneg
612bnegNaN:NaN
613+inf:-inf
614-inf:inf
615abd:NaN
6160:0
6171:-1
618-1:1
619+123456789:-123456789
620-123456789:123456789
621&babs
622babsNaN:NaN
623+inf:inf
624-inf:inf
6250:0
6261:1
627-1:1
628+123456789:123456789
629-123456789:123456789
630&bcmp
631bcmpNaN:bcmpNaN:
632bcmpNaN:0:
6330:bcmpNaN:
6340:0:0
635-1:0:-1
6360:-1:1
6371:0:1
6380:1:-1
639-1:1:-1
6401:-1:1
641-1:-1:0
6421:1:0
643123:123:0
644123:12:1
64512:123:-1
646-123:-123:0
647-123:-12:-1
648-12:-123:1
649123:124:-1
650124:123:1
651-123:-124:1
652-124:-123:-1
653100:5:1
654-123456789:987654321:-1
655+123456789:-987654321:1
656-987654321:123456789:-1
657-inf:5432112345:-1
658+inf:5432112345:1
659-inf:-5432112345:-1
660+inf:-5432112345:1
661+inf:+inf:0
662-inf:-inf:0
663+inf:-inf:1
664-inf:+inf:-1
6655:inf:-1
6665:inf:-1
667-5:-inf:1
668-5:-inf:1
669# return undef
670+inf:NaN:
671NaN:inf:
672-inf:NaN:
673NaN:-inf:
674&binc
675abc:NaN
676+inf:inf
677-inf:-inf
678+0:1
679+1:2
680-1:0
681&bdec
682abc:NaN
683+inf:inf
684-inf:-inf
685+0:-1
686+1:0
687-1:-2
688&badd
689abc:abc:NaN
690abc:0:NaN
691+0:abc:NaN
692+inf:-inf:NaN
693-inf:+inf:NaN
694+inf:+inf:inf
695-inf:-inf:-inf
696baddNaN:+inf:NaN
697baddNaN:+inf:NaN
698+inf:baddNaN:NaN
699-inf:baddNaN:NaN
7000:0:0
7011:0:1
7020:1:1
7031:1:2
704-1:0:-1
7050:-1:-1
706-1:-1:-2
707-1:+1:0
708+1:-1:0
709+9:+1:10
710+99:+1:100
711+999:+1:1000
712+9999:+1:10000
713+99999:+1:100000
714+999999:+1:1000000
715+9999999:+1:10000000
716+99999999:+1:100000000
717+999999999:+1:1000000000
718+9999999999:+1:10000000000
719+99999999999:+1:100000000000
720+10:-1:9
721+100:-1:99
722+1000:-1:999
723+10000:-1:9999
724+100000:-1:99999
725+1000000:-1:999999
726+10000000:-1:9999999
727+100000000:-1:99999999
728+1000000000:-1:999999999
729+10000000000:-1:9999999999
730+123456789:987654321:1111111110
731-123456789:987654321:864197532
732-123456789:-987654321:-1111111110
733+123456789:-987654321:-864197532
56b9c951
JH
7342:2.5:4.5^
735-123:-1.5:-124.5^
736-1.2:1:-0.2^
b3abae2a
JH
737&bsub
738abc:abc:NaN
739abc:+0:NaN
740+0:abc:NaN
741+inf:-inf:inf
742-inf:+inf:-inf
743+inf:+inf:NaN
744-inf:-inf:NaN
745+0:+0:0
746+1:+0:1
747+0:+1:-1
748+1:+1:0
749-1:+0:-1
750+0:-1:1
751-1:-1:0
752-1:+1:-2
753+1:-1:2
754+9:+1:8
755+99:+1:98
756+999:+1:998
757+9999:+1:9998
758+99999:+1:99998
759+999999:+1:999998
760+9999999:+1:9999998
761+99999999:+1:99999998
762+999999999:+1:999999998
763+9999999999:+1:9999999998
764+99999999999:+1:99999999998
765+10:-1:11
766+100:-1:101
767+1000:-1:1001
768+10000:-1:10001
769+100000:-1:100001
770+1000000:-1:1000001
771+10000000:-1:10000001
772+100000000:-1:100000001
773+1000000000:-1:1000000001
774+10000000000:-1:10000000001
775+123456789:+987654321:-864197532
776-123456789:+987654321:-1111111110
777-123456789:-987654321:864197532
778+123456789:-987654321:1111111110
779&bmul
780abc:abc:NaN
781abc:+0:NaN
782+0:abc:NaN
783NaNmul:+inf:NaN
784NaNmul:-inf:NaN
785-inf:NaNmul:NaN
786+inf:NaNmul:NaN
787+inf:+inf:inf
788+inf:-inf:-inf
789-inf:+inf:-inf
790-inf:-inf:inf
791+0:+0:0
792+0:+1:0
793+1:+0:0
794+0:-1:0
795-1:+0:0
796123456789123456789:0:0
7970:123456789123456789:0
798-1:-1:1
799-1:+1:-1
800+1:-1:-1
801+1:+1:1
802+2:+3:6
803-2:+3:-6
804+2:-3:-6
805-2:-3:6
806111:111:12321
80710101:10101:102030201
8081001001:1001001:1002003002001
809100010001:100010001:10002000300020001
81010000100001:10000100001:100002000030000200001
81111111111111:9:99999999999
81222222222222:9:199999999998
81333333333333:9:299999999997
81444444444444:9:399999999996
81555555555555:9:499999999995
81666666666666:9:599999999994
81777777777777:9:699999999993
81888888888888:9:799999999992
81999999999999:9:899999999991
820+25:+25:625
821+12345:+12345:152399025
822+99999:+11111:1111088889
8239999:10000:99990000
82499999:100000:9999900000
825999999:1000000:999999000000
8269999999:10000000:99999990000000
82799999999:100000000:9999999900000000
828999999999:1000000000:999999999000000000
8299999999999:10000000000:99999999990000000000
83099999999999:100000000000:9999999999900000000000
831999999999999:1000000000000:999999999999000000000000
8329999999999999:10000000000000:99999999999990000000000000
83399999999999999:100000000000000:9999999999999900000000000000
834999999999999999:1000000000000000:999999999999999000000000000000
8359999999999999999:10000000000000000:99999999999999990000000000000000
83699999999999999999:100000000000000000:9999999999999999900000000000000000
837999999999999999999:1000000000000000000:999999999999999999000000000000000000
8389999999999999999999:10000000000000000000:99999999999999999990000000000000000000
79c55733
JH
8393:3.5:10.5^
8403.5:3:10.5^
b3abae2a
JH
841&bdiv-list
842100:20:5,0
8434095:4095:1,0
844-4095:-4095:1,0
8454095:-4095:-1,0
846-4095:4095:-1,0
79c55733
JH
847123:2:61.5,1
8489:5:1.8,4
8499:4:2.25,1
b3abae2a
JH
850# inf handling and general remainder
8515:8:0.625,5
8520:8:0,0
79c55733
JH
85311:2:5.5,1
85411:-2:-5.5,-1
855-11:2:-5.5,1
b3abae2a
JH
856# see table in documentation in MBI
8570:inf:0,0
8580:-inf:0,0
8595:inf:0,5
8605:-inf:0,5
861-5:inf:0,-5
862-5:-inf:0,-5
863inf:5:inf,0
864-inf:5:-inf,0
865inf:-5:-inf,0
866-inf:-5:inf,0
8675:5:1,0
868-5:-5:1,0
869inf:inf:NaN,NaN
870-inf:-inf:NaN,NaN
871-inf:inf:NaN,NaN
872inf:-inf:NaN,NaN
8738:0:inf,8
874inf:0:inf,inf
875# exceptions to reminder rule
876-8:0:-inf,-8
877-inf:0:-inf,-inf
8780:0:NaN,NaN
879&bdiv
880abc:abc:NaN
881abc:1:NaN
8821:abc:NaN
8830:0:NaN
884# inf handling (see table in doc)
8850:inf:0
8860:-inf:0
8875:inf:0
8885:-inf:0
889-5:inf:0
890-5:-inf:0
891inf:5:inf
892-inf:5:-inf
893inf:-5:-inf
894-inf:-5:inf
8955:5:1
896-5:-5:1
897inf:inf:NaN
898-inf:-inf:NaN
899-inf:inf:NaN
900inf:-inf:NaN
9018:0:inf
902inf:0:inf
903-8:0:-inf
904-inf:0:-inf
9050:0:NaN
79c55733
JH
90611:2:5.5^
907-11:-2:5.5^
908-11:2:-5.5^
90911:-2:-5.5^
b3abae2a
JH
9100:1:0
9110:-1:0
9121:1:1
913-1:-1:1
9141:-1:-1
915-1:1:-1
9161:2:0.5^
9172:1:2
79c55733
JH
9181000000000:9:111111111.1111111111111111111111111111111^
9192000000000:9:222222222.2222222222222222222222222222222^
9203000000000:9:333333333.3333333333333333333333333333333^
9214000000000:9:444444444.4444444444444444444444444444444^
9225000000000:9:555555555.5555555555555555555555555555556^
9236000000000:9:666666666.6666666666666666666666666666667^
9247000000000:9:777777777.7777777777777777777777777777778^
9258000000000:9:888888888.8888888888888888888888888888889^
b3abae2a 9269000000000:9:1000000000
79c55733
JH
92735500000:113:314159.2920353982300884955752212389380531^
92871000000:226:314159.2920353982300884955752212389380531^
929106500000:339:314159.2920353982300884955752212389380531^
9301000000000:3:333333333.3333333333333333333333333333333^
b3abae2a
JH
931+10:+5:2
932+100:+4:25
933+1000:+8:125
934+10000:+16:625
935999999999999:9:111111111111
936999999999999:99:10101010101
937999999999999:999:1001001001
938999999999999:9999:100010001
939999999999999999:99999:10000100001
940+1111088889:99999:11111
79c55733
JH
941-5:-3:1.666666666666666666666666666666666666667^
942-5:3:-1.666666666666666666666666666666666666667^
9434:3:1.333333333333333333333333333333333333333^
9444:-3:-1.333333333333333333333333333333333333333^
9451:3:0.3333333333333333333333333333333333333333^
9461:-3:-0.3333333333333333333333333333333333333333^
947-2:-3:0.6666666666666666666666666666666666666667^
948-2:3:-0.6666666666666666666666666666666666666667^
9498:5:1.6^
950-8:5:-1.6^
95114:-3:-4.666666666666666666666666666666666666667^
952-14:3:-4.666666666666666666666666666666666666667^
953-14:-3:4.666666666666666666666666666666666666667^
95414:3:4.666666666666666666666666666666666666667^
b3abae2a 955# bug in Calc with '99999' vs $BASE-1
79c55733 956#10000000000000000000000000000000000000000000000000000000000000000000000000000000000:10000000375084540248994272022843165711074:999999962491547381984643365663244474111576
b3abae2a
JH
95712:24:0.5^
958&bmod
959# inf handling, see table in doc
9600:inf:0
9610:-inf:0
9625:inf:5
9635:-inf:5
964-5:inf:-5
965-5:-inf:-5
966inf:5:0
967-inf:5:0
968inf:-5:0
969-inf:-5:0
9705:5:0
971-5:-5:0
972inf:inf:NaN
973-inf:-inf:NaN
974-inf:inf:NaN
975inf:-inf:NaN
9768:0:8
977inf:0:inf
978# exceptions to reminder rule
979-inf:0:-inf
980-8:0:-8
9810:0:NaN
982abc:abc:NaN
983abc:1:abc:NaN
9841:abc:NaN
9850:0:NaN
9860:1:0
9871:0:1
9880:-1:0
989-1:0:-1
9901:1:0
991-1:-1:0
9921:-1:0
993-1:1:0
9941:2:1
9952:1:0
9961000000000:9:1
9972000000000:9:2
9983000000000:9:3
9994000000000:9:4
10005000000000:9:5
10016000000000:9:6
10027000000000:9:7
10038000000000:9:8
10049000000000:9:0
100535500000:113:33
100671000000:226:66
1007106500000:339:99
10081000000000:3:1
100910:5:0
1010100:4:0
10111000:8:0
101210000:16:0
1013999999999999:9:0
1014999999999999:99:0
1015999999999999:999:0
1016999999999999:9999:0
1017999999999999999:99999:0
1018-9:+5:1
1019+9:-5:-1
1020-9:-5:-4
1021-5:3:1
1022-2:3:1
10234:3:1
10241:3:1
1025-5:-3:-2
1026-2:-3:-2
10274:-3:-2
10281:-3:-2
10294095:4095:0
1030100041000510123:3:0
1031152403346:12345:4321
10329:5:4
1033&bgcd
1034abc:abc:NaN
1035abc:+0:NaN
1036+0:abc:NaN
1037+0:+0:0
1038+0:+1:1
1039+1:+0:1
1040+1:+1:1
1041+2:+3:1
1042+3:+2:1
1043-3:+2:1
1044100:625:25
10454096:81:1
10461034:804:2
104727:90:56:1
104827:90:54:9
1049&blcm
1050abc:abc:NaN
1051abc:+0:NaN
1052+0:abc:NaN
1053+0:+0:NaN
1054+1:+0:0
1055+0:+1:0
1056+27:+90:270
1057+1034:+804:415668
1058&band
1059abc:abc:NaN
1060abc:0:NaN
10610:abc:NaN
10621:2:0
10633:2:2
1064+8:+2:0
1065+281474976710656:0:0
1066+281474976710656:1:0
1067+281474976710656:+281474976710656:281474976710656
1068-2:-3:-4
1069-1:-1:-1
1070-6:-6:-6
1071-7:-4:-8
1072-7:4:0
1073-4:7:4
1074# equal arguments are treated special, so also do some test with unequal ones
10750xFFFF:0xFFFF:0x0xFFFF
10760xFFFFFF:0xFFFFFF:0x0xFFFFFF
10770xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF
10780xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF
10790xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
10800xF0F0:0xF0F0:0x0xF0F0
10810x0F0F:0x0F0F:0x0x0F0F
10820xF0F0F0:0xF0F0F0:0x0xF0F0F0
10830x0F0F0F:0x0F0F0F:0x0x0F0F0F
10840xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0
10850x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F
10860xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0
10870x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F
10880xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0
10890x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F
10900x1F0F0F0F0F0F:0x3F0F0F0F0F0F:0x0x1F0F0F0F0F0F
1091&bior
1092abc:abc:NaN
1093abc:0:NaN
10940:abc:NaN
10951:2:3
1096+8:+2:10
1097+281474976710656:0:281474976710656
1098+281474976710656:1:281474976710657
1099+281474976710656:281474976710656:281474976710656
1100-2:-3:-1
1101-1:-1:-1
1102-6:-6:-6
1103-7:4:-3
1104-4:7:-1
1105# equal arguments are treated special, so also do some test with unequal ones
11060xFFFF:0xFFFF:0x0xFFFF
11070xFFFFFF:0xFFFFFF:0x0xFFFFFF
11080xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF
11090xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF
11100xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
11110:0xFFFF:0x0xFFFF
11120:0xFFFFFF:0x0xFFFFFF
11130:0xFFFFFFFF:0x0xFFFFFFFF
11140:0xFFFFFFFFFF:0x0xFFFFFFFFFF
11150:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
11160xFFFF:0:0x0xFFFF
11170xFFFFFF:0:0x0xFFFFFF
11180xFFFFFFFF:0:0x0xFFFFFFFF
11190xFFFFFFFFFF:0:0x0xFFFFFFFFFF
11200xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF
11210xF0F0:0xF0F0:0x0xF0F0
11220x0F0F:0x0F0F:0x0x0F0F
11230xF0F0:0x0F0F:0x0xFFFF
11240xF0F0F0:0xF0F0F0:0x0xF0F0F0
11250x0F0F0F:0x0F0F0F:0x0x0F0F0F
11260x0F0F0F:0xF0F0F0:0x0xFFFFFF
11270xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0
11280x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F
11290x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF
11300xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0
11310x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F
11320x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF
11330xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0
11340x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F
11350x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
11360x1F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
1137&bxor
1138abc:abc:NaN
1139abc:0:NaN
11400:abc:NaN
11411:2:3
1142+8:+2:10
1143+281474976710656:0:281474976710656
1144+281474976710656:1:281474976710657
1145+281474976710656:281474976710656:0
1146-2:-3:3
1147-1:-1:0
1148-6:-6:0
1149-7:4:-3
1150-4:7:-5
11514:-7:-3
1152-4:-7:5
1153# equal arguments are treated special, so also do some test with unequal ones
11540xFFFF:0xFFFF:0
11550xFFFFFF:0xFFFFFF:0
11560xFFFFFFFF:0xFFFFFFFF:0
11570xFFFFFFFFFF:0xFFFFFFFFFF:0
11580xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0
11590:0xFFFF:0x0xFFFF
11600:0xFFFFFF:0x0xFFFFFF
11610:0xFFFFFFFF:0x0xFFFFFFFF
11620:0xFFFFFFFFFF:0x0xFFFFFFFFFF
11630:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
11640xFFFF:0:0x0xFFFF
11650xFFFFFF:0:0x0xFFFFFF
11660xFFFFFFFF:0:0x0xFFFFFFFF
11670xFFFFFFFFFF:0:0x0xFFFFFFFFFF
11680xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF
11690xF0F0:0xF0F0:0
11700x0F0F:0x0F0F:0
11710xF0F0:0x0F0F:0x0xFFFF
11720xF0F0F0:0xF0F0F0:0
11730x0F0F0F:0x0F0F0F:0
11740x0F0F0F:0xF0F0F0:0x0xFFFFFF
11750xF0F0F0F0:0xF0F0F0F0:0
11760x0F0F0F0F:0x0F0F0F0F:0
11770x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF
11780xF0F0F0F0F0:0xF0F0F0F0F0:0
11790x0F0F0F0F0F:0x0F0F0F0F0F:0
11800x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF
11810xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0
11820x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0
11830x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
1184&bnot
1185abc:NaN
1186+0:-1
1187+8:-9
1188+281474976710656:-281474976710657
1189-1:0
1190-2:1
1191-12:11
1192&digit
11930:0:0
119412:0:2
119512:1:1
1196123:0:3
1197123:1:2
1198123:2:1
1199123:-1:1
1200123:-2:2
1201123:-3:3
1202123456:0:6
1203123456:1:5
1204123456:2:4
1205123456:3:3
1206123456:4:2
1207123456:5:1
1208123456:-1:1
1209123456:-2:2
1210123456:-3:3
1211100000:-3:0
1212100000:0:0
1213100000:1:0
1214&mantissa
1215abc:NaN
12161e4:1
12172e0:2
1218123:123
1219-1:-1
1220-2:-2
1221+inf:inf
1222-inf:-inf
1223&exponent
1224abc:NaN
12251e4:4
12262e0:0
1227123:0
1228-1:0
1229-2:0
12300:1
1231+inf:inf
1232-inf:inf
1233&parts
1234abc:NaN,NaN
12351e4:1,4
12362e0:2,0
1237123:123,0
1238-1:-1,0
1239-2:-2,0
12400:0,1
1241+inf:inf,inf
1242-inf:-inf,inf
1243&bfac
1244-1:NaN
1245NaNfac:NaN
1246+inf:NaN
1247-inf:NaN
12480:1
12491:1
12502:2
12513:6
12524:24
12535:120
12546:720
125510:3628800
125611:39916800
125712:479001600
1258&bpow
1259abc:12:NaN
126012:abc:NaN
12610:0:1
12620:1:0
12630:2:0
12640:-1:NaN
12650:-2:NaN
12661:0:1
12671:1:1
12681:2:1
12691:3:1
12701:-1:1
12711:-2:1
12721:-3:1
12732:0:1
12742:1:2
12752:2:4
12762:3:8
12773:3:27
12782:-1:NaN
1279-2:-1:NaN
12802:-2:NaN
1281-2:-2:NaN
1282+inf:1234500012:inf
1283-inf:1234500012:-inf
1284+inf:-12345000123:inf
1285-inf:-12345000123:-inf
1286# 1 ** -x => 1 / (1 ** x)
1287-1:0:1
1288-2:0:1
1289-1:1:-1
1290-1:2:1
1291-1:3:-1
1292-1:4:1
1293-1:5:-1
1294-1:-1:-1
1295-1:-2:1
1296-1:-3:-1
1297-1:-4:1
129810:2:100
129910:3:1000
130010:4:10000
130110:5:100000
130210:6:1000000
130310:7:10000000
130410:8:100000000
130510:9:1000000000
130610:20:100000000000000000000
1307123456:2:15241383936
79c55733 1308#2:0.5:1.41^
b3abae2a
JH
1309&length
1310100:3
131110:2
13121:1
13130:1
131412345:5
131510000000000000000:17
1316-123:3
1317215960156869840440586892398248:30
1318&bsqrt
1319145:12.04159457879229548012824103037860805243^
1320144:12^
1321143:11.95826074310139802112984075619561661399^
132216:4
1323170:13.03840481040529742916594311485836883306^
1324169:13
1325168:12.96148139681572046193193487217599331541^
13264:2
13273:1.732050807568877293527446341505872366943^
13282:1.41421356237309504880168872420969807857^
13299:3
133012:3.464101615137754587054892683011744733886^
1331256:16
1332100000000:10000
13334000000000000:2000000
1334152399026:12345.00004050222755607815159966235881398^
1335152399025:12345
1336152399024:12344.99995949777231103967404745303741942^
13371:1
13380:0
1339-2:NaN
1340-123:NaN
1341Nan:NaN
990fb837
RGS
1342+inf:inf
1343-inf:NaN
b3abae2a
JH
1344&bround
1345$round_mode('trunc')
13460:12:0
1347NaNbround:12:NaN
1348+inf:12:inf
1349-inf:12:-inf
13501234:0:1234
13511234:2:1200
1352123456:4:123400
1353123456:5:123450
1354123456:6:123456
1355+10123456789:5:10123000000
1356-10123456789:5:-10123000000
1357+10123456789:9:10123456700
1358-10123456789:9:-10123456700
1359+101234500:6:101234000
1360-101234500:6:-101234000
1361#+101234500:-4:101234000
1362#-101234500:-4:-101234000
1363$round_mode('zero')
1364+20123456789:5:20123000000
1365-20123456789:5:-20123000000
1366+20123456789:9:20123456800
1367-20123456789:9:-20123456800
1368+201234500:6:201234000
1369-201234500:6:-201234000
1370#+201234500:-4:201234000
1371#-201234500:-4:-201234000
1372+12345000:4:12340000
1373-12345000:4:-12340000
1374$round_mode('+inf')
1375+30123456789:5:30123000000
1376-30123456789:5:-30123000000
1377+30123456789:9:30123456800
1378-30123456789:9:-30123456800
1379+301234500:6:301235000
1380-301234500:6:-301234000
1381#+301234500:-4:301235000
1382#-301234500:-4:-301234000
1383+12345000:4:12350000
1384-12345000:4:-12340000
1385$round_mode('-inf')
1386+40123456789:5:40123000000
1387-40123456789:5:-40123000000
1388+40123456789:9:40123456800
1389-40123456789:9:-40123456800
1390+401234500:6:401234000
1391+401234500:6:401234000
1392#-401234500:-4:-401235000
1393#-401234500:-4:-401235000
1394+12345000:4:12340000
1395-12345000:4:-12350000
1396$round_mode('odd')
1397+50123456789:5:50123000000
1398-50123456789:5:-50123000000
1399+50123456789:9:50123456800
1400-50123456789:9:-50123456800
1401+501234500:6:501235000
1402-501234500:6:-501235000
1403#+501234500:-4:501235000
1404#-501234500:-4:-501235000
1405+12345000:4:12350000
1406-12345000:4:-12350000
1407$round_mode('even')
1408+60123456789:5:60123000000
1409-60123456789:5:-60123000000
1410+60123456789:9:60123456800
1411-60123456789:9:-60123456800
1412+601234500:6:601234000
1413-601234500:6:-601234000
1414#+601234500:-4:601234000
1415#-601234500:-4:-601234000
1416#-601234500:-9:0
1417#-501234500:-9:0
1418#-601234500:-8:0
1419#-501234500:-8:0
1420+1234567:7:1234567
1421+1234567:6:1234570
1422+12345000:4:12340000
1423-12345000:4:-12340000
1424&is_zero
14250:1
1426NaNzero:0
1427+inf:0
1428-inf:0
1429123:0
1430-1:0
14311:0
1432&is_one
14330:0
1434NaNone:0
1435+inf:0
1436-inf:0
14371:1
14382:0
1439-1:0
1440-2:0
1441# floor and ceil tests are pretty pointless in integer space...but play safe
1442&bfloor
14430:0
1444NaNfloor:NaN
1445+inf:inf
1446-inf:-inf
1447-1:-1
1448-2:-2
14492:2
14503:3
1451abc:NaN
1452&bceil
1453NaNceil:NaN
1454+inf:inf
1455-inf:-inf
14560:0
1457-1:-1
1458-2:-2
14592:2
14603:3
1461abc:NaN
1462&as_hex
1463128:0x80
1464-128:-0x80
14650:0x0
1466-0:0x0
14671:0x1
14680x123456789123456789:0x123456789123456789
1469+inf:inf
1470-inf:-inf
1471NaNas_hex:NaN
1472&as_bin
1473128:0b10000000
1474-128:-0b10000000
14750:0b0
1476-0:0b0
14771:0b1
14780b1010111101010101010110110110110110101:0b1010111101010101010110110110110110101
1479+inf:inf
1480-inf:-inf
1481NaNas_bin:NaN