This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
attr
[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
6# BigFloat, depending on how good the internal optimization is.
7
8# Plaese note that the testcount goes up by two for each extra result marked
9# with ^, since then we test whether it has the proper class and that it left
10# the upgrade variable alone.
11
12my $version = ${"$class\::VERSION"};
13
14##############################################################################
15# for testing inheritance of _swap
16
17package Math::Foo;
18
19use Math::BigInt lib => $main::CL;
20use vars qw/@ISA/;
21@ISA = (qw/Math::BigInt/);
22
23use overload
24# customized overload for sub, since original does not use swap there
25'-' => sub { my @a = ref($_[0])->_swap(@_);
26 $a[0]->bsub($a[1])};
27
28sub _swap
29 {
30 # a fake _swap, which reverses the params
31 my $self = shift; # for override in subclass
32 if ($_[2])
33 {
34 my $c = ref ($_[0] ) || 'Math::Foo';
35 return ( $_[0]->copy(), $_[1] );
36 }
37 else
38 {
39 return ( Math::Foo->new($_[1]), $_[0] );
40 }
41 }
42
43##############################################################################
44package main;
45
46my $CALC = $class->config()->{lib}; ok ($CALC,$CL);
47
48my ($f,$z,$a,$exp,@a,$m,$e,$round_mode,$expected_class);
49
50while (<DATA>)
51 {
52 chop;
53 next if /^#/; # skip comments
54 if (s/^&//)
55 {
56 $f = $_; next;
57 }
58 elsif (/^\$/)
59 {
60 $round_mode = $_; $round_mode =~ s/^\$/$class\->/; next;
61 }
62
63 @args = split(/:/,$_,99); $ans = pop(@args);
64 $expected_class = $class;
65 if ($ans =~ /\^$/)
66 {
67 $expected_class = $ECL; $ans =~ s/\^$//;
68 }
69 $try = "\$x = $class->new(\"$args[0]\");";
70 if ($f eq "bnorm")
71 {
72 $try = "\$x = $class->bnorm(\"$args[0]\");";
73 # some is_xxx tests
74 } elsif ($f =~ /^is_(zero|one|odd|even|negative|positive|nan|int)$/) {
75 $try .= "\$x->$f();";
76 } elsif ($f eq "as_hex") {
77 $try .= '$x->as_hex();';
78 } elsif ($f eq "as_bin") {
79 $try .= '$x->as_bin();';
80 } elsif ($f eq "is_inf") {
81 $try .= "\$x->is_inf('$args[1]');";
82 } elsif ($f eq "binf") {
83 $try .= "\$x->binf('$args[1]');";
84 } elsif ($f eq "bone") {
85 $try .= "\$x->bone('$args[1]');";
86 # some unary ops
87 } elsif ($f =~ /^b(nan|floor|ceil|sstr|neg|abs|inc|dec|not|sqrt|fac)$/) {
88 $try .= "\$x->$f();";
89 } elsif ($f eq "length") {
90 $try .= '$x->length();';
91 } elsif ($f eq "exponent"){
92 # ->bstr() to see if an object is returned
93 $try .= '$x = $x->exponent()->bstr();';
94 } elsif ($f eq "mantissa"){
95 # ->bstr() to see if an object is returned
96 $try .= '$x = $x->mantissa()->bstr();';
97 } elsif ($f eq "parts"){
98 $try .= '($m,$e) = $x->parts();';
99 # ->bstr() to see if an object is returned
100 $try .= '$m = $m->bstr(); $m = "NaN" if !defined $m;';
101 $try .= '$e = $e->bstr(); $e = "NaN" if !defined $e;';
102 $try .= '"$m,$e";';
103 } else {
104 $try .= "\$y = $class->new('$args[1]');";
105 if ($f eq "bcmp")
106 {
107 $try .= '$x <=> $y;';
108 } elsif ($f eq "bround") {
109 $try .= "$round_mode; \$x->bround(\$y);";
110 } elsif ($f eq "bacmp"){
111 $try .= '$x->bacmp($y);';
112 } elsif ($f eq "badd"){
113 $try .= '$x + $y;';
114 } elsif ($f eq "bsub"){
115 $try .= '$x - $y;';
116 } elsif ($f eq "bmul"){
117 $try .= '$x * $y;';
118 } elsif ($f eq "bdiv"){
119 $try .= '$x / $y;';
120 } elsif ($f eq "bdiv-list"){
121 $try .= 'join (",",$x->bdiv($y));';
122 # overload via x=
123 } elsif ($f =~ /^.=$/){
124 $try .= "\$x $f \$y;";
125 # overload via x
126 } elsif ($f =~ /^.$/){
127 $try .= "\$x $f \$y;";
128 } elsif ($f eq "bmod"){
129 $try .= '$x % $y;';
130 } elsif ($f eq "bgcd")
131 {
132 if (defined $args[2])
133 {
134 $try .= " \$z = $class->new('$args[2]'); ";
135 }
136 $try .= "$class\::bgcd(\$x, \$y";
137 $try .= ", \$z" if (defined $args[2]);
138 $try .= " );";
139 }
140 elsif ($f eq "blcm")
141 {
142 if (defined $args[2])
143 {
144 $try .= " \$z = $class->new('$args[2]'); ";
145 }
146 $try .= "$class\::blcm(\$x, \$y";
147 $try .= ", \$z" if (defined $args[2]);
148 $try .= " );";
149 }elsif ($f eq "blsft"){
150 if (defined $args[2])
151 {
152 $try .= "\$x->blsft(\$y,$args[2]);";
153 }
154 else
155 {
156 $try .= "\$x << \$y;";
157 }
158 }elsif ($f eq "brsft"){
159 if (defined $args[2])
160 {
161 $try .= "\$x->brsft(\$y,$args[2]);";
162 }
163 else
164 {
165 $try .= "\$x >> \$y;";
166 }
167 }elsif ($f eq "band"){
168 $try .= "\$x & \$y;";
169 }elsif ($f eq "bior"){
170 $try .= "\$x | \$y;";
171 }elsif ($f eq "bxor"){
172 $try .= "\$x ^ \$y;";
173 }elsif ($f eq "bpow"){
174 $try .= "\$x ** \$y;";
175 }elsif ($f eq "digit"){
176 $try = "\$x = $class->new('$args[0]'); \$x->digit($args[1]);";
177 } else { warn "Unknown op '$f'"; }
178 } # end else all other ops
179
180 $ans1 = eval $try;
181 # convert hex/binary targets to decimal
182 if ($ans =~ /^(0x0x|0b0b)/)
183 {
184 $ans =~ s/^0[xb]//; $ans = Math::BigInt->new($ans)->bstr();
185 }
186 if ($ans eq "")
187 {
188 ok_undef ($ans1);
189 }
190 else
191 {
192 # print "try: $try ans: $ans1 $ans\n";
193 print "# Tried: '$try'\n" if !ok ($ans1, $ans);
194 if ($expected_class ne $class)
195 {
196 ok (ref($ans1),$expected_class); # also checks that it really is ref!
197 ok ($Math::BigInt::upgrade,'Math::BigFloat'); # still okay?
198 }
199 }
200 # check internal state of number objects
201 is_valid($ans1,$f) if ref $ans1;
202 } # endwhile data tests
203close DATA;
204
205# all tests done
206
2071;
208
209###############################################################################
210###############################################################################
211# Perl 5.005 does not like ok ($x,undef)
212
213sub ok_undef
214 {
215 my $x = shift;
216
217 ok (1,1) and return if !defined $x;
218 ok ($x,'undef');
219 }
220
221###############################################################################
222# sub to check validity of a BigInt internally, to ensure that no op leaves a
223# number object in an invalid state (f.i. "-0")
224
225sub is_valid
226 {
227 my ($x,$f,$c) = @_;
228
229 # The checks here are loosened a bit to allow BigInt or BigFloats to pass
230
231 my $e = 0; # error?
232 # ok as reference?
233 # $e = "Not a reference to $c" if (ref($x) || '') ne $c;
234
235 # has ok sign?
236 $e = "Illegal sign $x->{sign} (expected: '+', '-', '-inf', '+inf' or 'NaN'"
237 if $e eq '0' && $x->{sign} !~ /^(\+|-|\+inf|-inf|NaN)$/;
238
239 $e = "-0 is invalid!" if $e ne '0' && $x->{sign} eq '-' && $x == 0;
240 #$e = $CALC->_check($x->{value}) if $e eq '0';
241
242 # test done, see if error did crop up
243 ok (1,1), return if ($e eq '0');
244
245 ok (1,$e." after op '$f'");
246 }
247
248__DATA__
249&.=
2501234:-345:1234-345
251&+=
2521:2:3
253-1:-2:-3
254&-=
2551:2:-1
256-1:-2:1
257&*=
2582:3:6
259-1:5:-5
260&%=
261100:3:1
2628:9:8
263&/=
264100:3:33
265-8:2:-4
266&|=
2672:1:3
268&&=
2695:7:5
270&^=
2715:7:2
272&is_negative
2730:0
274-1:1
2751:0
276+inf:0
277-inf:1
278NaNneg:0
279&is_positive
2800:1
281-1:0
2821:1
283+inf:1
284-inf:0
285NaNneg:0
286&is_odd
287abc:0
2880:0
2891:1
2903:1
291-1:1
292-3:1
29310000001:1
29410000002:0
2952:0
296120:0
297121:1
298&is_int
299NaN:0
300inf:0
301-inf:0
3021:1
30312:1
304123e12:1
305&is_even
306abc:0
3070:1
3081:0
3093:0
310-1:0
311-3:0
31210000001:0
31310000002:1
3142:1
315120:1
316121:0
317&bacmp
318+0:-0:0
319+0:+1:-1
320-1:+1:0
321+1:-1:0
322-1:+2:-1
323+2:-1:1
324-123456789:+987654321:-1
325+123456789:-987654321:-1
326+987654321:+123456789:1
327-987654321:+123456789:1
328-123:+4567889:-1
329# NaNs
330acmpNaN:123:
331123:acmpNaN:
332acmpNaN:acmpNaN:
333# infinity
334+inf:+inf:0
335-inf:-inf:0
336+inf:-inf:0
337-inf:+inf:0
338+inf:123:1
339-inf:123:1
340+inf:-123:1
341-inf:-123:1
342# return undef
343+inf:NaN:
344NaN:inf:
345-inf:NaN:
346NaN:-inf:
347&bnorm
348123:123
34912.3:12.3^
350# binary input
3510babc:NaN
3520b123:NaN
3530b0:0
354-0b0:0
355-0b1:-1
3560b0001:1
3570b001:1
3580b011:3
3590b101:5
3600b1001:9
3610b10001:17
3620b100001:33
3630b1000001:65
3640b10000001:129
3650b100000001:257
3660b1000000001:513
3670b10000000001:1025
3680b100000000001:2049
3690b1000000000001:4097
3700b10000000000001:8193
3710b100000000000001:16385
3720b1000000000000001:32769
3730b10000000000000001:65537
3740b100000000000000001:131073
3750b1000000000000000001:262145
3760b10000000000000000001:524289
3770b100000000000000000001:1048577
3780b1000000000000000000001:2097153
3790b10000000000000000000001:4194305
3800b100000000000000000000001:8388609
3810b1000000000000000000000001:16777217
3820b10000000000000000000000001:33554433
3830b100000000000000000000000001:67108865
3840b1000000000000000000000000001:134217729
3850b10000000000000000000000000001:268435457
3860b100000000000000000000000000001:536870913
3870b1000000000000000000000000000001:1073741825
3880b10000000000000000000000000000001:2147483649
3890b100000000000000000000000000000001:4294967297
3900b1000000000000000000000000000000001:8589934593
3910b10000000000000000000000000000000001:17179869185
3920b_101:NaN
3930b1_0_1:5
3940b0_0_0_1:1
395# hex input
396-0x0:0
3970xabcdefgh:NaN
3980x1234:4660
3990xabcdef:11259375
400-0xABCDEF:-11259375
401-0x1234:-4660
4020x12345678:305419896
4030x1_2_3_4_56_78:305419896
4040xa_b_c_d_e_f:11259375
4050x_123:NaN
4060x9:9
4070x11:17
4080x21:33
4090x41:65
4100x81:129
4110x101:257
4120x201:513
4130x401:1025
4140x801:2049
4150x1001:4097
4160x2001:8193
4170x4001:16385
4180x8001:32769
4190x10001:65537
4200x20001:131073
4210x40001:262145
4220x80001:524289
4230x100001:1048577
4240x200001:2097153
4250x400001:4194305
4260x800001:8388609
4270x1000001:16777217
4280x2000001:33554433
4290x4000001:67108865
4300x8000001:134217729
4310x10000001:268435457
4320x20000001:536870913
4330x40000001:1073741825
4340x80000001:2147483649
4350x100000001:4294967297
4360x200000001:8589934593
4370x400000001:17179869185
4380x800000001:34359738369
439# inf input
440inf:inf
441+inf:inf
442-inf:-inf
4430inf:NaN
444# abnormal input
445:NaN
446abc:NaN
447 1 a:NaN
4481bcd2:NaN
44911111b:NaN
450+1z:NaN
451-1z:NaN
452# only one underscore between two digits
453_123:NaN
454_123_:NaN
455123_:NaN
4561__23:NaN
4571E1__2:NaN
4581_E12:NaN
4591E_12:NaN
4601_E_12:NaN
461+_1E12:NaN
462+0_1E2:100
463+0_0_1E2:100
464-0_0_1E2:-100
465-0_0_1E+0_0_2:-100
466E1:NaN
467E23:NaN
4681.23E1:12.3^
4691.23E-1:0.123^
470# bug with two E's in number beeing valid
4711e2e3:NaN
4721e2r:NaN
4731e2.0:NaN
474# leading zeros
475012:12
4760123:123
47701234:1234
478012345:12345
4790123456:123456
48001234567:1234567
481012345678:12345678
4820123456789:123456789
48301234567891:1234567891
484012345678912:12345678912
4850123456789123:123456789123
48601234567891234:1234567891234
487# normal input
4880:0
489+0:0
490+00:0
491+000:0
492000000000000000000:0
493-0:0
494-0000:0
495+1:1
496+01:1
497+001:1
498+00000100000:100000
499123456789:123456789
500-1:-1
501-01:-1
502-001:-1
503-123456789:-123456789
504-00000100000:-100000
5051_2_3:123
50610000000000E-1_0:1
5071E2:100
5081E1:10
5091E0:1
5101.23E2:123
511100E-1:10
512# floating point input
513# .2e2:20
5141.E3:1000
5151.01E2:101
5161010E-1:101
517-1010E0:-1010
518-1010E1:-10100
5191234.00:1234
520# non-integer numbers
521-1010E-2:-10.1^
522-1.01E+1:-10.1^
523-1.01E-1:-0.101^
524&bnan
5251:NaN
5262:NaN
527abc:NaN
528&bone
5292:+:1
5302:-:-1
531boneNaN:-:-1
532boneNaN:+:1
5332:abc:1
5343::1
535&binf
5361:+:inf
5372:-:-inf
5383:abc:inf
539&is_nan
540123:0
541abc:1
542NaN:1
543-123:0
544&is_inf
545+inf::1
546-inf::1
547abc::0
5481::0
549NaN::0
550-1::0
551+inf:-:0
552+inf:+:1
553-inf:-:1
554-inf:+:0
555# it must be exactly /^[+-]inf$/
556+infinity::0
557-infinity::0
558&blsft
559abc:abc:NaN
560+2:+2:8
561+1:+32:4294967296
562+1:+48:281474976710656
563+8:-2:NaN
564# excercise base 10
565+12345:4:10:123450000
566-1234:0:10:-1234
567+1234:0:10:1234
568+2:2:10:200
569+12:2:10:1200
570+1234:-3:10:NaN
5711234567890123:12:10:1234567890123000000000000
572&brsft
573abc:abc:NaN
574+8:+2:2
575+4294967296:+32:1
576+281474976710656:+48:1
577+2:-2:NaN
578# excercise base 10
579-1234:0:10:-1234
580+1234:0:10:1234
581+200:2:10:2
582+1234:3:10:1
583+1234:2:10:12
584+1234:-3:10:NaN
585310000:4:10:31
58612300000:5:10:123
5871230000000000:10:10:123
58809876123456789067890:12:10:9876123
5891234561234567890123:13:10:123456
590&bsstr
5911e+34:1e+34
592123.456E3:123456e+0
593100:1e+2
594abc:NaN
595&bneg
596bnegNaN:NaN
597+inf:-inf
598-inf:inf
599abd:NaN
6000:0
6011:-1
602-1:1
603+123456789:-123456789
604-123456789:123456789
605&babs
606babsNaN:NaN
607+inf:inf
608-inf:inf
6090:0
6101:1
611-1:1
612+123456789:123456789
613-123456789:123456789
614&bcmp
615bcmpNaN:bcmpNaN:
616bcmpNaN:0:
6170:bcmpNaN:
6180:0:0
619-1:0:-1
6200:-1:1
6211:0:1
6220:1:-1
623-1:1:-1
6241:-1:1
625-1:-1:0
6261:1:0
627123:123:0
628123:12:1
62912:123:-1
630-123:-123:0
631-123:-12:-1
632-12:-123:1
633123:124:-1
634124:123:1
635-123:-124:1
636-124:-123:-1
637100:5:1
638-123456789:987654321:-1
639+123456789:-987654321:1
640-987654321:123456789:-1
641-inf:5432112345:-1
642+inf:5432112345:1
643-inf:-5432112345:-1
644+inf:-5432112345:1
645+inf:+inf:0
646-inf:-inf:0
647+inf:-inf:1
648-inf:+inf:-1
6495:inf:-1
6505:inf:-1
651-5:-inf:1
652-5:-inf:1
653# return undef
654+inf:NaN:
655NaN:inf:
656-inf:NaN:
657NaN:-inf:
658&binc
659abc:NaN
660+inf:inf
661-inf:-inf
662+0:1
663+1:2
664-1:0
665&bdec
666abc:NaN
667+inf:inf
668-inf:-inf
669+0:-1
670+1:0
671-1:-2
672&badd
673abc:abc:NaN
674abc:0:NaN
675+0:abc:NaN
676+inf:-inf:NaN
677-inf:+inf:NaN
678+inf:+inf:inf
679-inf:-inf:-inf
680baddNaN:+inf:NaN
681baddNaN:+inf:NaN
682+inf:baddNaN:NaN
683-inf:baddNaN:NaN
6840:0:0
6851:0:1
6860:1:1
6871:1:2
688-1:0:-1
6890:-1:-1
690-1:-1:-2
691-1:+1:0
692+1:-1:0
693+9:+1:10
694+99:+1:100
695+999:+1:1000
696+9999:+1:10000
697+99999:+1:100000
698+999999:+1:1000000
699+9999999:+1:10000000
700+99999999:+1:100000000
701+999999999:+1:1000000000
702+9999999999:+1:10000000000
703+99999999999:+1:100000000000
704+10:-1:9
705+100:-1:99
706+1000:-1:999
707+10000:-1:9999
708+100000:-1:99999
709+1000000:-1:999999
710+10000000:-1:9999999
711+100000000:-1:99999999
712+1000000000:-1:999999999
713+10000000000:-1:9999999999
714+123456789:987654321:1111111110
715-123456789:987654321:864197532
716-123456789:-987654321:-1111111110
717+123456789:-987654321:-864197532
718#2:2.5:4.5^
719#-123:-1.5:-124.5^
720#-1.2:1:-0.2^
721&bsub
722abc:abc:NaN
723abc:+0:NaN
724+0:abc:NaN
725+inf:-inf:inf
726-inf:+inf:-inf
727+inf:+inf:NaN
728-inf:-inf:NaN
729+0:+0:0
730+1:+0:1
731+0:+1:-1
732+1:+1:0
733-1:+0:-1
734+0:-1:1
735-1:-1:0
736-1:+1:-2
737+1:-1:2
738+9:+1:8
739+99:+1:98
740+999:+1:998
741+9999:+1:9998
742+99999:+1:99998
743+999999:+1:999998
744+9999999:+1:9999998
745+99999999:+1:99999998
746+999999999:+1:999999998
747+9999999999:+1:9999999998
748+99999999999:+1:99999999998
749+10:-1:11
750+100:-1:101
751+1000:-1:1001
752+10000:-1:10001
753+100000:-1:100001
754+1000000:-1:1000001
755+10000000:-1:10000001
756+100000000:-1:100000001
757+1000000000:-1:1000000001
758+10000000000:-1:10000000001
759+123456789:+987654321:-864197532
760-123456789:+987654321:-1111111110
761-123456789:-987654321:864197532
762+123456789:-987654321:1111111110
763&bmul
764abc:abc:NaN
765abc:+0:NaN
766+0:abc:NaN
767NaNmul:+inf:NaN
768NaNmul:-inf:NaN
769-inf:NaNmul:NaN
770+inf:NaNmul:NaN
771+inf:+inf:inf
772+inf:-inf:-inf
773-inf:+inf:-inf
774-inf:-inf:inf
775+0:+0:0
776+0:+1:0
777+1:+0:0
778+0:-1:0
779-1:+0:0
780123456789123456789:0:0
7810:123456789123456789:0
782-1:-1:1
783-1:+1:-1
784+1:-1:-1
785+1:+1:1
786+2:+3:6
787-2:+3:-6
788+2:-3:-6
789-2:-3:6
790111:111:12321
79110101:10101:102030201
7921001001:1001001:1002003002001
793100010001:100010001:10002000300020001
79410000100001:10000100001:100002000030000200001
79511111111111:9:99999999999
79622222222222:9:199999999998
79733333333333:9:299999999997
79844444444444:9:399999999996
79955555555555:9:499999999995
80066666666666:9:599999999994
80177777777777:9:699999999993
80288888888888:9:799999999992
80399999999999:9:899999999991
804+25:+25:625
805+12345:+12345:152399025
806+99999:+11111:1111088889
8079999:10000:99990000
80899999:100000:9999900000
809999999:1000000:999999000000
8109999999:10000000:99999990000000
81199999999:100000000:9999999900000000
812999999999:1000000000:999999999000000000
8139999999999:10000000000:99999999990000000000
81499999999999:100000000000:9999999999900000000000
815999999999999:1000000000000:999999999999000000000000
8169999999999999:10000000000000:99999999999990000000000000
81799999999999999:100000000000000:9999999999999900000000000000
818999999999999999:1000000000000000:999999999999999000000000000000
8199999999999999999:10000000000000000:99999999999999990000000000000000
82099999999999999999:100000000000000000:9999999999999999900000000000000000
821999999999999999999:1000000000000000000:999999999999999999000000000000000000
8229999999999999999999:10000000000000000000:99999999999999999990000000000000000000
823&bdiv-list
824100:20:5,0
8254095:4095:1,0
826-4095:-4095:1,0
8274095:-4095:-1,0
828-4095:4095:-1,0
829123:2:61,1
8309:5:1,4
8319:4:2,1
832# inf handling and general remainder
8335:8:0.625,5
8340:8:0,0
83511:2:5,1
83611:-2:-5,-1
837-11:2:-5,1
838# see table in documentation in MBI
8390:inf:0,0
8400:-inf:0,0
8415:inf:0,5
8425:-inf:0,5
843-5:inf:0,-5
844-5:-inf:0,-5
845inf:5:inf,0
846-inf:5:-inf,0
847inf:-5:-inf,0
848-inf:-5:inf,0
8495:5:1,0
850-5:-5:1,0
851inf:inf:NaN,NaN
852-inf:-inf:NaN,NaN
853-inf:inf:NaN,NaN
854inf:-inf:NaN,NaN
8558:0:inf,8
856inf:0:inf,inf
857# exceptions to reminder rule
858-8:0:-inf,-8
859-inf:0:-inf,-inf
8600:0:NaN,NaN
861&bdiv
862abc:abc:NaN
863abc:1:NaN
8641:abc:NaN
8650:0:NaN
866# inf handling (see table in doc)
8670:inf:0
8680:-inf:0
8695:inf:0
8705:-inf:0
871-5:inf:0
872-5:-inf:0
873inf:5:inf
874-inf:5:-inf
875inf:-5:-inf
876-inf:-5:inf
8775:5:1
878-5:-5:1
879inf:inf:NaN
880-inf:-inf:NaN
881-inf:inf:NaN
882inf:-inf:NaN
8838:0:inf
884inf:0:inf
885-8:0:-inf
886-inf:0:-inf
8870:0:NaN
88811:2:5
889-11:-2:5
890-11:2:-5
89111:-2:-5
8920:1:0
8930:-1:0
8941:1:1
895-1:-1:1
8961:-1:-1
897-1:1:-1
8981:2:0.5^
8992:1:2
9001000000000:9:111111111
9012000000000:9:222222222
9023000000000:9:333333333
9034000000000:9:444444444
9045000000000:9:555555555
9056000000000:9:666666666
9067000000000:9:777777777
9078000000000:9:888888888
9089000000000:9:1000000000
90935500000:113:314159
91071000000:226:314159
911106500000:339:314159
9121000000000:3:333333333
913+10:+5:2
914+100:+4:25
915+1000:+8:125
916+10000:+16:625
917999999999999:9:111111111111
918999999999999:99:10101010101
919999999999999:999:1001001001
920999999999999:9999:100010001
921999999999999999:99999:10000100001
922+1111088889:99999:11111
923-5:-3:1
924-5:3:-1
9254:3:1
9264:-3:-1
9271:3:0.3333333333333333333333333333333333333333
9281:-3:-0.3333333333333333333333333333333333333333
929-2:-3:0.6666666666666666666666666666666666666667
930-2:3:-0.6666666666666666666666666666666666666667
931#8:5:1.6^
932#-8:5:-1.6^
9338:5:1
934-8:5:-1
93514:-3:-4
936-14:3:-4
937-14:-3:4
93814:3:4
939# bug in Calc with '99999' vs $BASE-1
94010000000000000000000000000000000000000000000000000000000000000000000000000000000000:10000000375084540248994272022843165711074:999999962491547381984643365663244474111576
94112:24:0.5^
942&bmod
943# inf handling, see table in doc
9440:inf:0
9450:-inf:0
9465:inf:5
9475:-inf:5
948-5:inf:-5
949-5:-inf:-5
950inf:5:0
951-inf:5:0
952inf:-5:0
953-inf:-5:0
9545:5:0
955-5:-5:0
956inf:inf:NaN
957-inf:-inf:NaN
958-inf:inf:NaN
959inf:-inf:NaN
9608:0:8
961inf:0:inf
962# exceptions to reminder rule
963-inf:0:-inf
964-8:0:-8
9650:0:NaN
966abc:abc:NaN
967abc:1:abc:NaN
9681:abc:NaN
9690:0:NaN
9700:1:0
9711:0:1
9720:-1:0
973-1:0:-1
9741:1:0
975-1:-1:0
9761:-1:0
977-1:1:0
9781:2:1
9792:1:0
9801000000000:9:1
9812000000000:9:2
9823000000000:9:3
9834000000000:9:4
9845000000000:9:5
9856000000000:9:6
9867000000000:9:7
9878000000000:9:8
9889000000000:9:0
98935500000:113:33
99071000000:226:66
991106500000:339:99
9921000000000:3:1
99310:5:0
994100:4:0
9951000:8:0
99610000:16:0
997999999999999:9:0
998999999999999:99:0
999999999999999:999:0
1000999999999999:9999:0
1001999999999999999:99999:0
1002-9:+5:1
1003+9:-5:-1
1004-9:-5:-4
1005-5:3:1
1006-2:3:1
10074:3:1
10081:3:1
1009-5:-3:-2
1010-2:-3:-2
10114:-3:-2
10121:-3:-2
10134095:4095:0
1014100041000510123:3:0
1015152403346:12345:4321
10169:5:4
1017&bgcd
1018abc:abc:NaN
1019abc:+0:NaN
1020+0:abc:NaN
1021+0:+0:0
1022+0:+1:1
1023+1:+0:1
1024+1:+1:1
1025+2:+3:1
1026+3:+2:1
1027-3:+2:1
1028100:625:25
10294096:81:1
10301034:804:2
103127:90:56:1
103227:90:54:9
1033&blcm
1034abc:abc:NaN
1035abc:+0:NaN
1036+0:abc:NaN
1037+0:+0:NaN
1038+1:+0:0
1039+0:+1:0
1040+27:+90:270
1041+1034:+804:415668
1042&band
1043abc:abc:NaN
1044abc:0:NaN
10450:abc:NaN
10461:2:0
10473:2:2
1048+8:+2:0
1049+281474976710656:0:0
1050+281474976710656:1:0
1051+281474976710656:+281474976710656:281474976710656
1052-2:-3:-4
1053-1:-1:-1
1054-6:-6:-6
1055-7:-4:-8
1056-7:4:0
1057-4:7:4
1058# equal arguments are treated special, so also do some test with unequal ones
10590xFFFF:0xFFFF:0x0xFFFF
10600xFFFFFF:0xFFFFFF:0x0xFFFFFF
10610xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF
10620xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF
10630xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
10640xF0F0:0xF0F0:0x0xF0F0
10650x0F0F:0x0F0F:0x0x0F0F
10660xF0F0F0:0xF0F0F0:0x0xF0F0F0
10670x0F0F0F:0x0F0F0F:0x0x0F0F0F
10680xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0
10690x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F
10700xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0
10710x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F
10720xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0
10730x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F
10740x1F0F0F0F0F0F:0x3F0F0F0F0F0F:0x0x1F0F0F0F0F0F
1075&bior
1076abc:abc:NaN
1077abc:0:NaN
10780:abc:NaN
10791:2:3
1080+8:+2:10
1081+281474976710656:0:281474976710656
1082+281474976710656:1:281474976710657
1083+281474976710656:281474976710656:281474976710656
1084-2:-3:-1
1085-1:-1:-1
1086-6:-6:-6
1087-7:4:-3
1088-4:7:-1
1089# equal arguments are treated special, so also do some test with unequal ones
10900xFFFF:0xFFFF:0x0xFFFF
10910xFFFFFF:0xFFFFFF:0x0xFFFFFF
10920xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF
10930xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF
10940xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
10950:0xFFFF:0x0xFFFF
10960:0xFFFFFF:0x0xFFFFFF
10970:0xFFFFFFFF:0x0xFFFFFFFF
10980:0xFFFFFFFFFF:0x0xFFFFFFFFFF
10990:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
11000xFFFF:0:0x0xFFFF
11010xFFFFFF:0:0x0xFFFFFF
11020xFFFFFFFF:0:0x0xFFFFFFFF
11030xFFFFFFFFFF:0:0x0xFFFFFFFFFF
11040xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF
11050xF0F0:0xF0F0:0x0xF0F0
11060x0F0F:0x0F0F:0x0x0F0F
11070xF0F0:0x0F0F:0x0xFFFF
11080xF0F0F0:0xF0F0F0:0x0xF0F0F0
11090x0F0F0F:0x0F0F0F:0x0x0F0F0F
11100x0F0F0F:0xF0F0F0:0x0xFFFFFF
11110xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0
11120x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F
11130x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF
11140xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0
11150x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F
11160x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF
11170xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0
11180x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F
11190x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
11200x1F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
1121&bxor
1122abc:abc:NaN
1123abc:0:NaN
11240:abc:NaN
11251:2:3
1126+8:+2:10
1127+281474976710656:0:281474976710656
1128+281474976710656:1:281474976710657
1129+281474976710656:281474976710656:0
1130-2:-3:3
1131-1:-1:0
1132-6:-6:0
1133-7:4:-3
1134-4:7:-5
11354:-7:-3
1136-4:-7:5
1137# equal arguments are treated special, so also do some test with unequal ones
11380xFFFF:0xFFFF:0
11390xFFFFFF:0xFFFFFF:0
11400xFFFFFFFF:0xFFFFFFFF:0
11410xFFFFFFFFFF:0xFFFFFFFFFF:0
11420xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0
11430:0xFFFF:0x0xFFFF
11440:0xFFFFFF:0x0xFFFFFF
11450:0xFFFFFFFF:0x0xFFFFFFFF
11460:0xFFFFFFFFFF:0x0xFFFFFFFFFF
11470:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
11480xFFFF:0:0x0xFFFF
11490xFFFFFF:0:0x0xFFFFFF
11500xFFFFFFFF:0:0x0xFFFFFFFF
11510xFFFFFFFFFF:0:0x0xFFFFFFFFFF
11520xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF
11530xF0F0:0xF0F0:0
11540x0F0F:0x0F0F:0
11550xF0F0:0x0F0F:0x0xFFFF
11560xF0F0F0:0xF0F0F0:0
11570x0F0F0F:0x0F0F0F:0
11580x0F0F0F:0xF0F0F0:0x0xFFFFFF
11590xF0F0F0F0:0xF0F0F0F0:0
11600x0F0F0F0F:0x0F0F0F0F:0
11610x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF
11620xF0F0F0F0F0:0xF0F0F0F0F0:0
11630x0F0F0F0F0F:0x0F0F0F0F0F:0
11640x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF
11650xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0
11660x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0
11670x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
1168&bnot
1169abc:NaN
1170+0:-1
1171+8:-9
1172+281474976710656:-281474976710657
1173-1:0
1174-2:1
1175-12:11
1176&digit
11770:0:0
117812:0:2
117912:1:1
1180123:0:3
1181123:1:2
1182123:2:1
1183123:-1:1
1184123:-2:2
1185123:-3:3
1186123456:0:6
1187123456:1:5
1188123456:2:4
1189123456:3:3
1190123456:4:2
1191123456:5:1
1192123456:-1:1
1193123456:-2:2
1194123456:-3:3
1195100000:-3:0
1196100000:0:0
1197100000:1:0
1198&mantissa
1199abc:NaN
12001e4:1
12012e0:2
1202123:123
1203-1:-1
1204-2:-2
1205+inf:inf
1206-inf:-inf
1207&exponent
1208abc:NaN
12091e4:4
12102e0:0
1211123:0
1212-1:0
1213-2:0
12140:1
1215+inf:inf
1216-inf:inf
1217&parts
1218abc:NaN,NaN
12191e4:1,4
12202e0:2,0
1221123:123,0
1222-1:-1,0
1223-2:-2,0
12240:0,1
1225+inf:inf,inf
1226-inf:-inf,inf
1227&bfac
1228-1:NaN
1229NaNfac:NaN
1230+inf:NaN
1231-inf:NaN
12320:1
12331:1
12342:2
12353:6
12364:24
12375:120
12386:720
123910:3628800
124011:39916800
124112:479001600
1242&bpow
1243abc:12:NaN
124412:abc:NaN
12450:0:1
12460:1:0
12470:2:0
12480:-1:NaN
12490:-2:NaN
12501:0:1
12511:1:1
12521:2:1
12531:3:1
12541:-1:1
12551:-2:1
12561:-3:1
12572:0:1
12582:1:2
12592:2:4
12602:3:8
12613:3:27
12622:-1:NaN
1263-2:-1:NaN
12642:-2:NaN
1265-2:-2:NaN
1266+inf:1234500012:inf
1267-inf:1234500012:-inf
1268+inf:-12345000123:inf
1269-inf:-12345000123:-inf
1270# 1 ** -x => 1 / (1 ** x)
1271-1:0:1
1272-2:0:1
1273-1:1:-1
1274-1:2:1
1275-1:3:-1
1276-1:4:1
1277-1:5:-1
1278-1:-1:-1
1279-1:-2:1
1280-1:-3:-1
1281-1:-4:1
128210:2:100
128310:3:1000
128410:4:10000
128510:5:100000
128610:6:1000000
128710:7:10000000
128810:8:100000000
128910:9:1000000000
129010:20:100000000000000000000
1291123456:2:15241383936
1292&length
1293100:3
129410:2
12951:1
12960:1
129712345:5
129810000000000000000:17
1299-123:3
1300215960156869840440586892398248:30
1301&bsqrt
1302145:12.04159457879229548012824103037860805243^
1303144:12^
1304143:11.95826074310139802112984075619561661399^
130516:4
1306170:13.03840481040529742916594311485836883306^
1307169:13
1308168:12.96148139681572046193193487217599331541^
13094:2
13103:1.732050807568877293527446341505872366943^
13112:1.41421356237309504880168872420969807857^
13129:3
131312:3.464101615137754587054892683011744733886^
1314256:16
1315100000000:10000
13164000000000000:2000000
1317152399026:12345.00004050222755607815159966235881398^
1318152399025:12345
1319152399024:12344.99995949777231103967404745303741942^
13201:1
13210:0
1322-2:NaN
1323-123:NaN
1324Nan:NaN
1325+inf:NaN
1326&bround
1327$round_mode('trunc')
13280:12:0
1329NaNbround:12:NaN
1330+inf:12:inf
1331-inf:12:-inf
13321234:0:1234
13331234:2:1200
1334123456:4:123400
1335123456:5:123450
1336123456:6:123456
1337+10123456789:5:10123000000
1338-10123456789:5:-10123000000
1339+10123456789:9:10123456700
1340-10123456789:9:-10123456700
1341+101234500:6:101234000
1342-101234500:6:-101234000
1343#+101234500:-4:101234000
1344#-101234500:-4:-101234000
1345$round_mode('zero')
1346+20123456789:5:20123000000
1347-20123456789:5:-20123000000
1348+20123456789:9:20123456800
1349-20123456789:9:-20123456800
1350+201234500:6:201234000
1351-201234500:6:-201234000
1352#+201234500:-4:201234000
1353#-201234500:-4:-201234000
1354+12345000:4:12340000
1355-12345000:4:-12340000
1356$round_mode('+inf')
1357+30123456789:5:30123000000
1358-30123456789:5:-30123000000
1359+30123456789:9:30123456800
1360-30123456789:9:-30123456800
1361+301234500:6:301235000
1362-301234500:6:-301234000
1363#+301234500:-4:301235000
1364#-301234500:-4:-301234000
1365+12345000:4:12350000
1366-12345000:4:-12340000
1367$round_mode('-inf')
1368+40123456789:5:40123000000
1369-40123456789:5:-40123000000
1370+40123456789:9:40123456800
1371-40123456789:9:-40123456800
1372+401234500:6:401234000
1373+401234500:6:401234000
1374#-401234500:-4:-401235000
1375#-401234500:-4:-401235000
1376+12345000:4:12340000
1377-12345000:4:-12350000
1378$round_mode('odd')
1379+50123456789:5:50123000000
1380-50123456789:5:-50123000000
1381+50123456789:9:50123456800
1382-50123456789:9:-50123456800
1383+501234500:6:501235000
1384-501234500:6:-501235000
1385#+501234500:-4:501235000
1386#-501234500:-4:-501235000
1387+12345000:4:12350000
1388-12345000:4:-12350000
1389$round_mode('even')
1390+60123456789:5:60123000000
1391-60123456789:5:-60123000000
1392+60123456789:9:60123456800
1393-60123456789:9:-60123456800
1394+601234500:6:601234000
1395-601234500:6:-601234000
1396#+601234500:-4:601234000
1397#-601234500:-4:-601234000
1398#-601234500:-9:0
1399#-501234500:-9:0
1400#-601234500:-8:0
1401#-501234500:-8:0
1402+1234567:7:1234567
1403+1234567:6:1234570
1404+12345000:4:12340000
1405-12345000:4:-12340000
1406&is_zero
14070:1
1408NaNzero:0
1409+inf:0
1410-inf:0
1411123:0
1412-1:0
14131:0
1414&is_one
14150:0
1416NaNone:0
1417+inf:0
1418-inf:0
14191:1
14202:0
1421-1:0
1422-2:0
1423# floor and ceil tests are pretty pointless in integer space...but play safe
1424&bfloor
14250:0
1426NaNfloor:NaN
1427+inf:inf
1428-inf:-inf
1429-1:-1
1430-2:-2
14312:2
14323:3
1433abc:NaN
1434&bceil
1435NaNceil:NaN
1436+inf:inf
1437-inf:-inf
14380:0
1439-1:-1
1440-2:-2
14412:2
14423:3
1443abc:NaN
1444&as_hex
1445128:0x80
1446-128:-0x80
14470:0x0
1448-0:0x0
14491:0x1
14500x123456789123456789:0x123456789123456789
1451+inf:inf
1452-inf:-inf
1453NaNas_hex:NaN
1454&as_bin
1455128:0b10000000
1456-128:-0b10000000
14570:0b0
1458-0:0b0
14591:0b1
14600b1010111101010101010110110110110110101:0b1010111101010101010110110110110110101
1461+inf:inf
1462-inf:-inf
1463NaNas_bin:NaN