[PATCH9 BigInt v1.60 fix for "\n"
[p5sagit/p5-mst-13.2.git] / lib / Math / BigInt / t / bigintpm.inc
CommitLineData
6854fd01 1#include this file into another for subclass testing
2
3my $version = ${"$class\::VERSION"};
4
5##############################################################################
6# for testing inheritance of _swap
7
8package Math::Foo;
9
61f5c3f5 10use Math::BigInt lib => $main::CL;
6854fd01 11use vars qw/@ISA/;
12@ISA = (qw/Math::BigInt/);
13
14use overload
15# customized overload for sub, since original does not use swap there
16'-' => sub { my @a = ref($_[0])->_swap(@_);
17 $a[0]->bsub($a[1])};
18
19sub _swap
20 {
21 # a fake _swap, which reverses the params
22 my $self = shift; # for override in subclass
23 if ($_[2])
24 {
25 my $c = ref ($_[0] ) || 'Math::Foo';
26 return ( $_[0]->copy(), $_[1] );
27 }
28 else
29 {
30 return ( Math::Foo->new($_[1]), $_[0] );
31 }
32 }
33
34##############################################################################
35package main;
36
b3abae2a 37my $CALC = $class->config()->{lib}; ok ($CALC,$CL);
6854fd01 38
b3abae2a 39my ($f,$z,$a,$exp,@a,$m,$e,$round_mode,$expected_class);
6854fd01 40
41while (<DATA>)
42 {
d614cd8b 43 chomp;
6854fd01 44 next if /^#/; # skip comments
45 if (s/^&//)
46 {
61f5c3f5 47 $f = $_; next;
6854fd01 48 }
49 elsif (/^\$/)
50 {
61f5c3f5 51 $round_mode = $_; $round_mode =~ s/^\$/$class\->/; next;
6854fd01 52 }
61f5c3f5 53
54 @args = split(/:/,$_,99); $ans = pop(@args);
b3abae2a 55 $expected_class = $class;
56 if ($ans =~ /(.*?)=(.*)/)
57 {
58 $expected_class = $2; $ans = $1;
59 }
61f5c3f5 60 $try = "\$x = $class->new(\"$args[0]\");";
61 if ($f eq "bnorm")
6854fd01 62 {
61f5c3f5 63 $try = "\$x = $class->bnorm(\"$args[0]\");";
64 # some is_xxx tests
b3abae2a 65 } elsif ($f =~ /^is_(zero|one|odd|even|negative|positive|nan|int)$/) {
61f5c3f5 66 $try .= "\$x->$f();";
67 } elsif ($f eq "as_hex") {
68 $try .= '$x->as_hex();';
69 } elsif ($f eq "as_bin") {
70 $try .= '$x->as_bin();';
71 } elsif ($f eq "is_inf") {
72 $try .= "\$x->is_inf('$args[1]');";
73 } elsif ($f eq "binf") {
74 $try .= "\$x->binf('$args[1]');";
75 } elsif ($f eq "bone") {
76 $try .= "\$x->bone('$args[1]');";
77 # some unary ops
b3abae2a 78 } elsif ($f =~ /^b(nan|floor|ceil|sstr|neg|abs|inc|dec|not|sqrt|fac)$/) {
61f5c3f5 79 $try .= "\$x->$f();";
80 } elsif ($f eq "length") {
81 $try .= '$x->length();';
82 } elsif ($f eq "exponent"){
83 # ->bstr() to see if an object is returned
84 $try .= '$x = $x->exponent()->bstr();';
85 } elsif ($f eq "mantissa"){
86 # ->bstr() to see if an object is returned
87 $try .= '$x = $x->mantissa()->bstr();';
88 } elsif ($f eq "parts"){
89 $try .= '($m,$e) = $x->parts();';
90 # ->bstr() to see if an object is returned
91 $try .= '$m = $m->bstr(); $m = "NaN" if !defined $m;';
92 $try .= '$e = $e->bstr(); $e = "NaN" if !defined $e;';
93 $try .= '"$m,$e";';
94 } else {
95 $try .= "\$y = $class->new('$args[1]');";
96 if ($f eq "bcmp")
97 {
98 $try .= '$x <=> $y;';
99 } elsif ($f eq "bround") {
6854fd01 100 $try .= "$round_mode; \$x->bround(\$y);";
61f5c3f5 101 } elsif ($f eq "bacmp"){
102 $try .= '$x->bacmp($y);';
103 } elsif ($f eq "badd"){
104 $try .= '$x + $y;';
105 } elsif ($f eq "bsub"){
106 $try .= '$x - $y;';
107 } elsif ($f eq "bmul"){
108 $try .= '$x * $y;';
109 } elsif ($f eq "bdiv"){
110 $try .= '$x / $y;';
111 } elsif ($f eq "bdiv-list"){
112 $try .= 'join (",",$x->bdiv($y));';
027dc388 113 # overload via x=
61f5c3f5 114 } elsif ($f =~ /^.=$/){
115 $try .= "\$x $f \$y;";
027dc388 116 # overload via x
61f5c3f5 117 } elsif ($f =~ /^.$/){
118 $try .= "\$x $f \$y;";
119 } elsif ($f eq "bmod"){
120 $try .= '$x % $y;';
121 } elsif ($f eq "bgcd")
6854fd01 122 {
123 if (defined $args[2])
124 {
61f5c3f5 125 $try .= " \$z = $class->new('$args[2]'); ";
6854fd01 126 }
127 $try .= "$class\::bgcd(\$x, \$y";
128 $try .= ", \$z" if (defined $args[2]);
129 $try .= " );";
130 }
131 elsif ($f eq "blcm")
132 {
133 if (defined $args[2])
134 {
61f5c3f5 135 $try .= " \$z = $class->new('$args[2]'); ";
6854fd01 136 }
137 $try .= "$class\::blcm(\$x, \$y";
138 $try .= ", \$z" if (defined $args[2]);
139 $try .= " );";
140 }elsif ($f eq "blsft"){
141 if (defined $args[2])
142 {
143 $try .= "\$x->blsft(\$y,$args[2]);";
144 }
145 else
146 {
147 $try .= "\$x << \$y;";
148 }
149 }elsif ($f eq "brsft"){
150 if (defined $args[2])
151 {
152 $try .= "\$x->brsft(\$y,$args[2]);";
153 }
154 else
155 {
156 $try .= "\$x >> \$y;";
157 }
158 }elsif ($f eq "band"){
159 $try .= "\$x & \$y;";
160 }elsif ($f eq "bior"){
161 $try .= "\$x | \$y;";
162 }elsif ($f eq "bxor"){
163 $try .= "\$x ^ \$y;";
164 }elsif ($f eq "bpow"){
165 $try .= "\$x ** \$y;";
d614cd8b 166 } elsif( $f eq "bmodinv") {
167 $try .= "\$x->bmodinv(\$y);";
6854fd01 168 }elsif ($f eq "digit"){
56b9c951 169 $try .= "\$x->digit(\$y);";
d614cd8b 170 } else {
171 $try .= "\$z = $class->new(\"$args[2]\");";
172
173 # Functions with three arguments
174 if( $f eq "bmodpow") {
175 $try .= "\$x->bmodpow(\$y,\$z);";
176 } else { warn "Unknown op '$f'"; }
177 }
61f5c3f5 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();
6854fd01 185 }
61f5c3f5 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);
b3abae2a 194 ok (ref($ans),$expected_class) if $expected_class ne $class;
6854fd01 195 }
61f5c3f5 196 # check internal state of number objects
197 is_valid($ans1,$f) if ref $ans1;
6854fd01 198 } # endwhile data tests
199close DATA;
200
201# test some more
202@a = ();
203for (my $i = 1; $i < 10; $i++)
204 {
205 push @a, $i;
206 }
207ok "@a", "1 2 3 4 5 6 7 8 9";
208
209# test whether self-multiplication works correctly (result is 2**64)
210$try = "\$x = $class->new('4294967296');";
211$try .= '$a = $x->bmul($x);';
212$ans1 = eval $try;
213print "# Tried: '$try'\n" if !ok ($ans1, $class->new(2) ** 64);
214# test self-pow
215$try = "\$x = $class->new(10);";
216$try .= '$a = $x->bpow($x);';
217$ans1 = eval $try;
218print "# Tried: '$try'\n" if !ok ($ans1, $class->new(10) ** 10);
219
07d34614 220###############################################################################
6854fd01 221# test whether op destroys args or not (should better not)
222
223$x = $class->new(3);
224$y = $class->new(4);
225$z = $x & $y;
226ok ($x,3);
227ok ($y,4);
228ok ($z,0);
229$z = $x | $y;
230ok ($x,3);
231ok ($y,4);
232ok ($z,7);
233$x = $class->new(1);
234$y = $class->new(2);
235$z = $x | $y;
236ok ($x,1);
237ok ($y,2);
238ok ($z,3);
239
240$x = $class->new(5);
241$y = $class->new(4);
242$z = $x ^ $y;
243ok ($x,5);
244ok ($y,4);
245ok ($z,1);
246
247$x = $class->new(-5); $y = -$x;
248ok ($x, -5);
249
250$x = $class->new(-5); $y = abs($x);
251ok ($x, -5);
252
07d34614 253$x = $class->new(8);
254$y = $class->new(-1);
255$z = $class->new(5033);
256my $u = $x->copy()->bmodpow($y,$z);
257ok ($u,4404);
258ok ($y,-1);
259ok ($z,5033);
260
261$x = $class->new(-5); $y = -$x; ok ($x,-5); ok ($y,5);
262$x = $class->new(-5); $y = $x->copy()->bneg(); ok ($x,-5); ok ($y,5);
263
264$x = $class->new(-5); $y = $class->new(3); $x->bmul($y); ok ($x,-15); ok ($y,3);
265$x = $class->new(-5); $y = $class->new(3); $x->badd($y); ok ($x,-2); ok ($y,3);
266$x = $class->new(-5); $y = $class->new(3); $x->bsub($y); ok ($x,-8); ok ($y,3);
267$x = $class->new(-15); $y = $class->new(3); $x->bdiv($y); ok ($x,-5); ok ($y,3);
268$x = $class->new(-5); $y = $class->new(3); $x->bmod($y); ok ($x,1); ok ($y,3);
269
270$x = $class->new(5); $y = $class->new(3); $x->bmul($y); ok ($x,15); ok ($y,3);
271$x = $class->new(5); $y = $class->new(3); $x->badd($y); ok ($x,8); ok ($y,3);
272$x = $class->new(5); $y = $class->new(3); $x->bsub($y); ok ($x,2); ok ($y,3);
273$x = $class->new(15); $y = $class->new(3); $x->bdiv($y); ok ($x,5); ok ($y,3);
274$x = $class->new(5); $y = $class->new(3); $x->bmod($y); ok ($x,2); ok ($y,3);
275
276$x = $class->new(5); $y = $class->new(-3); $x->bmul($y); ok ($x,-15); ok($y,-3);
277$x = $class->new(5); $y = $class->new(-3); $x->badd($y); ok ($x,2); ok($y,-3);
278$x = $class->new(5); $y = $class->new(-3); $x->bsub($y); ok ($x,8); ok($y,-3);
279$x = $class->new(15); $y = $class->new(-3); $x->bdiv($y); ok ($x,-5); ok($y,-3);
280$x = $class->new(5); $y = $class->new(-3); $x->bmod($y); ok ($x,-1); ok($y,-3);
281
282###############################################################################
6854fd01 283# check whether overloading cmp works
284$try = "\$x = $class->new(0);";
285$try .= "\$y = 10;";
286$try .= "'false' if \$x ne \$y;";
287$ans = eval $try;
288print "# For '$try'\n" if (!ok "$ans" , "false" );
289
290# we cant test for working cmpt with other objects here, we would need a dummy
291# object with stringify overload for this. see Math::String tests as example
292
293###############################################################################
6854fd01 294# check reversed order of arguments
027dc388 295
6854fd01 296$try = "\$x = $class->new(10); \$x = 2 ** \$x;";
297$try .= "'ok' if \$x == 1024;"; $ans = eval $try;
298print "# For '$try'\n" if (!ok "$ans" , "ok" );
299
300$try = "\$x = $class->new(10); \$x = 2 * \$x;";
301$try .= "'ok' if \$x == 20;"; $ans = eval $try;
302print "# For '$try'\n" if (!ok "$ans" , "ok" );
303
304$try = "\$x = $class->new(10); \$x = 2 + \$x;";
305$try .= "'ok' if \$x == 12;"; $ans = eval $try;
306print "# For '$try'\n" if (!ok "$ans" , "ok" );
307
308$try = "\$x = $class\->new(10); \$x = 2 - \$x;";
309$try .= "'ok' if \$x == -8;"; $ans = eval $try;
310print "# For '$try'\n" if (!ok "$ans" , "ok" );
311
312$try = "\$x = $class\->new(10); \$x = 20 / \$x;";
313$try .= "'ok' if \$x == 2;"; $ans = eval $try;
314print "# For '$try'\n" if (!ok "$ans" , "ok" );
315
027dc388 316$try = "\$x = $class\->new(3); \$x = 20 % \$x;";
317$try .= "'ok' if \$x == 2;"; $ans = eval $try;
318print "# For '$try'\n" if (!ok "$ans" , "ok" );
319
320$try = "\$x = $class\->new(7); \$x = 20 & \$x;";
321$try .= "'ok' if \$x == 4;"; $ans = eval $try;
322print "# For '$try'\n" if (!ok "$ans" , "ok" );
323
324$try = "\$x = $class\->new(7); \$x = 0x20 | \$x;";
325$try .= "'ok' if \$x == 0x27;"; $ans = eval $try;
326print "# For '$try'\n" if (!ok "$ans" , "ok" );
327
328$try = "\$x = $class\->new(7); \$x = 0x20 ^ \$x;";
329$try .= "'ok' if \$x == 0x27;"; $ans = eval $try;
330print "# For '$try'\n" if (!ok "$ans" , "ok" );
331
6854fd01 332###############################################################################
333# check badd(4,5) form
334
335$try = "\$x = $class\->badd(4,5);";
336$try .= "'ok' if \$x == 9;";
337$ans = eval $try;
338print "# For '$try'\n" if (!ok "$ans" , "ok" );
339
340###############################################################################
341# check undefs: NOT DONE YET
342
343###############################################################################
344# bool
345
f9a08e12 346$x = $class->new(1); if ($x) { ok (1,1); } else { ok($x,'to be true') }
347$x = $class->new(0); if (!$x) { ok (1,1); } else { ok($x,'to be false') }
6854fd01 348
349###############################################################################
350# objectify()
351
352@args = Math::BigInt::objectify(2,4,5);
353ok (scalar @args,3); # $class, 4, 5
56b9c951 354ok ($args[0] =~ /^Math::BigInt/);
6854fd01 355ok ($args[1],4);
356ok ($args[2],5);
357
358@args = Math::BigInt::objectify(0,4,5);
359ok (scalar @args,3); # $class, 4, 5
56b9c951 360ok ($args[0] =~ /^Math::BigInt/);
6854fd01 361ok ($args[1],4);
362ok ($args[2],5);
363
364@args = Math::BigInt::objectify(2,4,5);
365ok (scalar @args,3); # $class, 4, 5
56b9c951 366ok ($args[0] =~ /^Math::BigInt/);
6854fd01 367ok ($args[1],4);
368ok ($args[2],5);
369
370@args = Math::BigInt::objectify(2,4,5,6,7);
371ok (scalar @args,5); # $class, 4, 5, 6, 7
56b9c951 372ok ($args[0] =~ /^Math::BigInt/);
6854fd01 373ok ($args[1],4); ok (ref($args[1]),$args[0]);
374ok ($args[2],5); ok (ref($args[2]),$args[0]);
375ok ($args[3],6); ok (ref($args[3]),'');
376ok ($args[4],7); ok (ref($args[4]),'');
377
378@args = Math::BigInt::objectify(2,$class,4,5,6,7);
379ok (scalar @args,5); # $class, 4, 5, 6, 7
380ok ($args[0],$class);
381ok ($args[1],4); ok (ref($args[1]),$args[0]);
382ok ($args[2],5); ok (ref($args[2]),$args[0]);
383ok ($args[3],6); ok (ref($args[3]),'');
384ok ($args[4],7); ok (ref($args[4]),'');
385
386###############################################################################
f9a08e12 387# test whether an opp calls objectify properly or not (or at least does what
388# it should do given non-objects, w/ or w/o objectify())
389
390ok ($class->new(123)->badd(123),246);
391ok ($class->badd(123,321),444);
392ok ($class->badd(123,$class->new(321)),444);
393
394ok ($class->new(123)->bsub(122),1);
395ok ($class->bsub(321,123),198);
396ok ($class->bsub(321,$class->new(123)),198);
397
398ok ($class->new(123)->bmul(123),15129);
399ok ($class->bmul(123,123),15129);
400ok ($class->bmul(123,$class->new(123)),15129);
401
402ok ($class->new(15129)->bdiv(123),123);
403ok ($class->bdiv(15129,123),123);
404ok ($class->bdiv(15129,$class->new(123)),123);
405
406ok ($class->new(15131)->bmod(123),2);
407ok ($class->bmod(15131,123),2);
408ok ($class->bmod(15131,$class->new(123)),2);
409
410ok ($class->new(2)->bpow(16),65536);
411ok ($class->bpow(2,16),65536);
412ok ($class->bpow(2,$class->new(16)),65536);
413
414ok ($class->new(2**15)->brsft(1),2**14);
415ok ($class->brsft(2**15,1),2**14);
416ok ($class->brsft(2**15,$class->new(1)),2**14);
417
418ok ($class->new(2**13)->blsft(1),2**14);
419ok ($class->blsft(2**13,1),2**14);
420ok ($class->blsft(2**13,$class->new(1)),2**14);
421
422###############################################################################
6854fd01 423# test for floating-point input (other tests in bnorm() below)
424
425$z = 1050000000000000; # may be int on systems with 64bit?
426$x = $class->new($z); ok ($x->bsstr(),'105e+13'); # not 1.05e+15
427$z = 1e+129; # definitely a float (may fail on UTS)
428# don't compare to $z, since some Perl versions stringify $z into something
429# like '1.e+129' or something equally ugly
430$x = $class->new($z); ok ($x->bsstr(),'1e+129');
431
432###############################################################################
433# prime number tests, also test for **= and length()
434# found on: http://www.utm.edu/research/primes/notes/by_year.html
435
436# ((2^148)-1)/17
437$x = $class->new(2); $x **= 148; $x++; $x = $x / 17;
438ok ($x,"20988936657440586486151264256610222593863921");
439ok ($x->length(),length "20988936657440586486151264256610222593863921");
440
441# MM7 = 2^127-1
442$x = $class->new(2); $x **= 127; $x--;
443ok ($x,"170141183460469231731687303715884105727");
444
445$x = $class->new('215960156869840440586892398248');
446($x,$y) = $x->length();
447ok ($x,30); ok ($y,0);
448
449$x = $class->new('1_000_000_000_000');
450($x,$y) = $x->length();
451ok ($x,13); ok ($y,0);
452
453# I am afraid the following is not yet possible due to slowness
454# Also, testing for 2 meg output is a bit hard ;)
455#$x = $class->new(2); $x **= 6972593; $x--;
456
457# 593573509*2^332162+1 has exactly 1,000,000 digits
458# takes about 24 mins on 300 Mhz, so cannot be done yet ;)
459#$x = $class->new(2); $x **= 332162; $x *= "593573509"; $x++;
460#ok ($x->length(),1_000_000);
461
462###############################################################################
463# inheritance and overriding of _swap
464
465$x = Math::Foo->new(5);
466$x = $x - 8; # 8 - 5 instead of 5-8
467ok ($x,3);
468ok (ref($x),'Math::Foo');
469
470$x = Math::Foo->new(5);
471$x = 8 - $x; # 5 - 8 instead of 8 - 5
472ok ($x,-3);
473ok (ref($x),'Math::Foo');
474
475###############################################################################
476# Test whether +inf eq inf
477# This tried to test whether BigInt inf equals Perl inf. Unfortunately, Perl
478# hasn't (before 5.7.3 at least) a consistent way to say inf, and some things
479# like 1e100000 crash on some platforms. So simple test for the string 'inf'
480$x = $class->new('+inf'); ok ($x,'inf');
481
482###############################################################################
483###############################################################################
394e6ffb 484# the followin tests only make sense with Math::BigInt::Calc or BareCalc
6854fd01 485
394e6ffb 486exit if $CALC !~ /^Math::BigInt::(Calc|BareCalc)$/; # for Pari et al.
6854fd01 487
488###############################################################################
489# check proper length of internal arrays
490
394e6ffb 491my $bl = $CL->_base_len();
6854fd01 492my $BASE = '9' x $bl;
493my $MAX = $BASE;
494$BASE++;
495
496$x = $class->new($MAX); is_valid($x); # f.i. 9999
497$x += 1; ok ($x,$BASE); is_valid($x); # 10000
498$x -= 1; ok ($x,$MAX); is_valid($x); # 9999 again
499
500###############################################################################
501# check numify
502
503$x = $class->new($BASE-1); ok ($x->numify(),$BASE-1);
504$x = $class->new(-($BASE-1)); ok ($x->numify(),-($BASE-1));
61f5c3f5 505
506# +0 is to protect from 1e15 vs 100000000 (stupid to_string aaaarglburblll...)
507$x = $class->new($BASE); ok ($x->numify()+0,$BASE+0);
6854fd01 508$x = $class->new(-$BASE); ok ($x->numify(),-$BASE);
509$x = $class->new( -($BASE*$BASE*1+$BASE*1+1) );
510ok($x->numify(),-($BASE*$BASE*1+$BASE*1+1));
511
512###############################################################################
513# test bug in _digits with length($c[-1]) where $c[-1] was "00001" instead of 1
514
394e6ffb 515$x = $class->new($BASE-2); $x++; $x++; $x++; $x++;
516if ($x > $BASE) { ok (1,1) } else { ok ("$x < $BASE","$x > $BASE"); }
517
518$x = $class->new($BASE+3); $x++;
519if ($x > $BASE) { ok (1,1) } else { ok ("$x > $BASE","$x < $BASE"); }
6854fd01 520
394e6ffb 521# test for +0 instead of int():
522$x = $class->new($MAX); ok ($x->length(), length($MAX));
6854fd01 523
524###############################################################################
56b9c951 525# test bug that $class->digit($string) did not work
526
527ok ($class->digit(123,2),1);
528
529###############################################################################
6854fd01 530# bug in sub where number with at least 6 trailing zeros after any op failed
531
394e6ffb 532$x = $class->new(123456); $z = $class->new(10000); $z *= 10; $x -= $z;
6854fd01 533ok ($z, 100000);
534ok ($x, 23456);
535
536###############################################################################
537# bug in shortcut in mul()
538
61f5c3f5 539# construct a number with a zero-hole of BASE_LEN_SMALL
540{
541 my @bl = $CL->_base_len(); my $bl = $bl[4];
542
543 $x = '1' x $bl . '0' x $bl . '1' x $bl . '0' x $bl;
544 $y = '1' x (2*$bl);
545 $x = $class->new($x)->bmul($y);
546 # result is 123..$bl . $bl x (3*bl-1) . $bl...321 . '0' x $bl
547 $y = ''; my $d = '';
548 for (my $i = 1; $i <= $bl; $i++)
549 {
550 $y .= $i; $d = $i.$d;
551 }
552 $y .= $bl x (3*$bl-1) . $d . '0' x $bl;
553 ok ($x,$y);
554
6854fd01 555
f9a08e12 556 #############################################################################
557 # see if mul shortcut for small numbers works
394e6ffb 558
f9a08e12 559 $x = '9' x $bl;
560 $x = $class->new($x);
561 # 999 * 999 => 998 . 001, 9999*9999 => 9998 . 0001
562 ok ($x*$x, '9' x ($bl-1) . '8' . '0' x ($bl-1) . '1');
563}
61f5c3f5 564
394e6ffb 565###############################################################################
6854fd01 566# bug with rest "-0" in div, causing further div()s to fail
567
394e6ffb 568$x = $class->new('-322056000'); ($x,$y) = $x->bdiv('-12882240');
6854fd01 569
61f5c3f5 570ok ($y,'0'); is_valid($y); # $y not '-0'
394e6ffb 571
79c55733 572###############################################################################
f9a08e12 573# bug in $x->bmod($y)
07d34614 574
f9a08e12 575# if $x < 0 and $y > 0
07d34614 576$x = $class->new('-629'); ok ($x->bmod(5033),4404);
577
578###############################################################################
56b9c951 579# bone/binf etc as plain calls (Lite failed them)
580
581ok ($class->bzero(),0);
582ok ($class->bone(),1);
583ok ($class->bone('+'),1);
584ok ($class->bone('-'),-1);
585ok ($class->bnan(),'NaN');
586ok ($class->binf(),'inf');
587ok ($class->binf('+'),'inf');
588ok ($class->binf('-'),'-inf');
589ok ($class->binf('-inf'),'-inf');
590
591###############################################################################
61f5c3f5 592# all tests done
6854fd01 593
5941;
595
596###############################################################################
61f5c3f5 597###############################################################################
6854fd01 598# Perl 5.005 does not like ok ($x,undef)
599
600sub ok_undef
601 {
602 my $x = shift;
603
604 ok (1,1) and return if !defined $x;
605 ok ($x,'undef');
606 }
607
608###############################################################################
609# sub to check validity of a BigInt internally, to ensure that no op leaves a
610# number object in an invalid state (f.i. "-0")
611
612sub is_valid
613 {
614 my ($x,$f) = @_;
615
616 my $e = 0; # error?
6854fd01 617
56b9c951 618 # allow the check to pass for all Lite, and all MBI and subclasses
619 # ok as reference?
620 $e = 'Not a reference to Math::BigInt' if ref($x) !~ /^Math::BigInt/;
6854fd01 621
56b9c951 622 if (ref($x) ne 'Math::BigInt::Lite')
623 {
624 # has ok sign?
625 $e = "Illegal sign $x->{sign} (expected: '+', '-', '-inf', '+inf' or 'NaN'"
626 if $e eq '0' && $x->{sign} !~ /^(\+|-|\+inf|-inf|NaN)$/;
627
628 $e = "-0 is invalid!" if $e ne '0' && $x->{sign} eq '-' && $x == 0;
629 $e = $CALC->_check($x->{value}) if $e eq '0';
630 }
6854fd01 631
632 # test done, see if error did crop up
633 ok (1,1), return if ($e eq '0');
634
027dc388 635 ok (1,$e." after op '$f'");
6854fd01 636 }
637
638__DATA__
027dc388 639&.=
6401234:-345:1234-345
641&+=
6421:2:3
643-1:-2:-3
644&-=
6451:2:-1
646-1:-2:1
647&*=
6482:3:6
649-1:5:-5
650&%=
651100:3:1
6528:9:8
07d34614 653-629:5033:4404
027dc388 654&/=
655100:3:33
656-8:2:-4
657&|=
6582:1:3
659&&=
6605:7:5
661&^=
6625:7:2
6854fd01 663&is_negative
6640:0
665-1:1
6661:0
667+inf:0
668-inf:1
669NaNneg:0
670&is_positive
6710:1
672-1:0
6731:1
674+inf:1
675-inf:0
676NaNneg:0
b3abae2a 677&is_int
678-inf:0
679+inf:0
680NaNis_int:0
6811:1
6820:1
683123e12:1
6854fd01 684&is_odd
685abc:0
6860:0
6871:1
6883:1
689-1:1
690-3:1
69110000001:1
69210000002:0
6932:0
b3abae2a 694120:0
695121:1
6854fd01 696&is_even
697abc:0
6980:1
6991:0
7003:0
701-1:0
702-3:0
70310000001:0
70410000002:1
7052:1
b3abae2a 706120:1
707121:0
6854fd01 708&bacmp
709+0:-0:0
710+0:+1:-1
711-1:+1:0
712+1:-1:0
713-1:+2:-1
714+2:-1:1
715-123456789:+987654321:-1
716+123456789:-987654321:-1
717+987654321:+123456789:1
718-987654321:+123456789:1
719-123:+4567889:-1
720# NaNs
721acmpNaN:123:
722123:acmpNaN:
723acmpNaN:acmpNaN:
724# infinity
725+inf:+inf:0
726-inf:-inf:0
727+inf:-inf:0
728-inf:+inf:0
729+inf:123:1
730-inf:123:1
731+inf:-123:1
732-inf:-123:1
733# return undef
734+inf:NaN:
735NaN:inf:
736-inf:NaN:
737NaN:-inf:
738&bnorm
739c8b3a 739-0\n:0
740-123\n:-123
741-1234\n:-1234
742-12345\n:-12345
743-123456\n:-123456
744-1234567\n:-1234567
745-12345678\n:-12345678
746-123456789\n:-123456789
747-1234567890\n:-1234567890
748-12345678901\n:-12345678901
7490\n:0
750123\n:123
7511234\n:1234
75212345\n:12345
753123456\n:123456
7541234567\n:1234567
75512345678\n:12345678
756123456789\n:123456789
7571234567890\n:1234567890
75812345678901\n:12345678901
759\n0:0
760\n123:123
761\n1234:1234
762\n12345:12345
763\n123456:123456
764\n1234567:1234567
765\n12345678:12345678
766\n123456789:123456789
767\n1234567890:1234567890
768\n12345678901:12345678901
769\n0\n:0
770\n123\n:123
771\n1234\n:1234
772\n12345\n:12345
773\n123456\n:123456
774\n1234567\n:1234567
775\n12345678\n:12345678
776\n123456789\n:123456789
777\n1234567890\n:1234567890
778\n12345678901\n:12345678901
779\t0\n:0
780\t123\n:123
781\t1234\n:1234
782\t12345\n:12345
783\t123456\n:123456
784\t1234567\n:1234567
785\t12345678\n:12345678
786\t123456789\n:123456789
787\t1234567890\n:1234567890
788\t12345678901\n:12345678901
789\n0\t:0
790\n123\t:123
791\n1234\t:1234
792\n12345\t:12345
793\n123456\t:123456
794\n1234567\t:1234567
795\n12345678\t:12345678
796\n123456789\t:123456789
797\n1234567890\t:1234567890
798\n12345678901\t:12345678901
7990\n\n:0
800123\n\n:123
8011234\n\n:1234
80212345\n\n:12345
803123456\n\n:123456
8041234567\n\n:1234567
80512345678\n\n:12345678
806123456789\n\n:123456789
8071234567890\n\n:1234567890
80812345678901\n\n:12345678901
809\n\n0:0
810\n\n123:123
811\n\n1234:1234
812\n\n12345:12345
813\n\n123456:123456
814\n\n1234567:1234567
815\n\n12345678:12345678
816\n\n123456789:123456789
817\n\n1234567890:1234567890
818\n\n12345678901:12345678901
6854fd01 819123:123
820# binary input
8210babc:NaN
8220b123:NaN
8230b0:0
824-0b0:0
825-0b1:-1
8260b0001:1
8270b001:1
8280b011:3
8290b101:5
61f5c3f5 8300b1001:9
8310b10001:17
8320b100001:33
8330b1000001:65
8340b10000001:129
8350b100000001:257
8360b1000000001:513
8370b10000000001:1025
8380b100000000001:2049
8390b1000000000001:4097
8400b10000000000001:8193
8410b100000000000001:16385
8420b1000000000000001:32769
8430b10000000000000001:65537
8440b100000000000000001:131073
8450b1000000000000000001:262145
8460b10000000000000000001:524289
8470b100000000000000000001:1048577
8480b1000000000000000000001:2097153
8490b10000000000000000000001:4194305
8500b100000000000000000000001:8388609
8510b1000000000000000000000001:16777217
8520b10000000000000000000000001:33554433
8530b100000000000000000000000001:67108865
8540b1000000000000000000000000001:134217729
8550b10000000000000000000000000001:268435457
8560b100000000000000000000000000001:536870913
8570b1000000000000000000000000000001:1073741825
8580b10000000000000000000000000000001:2147483649
8590b100000000000000000000000000000001:4294967297
8600b1000000000000000000000000000000001:8589934593
8610b10000000000000000000000000000000001:17179869185
6854fd01 8620b_101:NaN
8630b1_0_1:5
394e6ffb 8640b0_0_0_1:1
6854fd01 865# hex input
866-0x0:0
8670xabcdefgh:NaN
8680x1234:4660
8690xabcdef:11259375
870-0xABCDEF:-11259375
871-0x1234:-4660
8720x12345678:305419896
8730x1_2_3_4_56_78:305419896
394e6ffb 8740xa_b_c_d_e_f:11259375
6854fd01 8750x_123:NaN
61f5c3f5 8760x9:9
8770x11:17
8780x21:33
8790x41:65
8800x81:129
8810x101:257
8820x201:513
8830x401:1025
8840x801:2049
8850x1001:4097
8860x2001:8193
8870x4001:16385
8880x8001:32769
8890x10001:65537
8900x20001:131073
8910x40001:262145
8920x80001:524289
8930x100001:1048577
8940x200001:2097153
8950x400001:4194305
8960x800001:8388609
8970x1000001:16777217
8980x2000001:33554433
8990x4000001:67108865
9000x8000001:134217729
9010x10000001:268435457
9020x20000001:536870913
9030x40000001:1073741825
9040x80000001:2147483649
9050x100000001:4294967297
9060x200000001:8589934593
9070x400000001:17179869185
9080x800000001:34359738369
6854fd01 909# inf input
910inf:inf
911+inf:inf
912-inf:-inf
9130inf:NaN
027dc388 914# abnormal input
6854fd01 915:NaN
916abc:NaN
917 1 a:NaN
9181bcd2:NaN
91911111b:NaN
920+1z:NaN
921-1z:NaN
027dc388 922# only one underscore between two digits
923_123:NaN
924_123_:NaN
925123_:NaN
9261__23:NaN
9271E1__2:NaN
9281_E12:NaN
9291E_12:NaN
9301_E_12:NaN
931+_1E12:NaN
932+0_1E2:100
933+0_0_1E2:100
934-0_0_1E2:-100
935-0_0_1E+0_0_2:-100
936E1:NaN
937E23:NaN
9381.23E1:NaN
9391.23E-1:NaN
940# bug with two E's in number beeing valid
9411e2e3:NaN
9421e2r:NaN
9431e2.0:NaN
07d34614 944# bug with two '.' in number beeing valid
9451.2.2:NaN
9461.2.3e1:NaN
947-1.2.3:NaN
948-1.2.3e-4:NaN
9491.2e3.4:NaN
9501.2e-3.4:NaN
9511.2.3.4:NaN
9521.2.t:NaN
9531..2:NaN
9541..2e1:NaN
9551..2e1..1:NaN
95612e1..1:NaN
957..2:NaN
958.-2:NaN
61f5c3f5 959# leading zeros
960012:12
9610123:123
96201234:1234
963012345:12345
9640123456:123456
96501234567:1234567
966012345678:12345678
9670123456789:123456789
96801234567891:1234567891
969012345678912:12345678912
9700123456789123:123456789123
97101234567891234:1234567891234
027dc388 972# normal input
6854fd01 9730:0
974+0:0
975+00:0
976+000:0
977000000000000000000:0
978-0:0
979-0000:0
980+1:1
981+01:1
982+001:1
983+00000100000:100000
984123456789:123456789
985-1:-1
986-01:-1
987-001:-1
988-123456789:-123456789
989-00000100000:-100000
9901_2_3:123
6854fd01 99110000000000E-1_0:1
9921E2:100
9931E1:10
9941E0:1
6854fd01 9951.23E2:123
6854fd01 996100E-1:10
997# floating point input
027dc388 998# .2e2:20
9991.E3:1000
6854fd01 10001.01E2:101
10011010E-1:101
1002-1010E0:-1010
1003-1010E1:-10100
027dc388 10041234.00:1234
1005# non-integer numbers
6854fd01 1006-1010E-2:NaN
1007-1.01E+1:NaN
1008-1.01E-1:NaN
6854fd01 1009&bnan
10101:NaN
10112:NaN
1012abc:NaN
1013&bone
61f5c3f5 10142:+:1
6854fd01 10152:-:-1
1016boneNaN:-:-1
61f5c3f5 1017boneNaN:+:1
10182:abc:1
10193::1
6854fd01 1020&binf
10211:+:inf
10222:-:-inf
10233:abc:inf
027dc388 1024&is_nan
1025123:0
1026abc:1
1027NaN:1
1028-123:0
6854fd01 1029&is_inf
1030+inf::1
1031-inf::1
1032abc::0
10331::0
1034NaN::0
1035-1::0
1036+inf:-:0
1037+inf:+:1
1038-inf:-:1
1039-inf:+:0
79c55733 1040-inf:-inf:1
1041-inf:+inf:0
1042+inf:-inf:0
1043+inf:+inf:1
6854fd01 1044# it must be exactly /^[+-]inf$/
1045+infinity::0
1046-infinity::0
1047&blsft
1048abc:abc:NaN
61f5c3f5 1049+2:+2:8
1050+1:+32:4294967296
1051+1:+48:281474976710656
6854fd01 1052+8:-2:NaN
1053# excercise base 10
1054+12345:4:10:123450000
1055-1234:0:10:-1234
61f5c3f5 1056+1234:0:10:1234
6854fd01 1057+2:2:10:200
1058+12:2:10:1200
1059+1234:-3:10:NaN
10601234567890123:12:10:1234567890123000000000000
b3abae2a 1061-3:1:2:-6
1062-5:1:2:-10
1063-2:1:2:-4
1064-102533203:1:2:-205066406
6854fd01 1065&brsft
1066abc:abc:NaN
61f5c3f5 1067+8:+2:2
1068+4294967296:+32:1
1069+281474976710656:+48:1
6854fd01 1070+2:-2:NaN
1071# excercise base 10
1072-1234:0:10:-1234
61f5c3f5 1073+1234:0:10:1234
6854fd01 1074+200:2:10:2
1075+1234:3:10:1
1076+1234:2:10:12
1077+1234:-3:10:NaN
1078310000:4:10:31
107912300000:5:10:123
10801230000000000:10:10:123
108109876123456789067890:12:10:9876123
10821234561234567890123:13:10:123456
b3abae2a 1083820265627:1:2:410132813
1084# test shifting negative numbers in base 2
1085-15:1:2:-8
1086-14:1:2:-7
1087-13:1:2:-7
1088-12:1:2:-6
1089-11:1:2:-6
1090-10:1:2:-5
1091-9:1:2:-5
1092-8:1:2:-4
1093-7:1:2:-4
1094-6:1:2:-3
1095-5:1:2:-3
1096-4:1:2:-2
1097-3:1:2:-2
1098-2:1:2:-1
1099-1:1:2:-1
1100-1640531254:2:2:-410132814
1101-1640531254:1:2:-820265627
1102-820265627:1:2:-410132814
1103-205066405:1:2:-102533203
6854fd01 1104&bsstr
11051e+34:1e+34
1106123.456E3:123456e+0
1107100:1e+2
1108abc:NaN
1109&bneg
1110bnegNaN:NaN
1111+inf:-inf
1112-inf:inf
1113abd:NaN
61f5c3f5 11140:0
11151:-1
1116-1:1
6854fd01 1117+123456789:-123456789
61f5c3f5 1118-123456789:123456789
6854fd01 1119&babs
1120babsNaN:NaN
1121+inf:inf
1122-inf:inf
61f5c3f5 11230:0
11241:1
1125-1:1
1126+123456789:123456789
1127-123456789:123456789
6854fd01 1128&bcmp
1129bcmpNaN:bcmpNaN:
61f5c3f5 1130bcmpNaN:0:
11310:bcmpNaN:
11320:0:0
1133-1:0:-1
11340:-1:1
11351:0:1
11360:1:-1
1137-1:1:-1
11381:-1:1
6854fd01 1139-1:-1:0
61f5c3f5 11401:1:0
1141123:123:0
1142123:12:1
114312:123:-1
6854fd01 1144-123:-123:0
1145-123:-12:-1
1146-12:-123:1
61f5c3f5 1147123:124:-1
1148124:123:1
6854fd01 1149-123:-124:1
1150-124:-123:-1
61f5c3f5 1151100:5:1
1152-123456789:987654321:-1
6854fd01 1153+123456789:-987654321:1
61f5c3f5 1154-987654321:123456789:-1
6854fd01 1155-inf:5432112345:-1
1156+inf:5432112345:1
1157-inf:-5432112345:-1
1158+inf:-5432112345:1
1159+inf:+inf:0
1160-inf:-inf:0
1161+inf:-inf:1
1162-inf:+inf:-1
11635:inf:-1
11645:inf:-1
1165-5:-inf:1
1166-5:-inf:1
1167# return undef
1168+inf:NaN:
1169NaN:inf:
1170-inf:NaN:
1171NaN:-inf:
1172&binc
1173abc:NaN
1174+inf:inf
1175-inf:-inf
61f5c3f5 1176+0:1
1177+1:2
1178-1:0
6854fd01 1179&bdec
1180abc:NaN
1181+inf:inf
1182-inf:-inf
1183+0:-1
61f5c3f5 1184+1:0
6854fd01 1185-1:-2
1186&badd
1187abc:abc:NaN
61f5c3f5 1188abc:0:NaN
6854fd01 1189+0:abc:NaN
b3abae2a 1190+inf:-inf:NaN
1191-inf:+inf:NaN
6854fd01 1192+inf:+inf:inf
1193-inf:-inf:-inf
1194baddNaN:+inf:NaN
1195baddNaN:+inf:NaN
1196+inf:baddNaN:NaN
1197-inf:baddNaN:NaN
61f5c3f5 11980:0:0
11991:0:1
12000:1:1
12011:1:2
1202-1:0:-1
12030:-1:-1
6854fd01 1204-1:-1:-2
61f5c3f5 1205-1:+1:0
1206+1:-1:0
1207+9:+1:10
1208+99:+1:100
1209+999:+1:1000
1210+9999:+1:10000
1211+99999:+1:100000
1212+999999:+1:1000000
1213+9999999:+1:10000000
1214+99999999:+1:100000000
1215+999999999:+1:1000000000
1216+9999999999:+1:10000000000
1217+99999999999:+1:100000000000
1218+10:-1:9
1219+100:-1:99
1220+1000:-1:999
1221+10000:-1:9999
1222+100000:-1:99999
1223+1000000:-1:999999
1224+10000000:-1:9999999
1225+100000000:-1:99999999
1226+1000000000:-1:999999999
1227+10000000000:-1:9999999999
1228+123456789:987654321:1111111110
1229-123456789:987654321:864197532
6854fd01 1230-123456789:-987654321:-1111111110
1231+123456789:-987654321:-864197532
56b9c951 1232-1:10001:10000
1233-1:100001:100000
1234-1:1000001:1000000
1235-1:10000001:10000000
1236-1:100000001:100000000
1237-1:1000000001:1000000000
1238-1:10000000001:10000000000
1239-1:100000000001:100000000000
1240-1:1000000000001:1000000000000
1241-1:10000000000001:10000000000000
1242-1:-10001:-10002
1243-1:-100001:-100002
1244-1:-1000001:-1000002
1245-1:-10000001:-10000002
1246-1:-100000001:-100000002
1247-1:-1000000001:-1000000002
1248-1:-10000000001:-10000000002
1249-1:-100000000001:-100000000002
1250-1:-1000000000001:-1000000000002
1251-1:-10000000000001:-10000000000002
6854fd01 1252&bsub
1253abc:abc:NaN
1254abc:+0:NaN
1255+0:abc:NaN
1256+inf:-inf:inf
1257-inf:+inf:-inf
b3abae2a 1258+inf:+inf:NaN
1259-inf:-inf:NaN
61f5c3f5 1260+0:+0:0
1261+1:+0:1
6854fd01 1262+0:+1:-1
61f5c3f5 1263+1:+1:0
6854fd01 1264-1:+0:-1
61f5c3f5 1265+0:-1:1
1266-1:-1:0
6854fd01 1267-1:+1:-2
61f5c3f5 1268+1:-1:2
1269+9:+1:8
1270+99:+1:98
1271+999:+1:998
1272+9999:+1:9998
1273+99999:+1:99998
1274+999999:+1:999998
1275+9999999:+1:9999998
1276+99999999:+1:99999998
1277+999999999:+1:999999998
1278+9999999999:+1:9999999998
1279+99999999999:+1:99999999998
1280+10:-1:11
1281+100:-1:101
1282+1000:-1:1001
1283+10000:-1:10001
1284+100000:-1:100001
1285+1000000:-1:1000001
1286+10000000:-1:10000001
1287+100000000:-1:100000001
1288+1000000000:-1:1000000001
1289+10000000000:-1:10000000001
6854fd01 1290+123456789:+987654321:-864197532
1291-123456789:+987654321:-1111111110
61f5c3f5 1292-123456789:-987654321:864197532
1293+123456789:-987654321:1111111110
56b9c951 129410001:1:10000
1295100001:1:100000
12961000001:1:1000000
129710000001:1:10000000
1298100000001:1:100000000
12991000000001:1:1000000000
130010000000001:1:10000000000
1301100000000001:1:100000000000
13021000000000001:1:1000000000000
130310000000000001:1:10000000000000
130410001:-1:10002
1305100001:-1:100002
13061000001:-1:1000002
130710000001:-1:10000002
1308100000001:-1:100000002
13091000000001:-1:1000000002
131010000000001:-1:10000000002
1311100000000001:-1:100000000002
13121000000000001:-1:1000000000002
131310000000000001:-1:10000000000002
6854fd01 1314&bmul
1315abc:abc:NaN
1316abc:+0:NaN
1317+0:abc:NaN
1318NaNmul:+inf:NaN
1319NaNmul:-inf:NaN
1320-inf:NaNmul:NaN
1321+inf:NaNmul:NaN
1322+inf:+inf:inf
1323+inf:-inf:-inf
1324-inf:+inf:-inf
1325-inf:-inf:inf
61f5c3f5 1326+0:+0:0
1327+0:+1:0
1328+1:+0:0
1329+0:-1:0
1330-1:+0:0
1331123456789123456789:0:0
13320:123456789123456789:0
1333-1:-1:1
6854fd01 1334-1:+1:-1
1335+1:-1:-1
61f5c3f5 1336+1:+1:1
1337+2:+3:6
6854fd01 1338-2:+3:-6
1339+2:-3:-6
61f5c3f5 1340-2:-3:6
1341111:111:12321
134210101:10101:102030201
13431001001:1001001:1002003002001
1344100010001:100010001:10002000300020001
134510000100001:10000100001:100002000030000200001
134611111111111:9:99999999999
134722222222222:9:199999999998
134833333333333:9:299999999997
134944444444444:9:399999999996
135055555555555:9:499999999995
135166666666666:9:599999999994
135277777777777:9:699999999993
135388888888888:9:799999999992
135499999999999:9:899999999991
1355+25:+25:625
1356+12345:+12345:152399025
1357+99999:+11111:1111088889
6854fd01 13589999:10000:99990000
135999999:100000:9999900000
1360999999:1000000:999999000000
13619999999:10000000:99999990000000
136299999999:100000000:9999999900000000
1363999999999:1000000000:999999999000000000
13649999999999:10000000000:99999999990000000000
136599999999999:100000000000:9999999999900000000000
1366999999999999:1000000000000:999999999999000000000000
13679999999999999:10000000000000:99999999999990000000000000
136899999999999999:100000000000000:9999999999999900000000000000
1369999999999999999:1000000000000000:999999999999999000000000000000
13709999999999999999:10000000000000000:99999999999999990000000000000000
137199999999999999999:100000000000000000:9999999999999999900000000000000000
1372999999999999999999:1000000000000000000:999999999999999999000000000000000000
13739999999999999999999:10000000000000000000:99999999999999999990000000000000000000
1374&bdiv-list
1375100:20:5,0
13764095:4095:1,0
1377-4095:-4095:1,0
13784095:-4095:-1,0
1379-4095:4095:-1,0
1380123:2:61,1
b3abae2a 13819:5:1,4
13829:4:2,1
6854fd01 1383# inf handling and general remainder
13845:8:0,5
13850:8:0,0
138611:2:5,1
138711:-2:-5,-1
1388-11:2:-5,1
1389# see table in documentation in MBI
13900:inf:0,0
13910:-inf:0,0
13925:inf:0,5
13935:-inf:0,5
1394-5:inf:0,-5
1395-5:-inf:0,-5
1396inf:5:inf,0
1397-inf:5:-inf,0
1398inf:-5:-inf,0
1399-inf:-5:inf,0
14005:5:1,0
1401-5:-5:1,0
b3abae2a 1402inf:inf:NaN,NaN
1403-inf:-inf:NaN,NaN
1404-inf:inf:NaN,NaN
1405inf:-inf:NaN,NaN
6854fd01 14068:0:inf,8
1407inf:0:inf,inf
1408# exceptions to reminder rule
1409-8:0:-inf,-8
1410-inf:0:-inf,-inf
14110:0:NaN,NaN
1412&bdiv
1413abc:abc:NaN
61f5c3f5 1414abc:1:NaN
14151:abc:NaN
14160:0:NaN
6854fd01 1417# inf handling (see table in doc)
14180:inf:0
14190:-inf:0
14205:inf:0
14215:-inf:0
1422-5:inf:0
1423-5:-inf:0
1424inf:5:inf
1425-inf:5:-inf
1426inf:-5:-inf
1427-inf:-5:inf
14285:5:1
1429-5:-5:1
b3abae2a 1430inf:inf:NaN
1431-inf:-inf:NaN
1432-inf:inf:NaN
1433inf:-inf:NaN
6854fd01 14348:0:inf
1435inf:0:inf
1436-8:0:-inf
1437-inf:0:-inf
14380:0:NaN
143911:2:5
1440-11:-2:5
1441-11:2:-5
144211:-2:-5
61f5c3f5 14430:1:0
14440:-1:0
14451:1:1
1446-1:-1:1
14471:-1:-1
1448-1:1:-1
14491:2:0
14502:1:2
14511:26:0
14521000000000:9:111111111
14532000000000:9:222222222
14543000000000:9:333333333
14554000000000:9:444444444
14565000000000:9:555555555
14576000000000:9:666666666
14587000000000:9:777777777
14598000000000:9:888888888
14609000000000:9:1000000000
146135500000:113:314159
146271000000:226:314159
1463106500000:339:314159
14641000000000:3:333333333
1465+10:+5:2
1466+100:+4:25
1467+1000:+8:125
1468+10000:+16:625
1469999999999999:9:111111111111
1470999999999999:99:10101010101
1471999999999999:999:1001001001
1472999999999999:9999:100010001
1473999999999999999:99999:10000100001
1474+1111088889:99999:11111
6854fd01 1475-5:-3:1
1476-5:3:-1
14774:3:1
14784:-3:-1
14791:3:0
14801:-3:0
1481-2:-3:0
1482-2:3:0
14838:3:2
1484-8:3:-2
148514:-3:-4
1486-14:3:-4
1487-14:-3:4
148814:3:4
1489# bug in Calc with '99999' vs $BASE-1
149010000000000000000000000000000000000000000000000000000000000000000000000000000000000:10000000375084540248994272022843165711074:999999962491547381984643365663244474111576
07d34614 1491&bmodinv
1492# format: number:modulus:result
1493# bmodinv Data errors
1494abc:abc:NaN
1495abc:5:NaN
14965:abc:NaN
1497# bmodinv Expected Results from normal use
14981:5:1
14993:5:2
1500-2:5:2
15018:5033:4404
1502324958749843759385732954874325984357439658735983745:2348249874968739:1741662881064902
d614cd8b 1503## bmodinv Error cases / useless use of function
07d34614 15043:-5:NaN
1505inf:5:NaN
1ddff52a 15065:inf:NaN
1507-inf:5:NaN
15085:-inf:NaN
07d34614 1509&bmodpow
1510# format: number:exponent:modulus:result
1511# bmodpow Data errors
1512abc:abc:abc:NaN
15135:abc:abc:NaN
1514abc:5:abc:NaN
1515abc:abc:5:NaN
15165:5:abc:NaN
15175:abc:5:NaN
1518abc:5:5:NaN
1519# bmodpow Expected results
15200:0:2:1
15211:0:2:1
15220:0:1:0
15238:7:5032:3840
15248:-1:5033:4404
152598436739867439843769485798542749827593285729587325:43698764986460981048259837659386739857456983759328457:6943857329857295827698367:3104744730915914415259518
1526# bmodpow Error cases
15278:8:-5:NaN
15288:-1:16:NaN
1529inf:5:13:NaN
15305:inf:13:NaN
6854fd01 1531&bmod
1532# inf handling, see table in doc
15330:inf:0
15340:-inf:0
15355:inf:5
15365:-inf:5
1537-5:inf:-5
1538-5:-inf:-5
1539inf:5:0
1540-inf:5:0
1541inf:-5:0
1542-inf:-5:0
15435:5:0
1544-5:-5:0
b3abae2a 1545inf:inf:NaN
1546-inf:-inf:NaN
1547-inf:inf:NaN
1548inf:-inf:NaN
6854fd01 15498:0:8
1550inf:0:inf
1551# exceptions to reminder rule
1552-inf:0:-inf
1553-8:0:-8
15540:0:NaN
1555abc:abc:NaN
61f5c3f5 1556abc:1:abc:NaN
15571:abc:NaN
15580:0:NaN
15590:1:0
15601:0:1
15610:-1:0
1562-1:0:-1
15631:1:0
1564-1:-1:0
15651:-1:0
1566-1:1:0
15671:2:1
15682:1:0
15691000000000:9:1
15702000000000:9:2
15713000000000:9:3
15724000000000:9:4
15735000000000:9:5
15746000000000:9:6
15757000000000:9:7
15768000000000:9:8
15779000000000:9:0
157835500000:113:33
157971000000:226:66
1580106500000:339:99
15811000000000:3:1
158210:5:0
1583100:4:0
15841000:8:0
158510000:16:0
1586999999999999:9:0
1587999999999999:99:0
1588999999999999:999:0
1589999999999999:9999:0
1590999999999999999:99999:0
1591-9:+5:1
6854fd01 1592+9:-5:-1
1593-9:-5:-4
1594-5:3:1
1595-2:3:1
15964:3:1
15971:3:1
1598-5:-3:-2
1599-2:-3:-2
16004:-3:-2
16011:-3:-2
16024095:4095:0
027dc388 1603100041000510123:3:0
1604152403346:12345:4321
b3abae2a 16059:5:4
28df3e88 1606# test shortcuts in Calc
1607# 1ex % 9 is always == 1, 1ex % 113 is != 1 for x = (4..9), 1ex % 10 = 0
16081234:9:1
1609123456:9:3
161012345678:9:0
16111234567891:9:1
1612123456789123:9:6
161312345678912345:9:6
16141234567891234567:9:1
1615123456789123456789:9:0
16161234:10:4
1617123456:10:6
161812345678:10:8
16191234567891:10:1
1620123456789123:10:3
162112345678912345:10:5
16221234567891234567:10:7
1623123456789123456789:10:9
16241234:113:104
1625123456:113:60
162612345678:113:89
16271234567891:113:64
1628123456789123:113:95
162912345678912345:113:53
16301234567891234567:113:56
1631123456789123456789:113:39
07d34614 1632# bug in bmod() not modifying the variable in place
1633-629:5033:4404
6854fd01 1634&bgcd
1635abc:abc:NaN
1636abc:+0:NaN
1637+0:abc:NaN
61f5c3f5 1638+0:+0:0
1639+0:+1:1
1640+1:+0:1
1641+1:+1:1
1642+2:+3:1
1643+3:+2:1
1644-3:+2:1
1645100:625:25
16464096:81:1
16471034:804:2
164827:90:56:1
164927:90:54:9
6854fd01 1650&blcm
1651abc:abc:NaN
1652abc:+0:NaN
1653+0:abc:NaN
1654+0:+0:NaN
61f5c3f5 1655+1:+0:0
1656+0:+1:0
1657+27:+90:270
1658+1034:+804:415668
6854fd01 1659&band
1660abc:abc:NaN
1661abc:0:NaN
16620:abc:NaN
16631:2:0
16643:2:2
61f5c3f5 1665+8:+2:0
1666+281474976710656:0:0
1667+281474976710656:1:0
1668+281474976710656:+281474976710656:281474976710656
6854fd01 1669-2:-3:-4
1670-1:-1:-1
1671-6:-6:-6
1672-7:-4:-8
1673-7:4:0
1674-4:7:4
394e6ffb 1675# equal arguments are treated special, so also do some test with unequal ones
16760xFFFF:0xFFFF:0x0xFFFF
16770xFFFFFF:0xFFFFFF:0x0xFFFFFF
16780xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF
16790xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF
16800xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
16810xF0F0:0xF0F0:0x0xF0F0
16820x0F0F:0x0F0F:0x0x0F0F
16830xF0F0F0:0xF0F0F0:0x0xF0F0F0
16840x0F0F0F:0x0F0F0F:0x0x0F0F0F
16850xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0
16860x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F
16870xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0
16880x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F
16890xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0
16900x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F
16910x1F0F0F0F0F0F:0x3F0F0F0F0F0F:0x0x1F0F0F0F0F0F
6854fd01 1692&bior
1693abc:abc:NaN
1694abc:0:NaN
16950:abc:NaN
16961:2:3
61f5c3f5 1697+8:+2:10
1698+281474976710656:0:281474976710656
1699+281474976710656:1:281474976710657
1700+281474976710656:281474976710656:281474976710656
6854fd01 1701-2:-3:-1
1702-1:-1:-1
1703-6:-6:-6
1704-7:4:-3
1705-4:7:-1
394e6ffb 1706# equal arguments are treated special, so also do some test with unequal ones
17070xFFFF:0xFFFF:0x0xFFFF
17080xFFFFFF:0xFFFFFF:0x0xFFFFFF
17090xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF
17100xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF
17110xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
17120:0xFFFF:0x0xFFFF
17130:0xFFFFFF:0x0xFFFFFF
17140:0xFFFFFFFF:0x0xFFFFFFFF
17150:0xFFFFFFFFFF:0x0xFFFFFFFFFF
17160:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
17170xFFFF:0:0x0xFFFF
17180xFFFFFF:0:0x0xFFFFFF
17190xFFFFFFFF:0:0x0xFFFFFFFF
17200xFFFFFFFFFF:0:0x0xFFFFFFFFFF
17210xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF
17220xF0F0:0xF0F0:0x0xF0F0
17230x0F0F:0x0F0F:0x0x0F0F
17240xF0F0:0x0F0F:0x0xFFFF
17250xF0F0F0:0xF0F0F0:0x0xF0F0F0
17260x0F0F0F:0x0F0F0F:0x0x0F0F0F
17270x0F0F0F:0xF0F0F0:0x0xFFFFFF
17280xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0
17290x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F
17300x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF
17310xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0
17320x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F
17330x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF
17340xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0
17350x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F
17360x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
17370x1F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
6854fd01 1738&bxor
1739abc:abc:NaN
1740abc:0:NaN
17410:abc:NaN
17421:2:3
61f5c3f5 1743+8:+2:10
1744+281474976710656:0:281474976710656
1745+281474976710656:1:281474976710657
1746+281474976710656:281474976710656:0
6854fd01 1747-2:-3:3
1748-1:-1:0
1749-6:-6:0
1750-7:4:-3
1751-4:7:-5
17524:-7:-3
1753-4:-7:5
394e6ffb 1754# equal arguments are treated special, so also do some test with unequal ones
17550xFFFF:0xFFFF:0
17560xFFFFFF:0xFFFFFF:0
17570xFFFFFFFF:0xFFFFFFFF:0
17580xFFFFFFFFFF:0xFFFFFFFFFF:0
17590xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0
17600:0xFFFF:0x0xFFFF
17610:0xFFFFFF:0x0xFFFFFF
17620:0xFFFFFFFF:0x0xFFFFFFFF
17630:0xFFFFFFFFFF:0x0xFFFFFFFFFF
17640:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF
17650xFFFF:0:0x0xFFFF
17660xFFFFFF:0:0x0xFFFFFF
17670xFFFFFFFF:0:0x0xFFFFFFFF
17680xFFFFFFFFFF:0:0x0xFFFFFFFFFF
17690xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF
17700xF0F0:0xF0F0:0
17710x0F0F:0x0F0F:0
17720xF0F0:0x0F0F:0x0xFFFF
17730xF0F0F0:0xF0F0F0:0
17740x0F0F0F:0x0F0F0F:0
17750x0F0F0F:0xF0F0F0:0x0xFFFFFF
17760xF0F0F0F0:0xF0F0F0F0:0
17770x0F0F0F0F:0x0F0F0F0F:0
17780x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF
17790xF0F0F0F0F0:0xF0F0F0F0F0:0
17800x0F0F0F0F0F:0x0F0F0F0F0F:0
17810x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF
17820xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0
17830x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0
17840x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF
6854fd01 1785&bnot
1786abc:NaN
1787+0:-1
1788+8:-9
1789+281474976710656:-281474976710657
1790-1:0
1791-2:1
1792-12:11
1793&digit
17940:0:0
179512:0:2
179612:1:1
1797123:0:3
1798123:1:2
1799123:2:1
1800123:-1:1
1801123:-2:2
1802123:-3:3
1803123456:0:6
1804123456:1:5
1805123456:2:4
1806123456:3:3
1807123456:4:2
1808123456:5:1
1809123456:-1:1
1810123456:-2:2
1811123456:-3:3
1812100000:-3:0
1813100000:0:0
1814100000:1:0
1815&mantissa
1816abc:NaN
18171e4:1
18182e0:2
1819123:123
1820-1:-1
1821-2:-2
1822+inf:inf
1823-inf:-inf
1824&exponent
1825abc:NaN
18261e4:4
18272e0:0
1828123:0
1829-1:0
1830-2:0
18310:1
1832+inf:inf
1833-inf:inf
1834&parts
1835abc:NaN,NaN
18361e4:1,4
18372e0:2,0
1838123:123,0
1839-1:-1,0
1840-2:-2,0
18410:0,1
1842+inf:inf,inf
1843-inf:-inf,inf
b3abae2a 1844&bfac
1845-1:NaN
1846NaNfac:NaN
1847+inf:NaN
1848-inf:NaN
18490:1
18501:1
18512:2
18523:6
18534:24
18545:120
18556:720
185610:3628800
185711:39916800
185812:479001600
6854fd01 1859&bpow
1860abc:12:NaN
186112:abc:NaN
18620:0:1
18630:1:0
18640:2:0
18650:-1:NaN
18660:-2:NaN
18671:0:1
18681:1:1
18691:2:1
18701:3:1
18711:-1:1
18721:-2:1
18731:-3:1
18742:0:1
18752:1:2
18762:2:4
18772:3:8
18783:3:27
18792:-1:NaN
1880-2:-1:NaN
18812:-2:NaN
1882-2:-2:NaN
1883+inf:1234500012:inf
1884-inf:1234500012:-inf
1885+inf:-12345000123:inf
1886-inf:-12345000123:-inf
1887# 1 ** -x => 1 / (1 ** x)
1888-1:0:1
1889-2:0:1
1890-1:1:-1
1891-1:2:1
1892-1:3:-1
1893-1:4:1
1894-1:5:-1
1895-1:-1:-1
1896-1:-2:1
1897-1:-3:-1
1898-1:-4:1
189910:2:100
190010:3:1000
190110:4:10000
190210:5:100000
190310:6:1000000
190410:7:10000000
190510:8:100000000
190610:9:1000000000
190710:20:100000000000000000000
1908123456:2:15241383936
1909&length
1910100:3
191110:2
19121:1
19130:1
191412345:5
191510000000000000000:17
1916-123:3
1917215960156869840440586892398248:30
1918&bsqrt
394e6ffb 1919145:12
6854fd01 1920144:12
394e6ffb 1921143:11
6854fd01 192216:4
394e6ffb 1923170:13
1924169:13
1925168:12
6854fd01 19264:2
394e6ffb 19273:1
6854fd01 19282:1
394e6ffb 19299:3
6854fd01 193012:3
1931256:16
1932100000000:10000
19334000000000000:2000000
394e6ffb 1934152399026:12345
1935152399025:12345
1936152399024:12344
6854fd01 19371:1
19380:0
1939-2:NaN
394e6ffb 1940-123:NaN
6854fd01 1941Nan:NaN
394e6ffb 1942+inf:NaN
6854fd01 1943&bround
1944$round_mode('trunc')
19450:12:0
1946NaNbround:12:NaN
1947+inf:12:inf
1948-inf:12:-inf
19491234:0:1234
19501234:2:1200
1951123456:4:123400
1952123456:5:123450
1953123456:6:123456
61f5c3f5 1954+10123456789:5:10123000000
6854fd01 1955-10123456789:5:-10123000000
61f5c3f5 1956+10123456789:9:10123456700
6854fd01 1957-10123456789:9:-10123456700
61f5c3f5 1958+101234500:6:101234000
6854fd01 1959-101234500:6:-101234000
61f5c3f5 1960#+101234500:-4:101234000
6854fd01 1961#-101234500:-4:-101234000
1962$round_mode('zero')
61f5c3f5 1963+20123456789:5:20123000000
6854fd01 1964-20123456789:5:-20123000000
61f5c3f5 1965+20123456789:9:20123456800
6854fd01 1966-20123456789:9:-20123456800
61f5c3f5 1967+201234500:6:201234000
6854fd01 1968-201234500:6:-201234000
61f5c3f5 1969#+201234500:-4:201234000
6854fd01 1970#-201234500:-4:-201234000
1971+12345000:4:12340000
1972-12345000:4:-12340000
1973$round_mode('+inf')
61f5c3f5 1974+30123456789:5:30123000000
6854fd01 1975-30123456789:5:-30123000000
61f5c3f5 1976+30123456789:9:30123456800
6854fd01 1977-30123456789:9:-30123456800
61f5c3f5 1978+301234500:6:301235000
6854fd01 1979-301234500:6:-301234000
61f5c3f5 1980#+301234500:-4:301235000
6854fd01 1981#-301234500:-4:-301234000
1982+12345000:4:12350000
1983-12345000:4:-12340000
1984$round_mode('-inf')
61f5c3f5 1985+40123456789:5:40123000000
6854fd01 1986-40123456789:5:-40123000000
61f5c3f5 1987+40123456789:9:40123456800
6854fd01 1988-40123456789:9:-40123456800
61f5c3f5 1989+401234500:6:401234000
1990+401234500:6:401234000
6854fd01 1991#-401234500:-4:-401235000
1992#-401234500:-4:-401235000
1993+12345000:4:12340000
1994-12345000:4:-12350000
1995$round_mode('odd')
61f5c3f5 1996+50123456789:5:50123000000
6854fd01 1997-50123456789:5:-50123000000
61f5c3f5 1998+50123456789:9:50123456800
6854fd01 1999-50123456789:9:-50123456800
61f5c3f5 2000+501234500:6:501235000
6854fd01 2001-501234500:6:-501235000
61f5c3f5 2002#+501234500:-4:501235000
6854fd01 2003#-501234500:-4:-501235000
2004+12345000:4:12350000
2005-12345000:4:-12350000
2006$round_mode('even')
61f5c3f5 2007+60123456789:5:60123000000
6854fd01 2008-60123456789:5:-60123000000
61f5c3f5 2009+60123456789:9:60123456800
6854fd01 2010-60123456789:9:-60123456800
61f5c3f5 2011+601234500:6:601234000
6854fd01 2012-601234500:6:-601234000
61f5c3f5 2013#+601234500:-4:601234000
6854fd01 2014#-601234500:-4:-601234000
2015#-601234500:-9:0
2016#-501234500:-9:0
2017#-601234500:-8:0
2018#-501234500:-8:0
2019+1234567:7:1234567
2020+1234567:6:1234570
2021+12345000:4:12340000
2022-12345000:4:-12340000
2023&is_zero
20240:1
2025NaNzero:0
2026+inf:0
2027-inf:0
2028123:0
2029-1:0
20301:0
2031&is_one
20320:0
2033NaNone:0
2034+inf:0
2035-inf:0
20361:1
20372:0
2038-1:0
2039-2:0
2040# floor and ceil tests are pretty pointless in integer space...but play safe
2041&bfloor
20420:0
2043NaNfloor:NaN
2044+inf:inf
2045-inf:-inf
2046-1:-1
2047-2:-2
20482:2
20493:3
2050abc:NaN
2051&bceil
2052NaNceil:NaN
2053+inf:inf
2054-inf:-inf
20550:0
2056-1:-1
2057-2:-2
20582:2
20593:3
2060abc:NaN
2061&as_hex
2062128:0x80
2063-128:-0x80
20640:0x0
2065-0:0x0
20661:0x1
20670x123456789123456789:0x123456789123456789
2068+inf:inf
2069-inf:-inf
2070NaNas_hex:NaN
2071&as_bin
2072128:0b10000000
2073-128:-0b10000000
20740:0b0
2075-0:0b0
20761:0b1
20770b1010111101010101010110110110110110101:0b1010111101010101010110110110110110101
1ddff52a 20780x123456789123456789:0b100100011010001010110011110001001000100100011010001010110011110001001
6854fd01 2079+inf:inf
2080-inf:-inf
2081NaNas_bin:NaN