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 (e.g. it 7# is usually desirable to have 2 ** 2 return a BigInt, not a BigFloat). 8 9# Results that are required to be BigFloat are marked with C<^> at the end. 10 11# Please note that the testcount goes up by two for each extra result marked 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 { 55 chomp; 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 { 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 } 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 "broot") { 121 $try .= "\$x->broot(\$y);"; 122 } elsif ($f eq "bacmp"){ 123 $try .= '$x->bacmp($y);'; 124 } elsif ($f eq "badd"){ 125 $try .= '$x + $y;'; 126 } elsif ($f eq "bsub"){ 127 $try .= '$x - $y;'; 128 } elsif ($f eq "bmul"){ 129 $try .= '$x * $y;'; 130 } elsif ($f eq "bdiv"){ 131 $try .= '$x / $y;'; 132 } elsif ($f eq "bdiv-list"){ 133 $try .= 'join (",",$x->bdiv($y));'; 134 # overload via x= 135 } elsif ($f =~ /^.=$/){ 136 $try .= "\$x $f \$y;"; 137 # overload via x 138 } elsif ($f =~ /^.$/){ 139 $try .= "\$x $f \$y;"; 140 } elsif ($f eq "bmod"){ 141 $try .= '$x % $y;'; 142 } elsif ($f eq "bgcd") 143 { 144 if (defined $args[2]) 145 { 146 $try .= " \$z = $class->new('$args[2]'); "; 147 } 148 $try .= "$class\::bgcd(\$x, \$y"; 149 $try .= ", \$z" if (defined $args[2]); 150 $try .= " );"; 151 } 152 elsif ($f eq "blcm") 153 { 154 if (defined $args[2]) 155 { 156 $try .= " \$z = $class->new('$args[2]'); "; 157 } 158 $try .= "$class\::blcm(\$x, \$y"; 159 $try .= ", \$z" if (defined $args[2]); 160 $try .= " );"; 161 }elsif ($f eq "blsft"){ 162 if (defined $args[2]) 163 { 164 $try .= "\$x->blsft(\$y,$args[2]);"; 165 } 166 else 167 { 168 $try .= "\$x << \$y;"; 169 } 170 }elsif ($f eq "brsft"){ 171 if (defined $args[2]) 172 { 173 $try .= "\$x->brsft(\$y,$args[2]);"; 174 } 175 else 176 { 177 $try .= "\$x >> \$y;"; 178 } 179 }elsif ($f eq "band"){ 180 $try .= "\$x & \$y;"; 181 }elsif ($f eq "bior"){ 182 $try .= "\$x | \$y;"; 183 }elsif ($f eq "bxor"){ 184 $try .= "\$x ^ \$y;"; 185 }elsif ($f eq "bpow"){ 186 $try .= "\$x ** \$y;"; 187 }elsif ($f eq "digit"){ 188 $try = "\$x = $class->new('$args[0]'); \$x->digit($args[1]);"; 189 } else { warn "Unknown op '$f'"; } 190 } # end else all other ops 191 192 $ans1 = eval $try; 193 # convert hex/binary targets to decimal 194 if ($ans =~ /^(0x0x|0b0b)/) 195 { 196 $ans =~ s/^0[xb]//; $ans = Math::BigInt->new($ans)->bstr(); 197 } 198 if ($ans eq "") 199 { 200 ok_undef ($ans1); 201 } 202 else 203 { 204 # print "try: $try ans: $ans1 $ans\n"; 205 print "# Tried: '$try'\n" if !ok ($ans1, $ans); 206 if ($expected_class ne $class) 207 { 208 ok (ref($ans1),$expected_class); # also checks that it really is ref! 209 ok ($Math::BigInt::upgrade,'Math::BigFloat'); # still okay? 210 } 211 } 212 # check internal state of number objects 213 is_valid($ans1,$f) if ref $ans1; 214 } # endwhile data tests 215close DATA; 216 217my $warn = ''; $SIG{__WARN__} = sub { $warn = shift; }; 218 219# these should not warn 220$warn = ''; eval "\$z = 3.17 <= \$y"; ok ($z, 1); ok ($warn, ''); 221$warn = ''; eval "\$z = \$y >= 3.17"; ok ($z, 1); ok ($warn, ''); 222 223# all tests done 224 2251; 226 227############################################################################### 228############################################################################### 229# Perl 5.005 does not like ok ($x,undef) 230 231sub ok_undef 232 { 233 my $x = shift; 234 235 ok (1,1) and return if !defined $x; 236 ok ($x,'undef'); 237 } 238 239############################################################################### 240# sub to check validity of a BigInt internally, to ensure that no op leaves a 241# number object in an invalid state (f.i. "-0") 242 243sub is_valid 244 { 245 my ($x,$f,$c) = @_; 246 247 # The checks here are loosened a bit to allow BigInt or BigFloats to pass 248 249 my $e = 0; # error? 250 # ok as reference? 251 # $e = "Not a reference to $c" if (ref($x) || '') ne $c; 252 253 # has ok sign? 254 $e = "Illegal sign $x->{sign} (expected: '+', '-', '-inf', '+inf' or 'NaN'" 255 if $e eq '0' && $x->{sign} !~ /^(\+|-|\+inf|-inf|NaN)$/; 256 257 $e = "-0 is invalid!" if $e ne '0' && $x->{sign} eq '-' && $x == 0; 258 #$e = $CALC->_check($x->{value}) if $e eq '0'; 259 260 # test done, see if error did crop up 261 ok (1,1), return if ($e eq '0'); 262 263 ok (1,$e." after op '$f'"); 264 } 265 266__DATA__ 267&.= 2681234:-345:1234-345 269&+= 2701:2:3 271-1:-2:-3 272&-= 2731:2:-1 274-1:-2:1 275&*= 2762:3:6 277-1:5:-5 278&%= 279100:3:1 2808:9:8 281&/= 282100:3:33.33333333333333333333333333333333333333 283-8:2:-4 284&|= 2852:1:3 286&&= 2875:7:5 288&^= 2895:7:2 290&is_negative 2910:0 292-1:1 2931:0 294+inf:0 295-inf:1 296NaNneg:0 297&is_positive 2980:0 299-1:0 3001:1 301+inf:1 302-inf:0 303NaNneg:0 304&is_odd 305abc:0 3060:0 3071:1 3083:1 309-1:1 310-3:1 31110000001:1 31210000002:0 3132:0 314120:0 315121:1 316&is_int 317NaN:0 318inf:0 319-inf:0 3201:1 32112:1 322123e12:1 323&is_even 324abc:0 3250:1 3261:0 3273:0 328-1:0 329-3:0 33010000001:0 33110000002:1 3322:1 333120:1 334121:0 335&bacmp 336+0:-0:0 337+0:+1:-1 338-1:+1:0 339+1:-1:0 340-1:+2:-1 341+2:-1:1 342-123456789:+987654321:-1 343+123456789:-987654321:-1 344+987654321:+123456789:1 345-987654321:+123456789:1 346-123:+4567889:-1 347# NaNs 348acmpNaN:123: 349123:acmpNaN: 350acmpNaN:acmpNaN: 351# infinity 352+inf:+inf:0 353-inf:-inf:0 354+inf:-inf:0 355-inf:+inf:0 356+inf:123:1 357-inf:123:1 358+inf:-123:1 359-inf:-123:1 360# return undef 361+inf:NaN: 362NaN:inf: 363-inf:NaN: 364NaN:-inf: 365&bnorm 366123:123 36712.3:12.3^ 368# binary input 3690babc:NaN 3700b123:NaN 3710b0:0 372-0b0:0 373-0b1:-1 3740b0001:1 3750b001:1 3760b011:3 3770b101:5 3780b1001:9 3790b10001:17 3800b100001:33 3810b1000001:65 3820b10000001:129 3830b100000001:257 3840b1000000001:513 3850b10000000001:1025 3860b100000000001:2049 3870b1000000000001:4097 3880b10000000000001:8193 3890b100000000000001:16385 3900b1000000000000001:32769 3910b10000000000000001:65537 3920b100000000000000001:131073 3930b1000000000000000001:262145 3940b10000000000000000001:524289 3950b100000000000000000001:1048577 3960b1000000000000000000001:2097153 3970b10000000000000000000001:4194305 3980b100000000000000000000001:8388609 3990b1000000000000000000000001:16777217 4000b10000000000000000000000001:33554433 4010b100000000000000000000000001:67108865 4020b1000000000000000000000000001:134217729 4030b10000000000000000000000000001:268435457 4040b100000000000000000000000000001:536870913 4050b1000000000000000000000000000001:1073741825 4060b10000000000000000000000000000001:2147483649 4070b100000000000000000000000000000001:4294967297 4080b1000000000000000000000000000000001:8589934593 4090b10000000000000000000000000000000001:17179869185 4100b_101:NaN 4110b1_0_1:5 4120b0_0_0_1:1 413# hex input 414-0x0:0 4150xabcdefgh:NaN 4160x1234:4660 4170xabcdef:11259375 418-0xABCDEF:-11259375 419-0x1234:-4660 4200x12345678:305419896 4210x1_2_3_4_56_78:305419896 4220xa_b_c_d_e_f:11259375 4230x_123:NaN 4240x9:9 4250x11:17 4260x21:33 4270x41:65 4280x81:129 4290x101:257 4300x201:513 4310x401:1025 4320x801:2049 4330x1001:4097 4340x2001:8193 4350x4001:16385 4360x8001:32769 4370x10001:65537 4380x20001:131073 4390x40001:262145 4400x80001:524289 4410x100001:1048577 4420x200001:2097153 4430x400001:4194305 4440x800001:8388609 4450x1000001:16777217 4460x2000001:33554433 4470x4000001:67108865 4480x8000001:134217729 4490x10000001:268435457 4500x20000001:536870913 4510x40000001:1073741825 4520x80000001:2147483649 4530x100000001:4294967297 4540x200000001:8589934593 4550x400000001:17179869185 4560x800000001:34359738369 457# inf input 458inf:inf 459+inf:inf 460-inf:-inf 4610inf:NaN 462# abnormal input 463:NaN 464abc:NaN 465 1 a:NaN 4661bcd2:NaN 46711111b:NaN 468+1z:NaN 469-1z:NaN 470# only one underscore between two digits 471_123:NaN 472_123_:NaN 473123_:NaN 4741__23:NaN 4751E1__2:NaN 4761_E12:NaN 4771E_12:NaN 4781_E_12:NaN 479+_1E12:NaN 480+0_1E2:100 481+0_0_1E2:100 482-0_0_1E2:-100 483-0_0_1E+0_0_2:-100 484E1:NaN 485E23:NaN 4861.23E1:12.3^ 4871.23E-1:0.123^ 488# bug with two E's in number beeing valid 4891e2e3:NaN 4901e2r:NaN 4911e2.0:NaN 492# leading zeros 493012:12 4940123:123 49501234:1234 496012345:12345 4970123456:123456 49801234567:1234567 499012345678:12345678 5000123456789:123456789 50101234567891:1234567891 502012345678912:12345678912 5030123456789123:123456789123 50401234567891234:1234567891234 505# normal input 5060:0 507+0:0 508+00:0 509+000:0 510000000000000000000:0 511-0:0 512-0000:0 513+1:1 514+01:1 515+001:1 516+00000100000:100000 517123456789:123456789 518-1:-1 519-01:-1 520-001:-1 521-123456789:-123456789 522-00000100000:-100000 5231_2_3:123 52410000000000E-1_0:1 5251E2:100 5261E1:10 5271E0:1 5281.23E2:123 529100E-1:10 530# floating point input 531# .2e2:20 5321.E3:1000 5331.01E2:101 5341010E-1:101 535-1010E0:-1010 536-1010E1:-10100 5371234.00:1234 538# non-integer numbers 539-1010E-2:-10.1^ 540-1.01E+1:-10.1^ 541-1.01E-1:-0.101^ 542&bnan 5431:NaN 5442:NaN 545abc:NaN 546&bone 5472:+:1 5482:-:-1 549boneNaN:-:-1 550boneNaN:+:1 5512:abc:1 5523::1 553&binf 5541:+:inf 5552:-:-inf 5563:abc:inf 557&is_nan 558123:0 559abc:1 560NaN:1 561-123:0 562&is_inf 563+inf::1 564-inf::1 565abc::0 5661::0 567NaN::0 568-1::0 569+inf:-:0 570+inf:+:1 571-inf:-:1 572-inf:+:0 573# it must be exactly /^[+-]inf$/ 574+infinity::0 575-infinity::0 576&blsft 577abc:abc:NaN 578+2:+2:8 579+1:+32:4294967296 580+1:+48:281474976710656 581+8:-2:NaN 582# excercise base 10 583+12345:4:10:123450000 584-1234:0:10:-1234 585+1234:0:10:1234 586+2:2:10:200 587+12:2:10:1200 588+1234:-3:10:NaN 5891234567890123:12:10:1234567890123000000000000 590&brsft 591abc:abc:NaN 592+8:+2:2 593+4294967296:+32:1 594+281474976710656:+48:1 595+2:-2:NaN 596# excercise base 10 597-1234:0:10:-1234 598+1234:0:10:1234 599+200:2:10:2 600+1234:3:10:1 601+1234:2:10:12 602+1234:-3:10:NaN 603310000:4:10:31 60412300000:5:10:123 6051230000000000:10:10:123 60609876123456789067890:12:10:9876123 6071234561234567890123:13:10:123456 608&bsstr 6091e+34:1e+34 610123.456E3:123456e+0 611100:1e+2 612abc:NaN 613&bneg 614bnegNaN:NaN 615+inf:-inf 616-inf:inf 617abd:NaN 6180:0 6191:-1 620-1:1 621+123456789:-123456789 622-123456789:123456789 623&babs 624babsNaN:NaN 625+inf:inf 626-inf:inf 6270:0 6281:1 629-1:1 630+123456789:123456789 631-123456789:123456789 632&bcmp 633bcmpNaN:bcmpNaN: 634bcmpNaN:0: 6350:bcmpNaN: 6360:0:0 637-1:0:-1 6380:-1:1 6391:0:1 6400:1:-1 641-1:1:-1 6421:-1:1 643-1:-1:0 6441:1:0 645123:123:0 646123:12:1 64712:123:-1 648-123:-123:0 649-123:-12:-1 650-12:-123:1 651123:124:-1 652124:123:1 653-123:-124:1 654-124:-123:-1 655100:5:1 656-123456789:987654321:-1 657+123456789:-987654321:1 658-987654321:123456789:-1 659-inf:5432112345:-1 660+inf:5432112345:1 661-inf:-5432112345:-1 662+inf:-5432112345:1 663+inf:+inf:0 664-inf:-inf:0 665+inf:-inf:1 666-inf:+inf:-1 6675:inf:-1 6685:inf:-1 669-5:-inf:1 670-5:-inf:1 671# return undef 672+inf:NaN: 673NaN:inf: 674-inf:NaN: 675NaN:-inf: 676&binc 677abc:NaN 678+inf:inf 679-inf:-inf 680+0:1 681+1:2 682-1:0 683&bdec 684abc:NaN 685+inf:inf 686-inf:-inf 687+0:-1 688+1:0 689-1:-2 690&badd 691abc:abc:NaN 692abc:0:NaN 693+0:abc:NaN 694+inf:-inf:NaN 695-inf:+inf:NaN 696+inf:+inf:inf 697-inf:-inf:-inf 698baddNaN:+inf:NaN 699baddNaN:+inf:NaN 700+inf:baddNaN:NaN 701-inf:baddNaN:NaN 7020:0:0 7031:0:1 7040:1:1 7051:1:2 706-1:0:-1 7070:-1:-1 708-1:-1:-2 709-1:+1:0 710+1:-1:0 711+9:+1:10 712+99:+1:100 713+999:+1:1000 714+9999:+1:10000 715+99999:+1:100000 716+999999:+1:1000000 717+9999999:+1:10000000 718+99999999:+1:100000000 719+999999999:+1:1000000000 720+9999999999:+1:10000000000 721+99999999999:+1:100000000000 722+10:-1:9 723+100:-1:99 724+1000:-1:999 725+10000:-1:9999 726+100000:-1:99999 727+1000000:-1:999999 728+10000000:-1:9999999 729+100000000:-1:99999999 730+1000000000:-1:999999999 731+10000000000:-1:9999999999 732+123456789:987654321:1111111110 733-123456789:987654321:864197532 734-123456789:-987654321:-1111111110 735+123456789:-987654321:-864197532 7362:2.5:4.5^ 737-123:-1.5:-124.5^ 738-1.2:1:-0.2^ 739&bsub 740abc:abc:NaN 741abc:+0:NaN 742+0:abc:NaN 743+inf:-inf:inf 744-inf:+inf:-inf 745+inf:+inf:NaN 746-inf:-inf:NaN 747+0:+0:0 748+1:+0:1 749+0:+1:-1 750+1:+1:0 751-1:+0:-1 752+0:-1:1 753-1:-1:0 754-1:+1:-2 755+1:-1:2 756+9:+1:8 757+99:+1:98 758+999:+1:998 759+9999:+1:9998 760+99999:+1:99998 761+999999:+1:999998 762+9999999:+1:9999998 763+99999999:+1:99999998 764+999999999:+1:999999998 765+9999999999:+1:9999999998 766+99999999999:+1:99999999998 767+10:-1:11 768+100:-1:101 769+1000:-1:1001 770+10000:-1:10001 771+100000:-1:100001 772+1000000:-1:1000001 773+10000000:-1:10000001 774+100000000:-1:100000001 775+1000000000:-1:1000000001 776+10000000000:-1:10000000001 777+123456789:+987654321:-864197532 778-123456789:+987654321:-1111111110 779-123456789:-987654321:864197532 780+123456789:-987654321:1111111110 781&bmul 782abc:abc:NaN 783abc:+0:NaN 784+0:abc:NaN 785NaNmul:+inf:NaN 786NaNmul:-inf:NaN 787-inf:NaNmul:NaN 788+inf:NaNmul:NaN 789+inf:+inf:inf 790+inf:-inf:-inf 791-inf:+inf:-inf 792-inf:-inf:inf 793+0:+0:0 794+0:+1:0 795+1:+0:0 796+0:-1:0 797-1:+0:0 798123456789123456789:0:0 7990:123456789123456789:0 800-1:-1:1 801-1:+1:-1 802+1:-1:-1 803+1:+1:1 804+2:+3:6 805-2:+3:-6 806+2:-3:-6 807-2:-3:6 808111:111:12321 80910101:10101:102030201 8101001001:1001001:1002003002001 811100010001:100010001:10002000300020001 81210000100001:10000100001:100002000030000200001 81311111111111:9:99999999999 81422222222222:9:199999999998 81533333333333:9:299999999997 81644444444444:9:399999999996 81755555555555:9:499999999995 81866666666666:9:599999999994 81977777777777:9:699999999993 82088888888888:9:799999999992 82199999999999:9:899999999991 822+25:+25:625 823+12345:+12345:152399025 824+99999:+11111:1111088889 8259999:10000:99990000 82699999:100000:9999900000 827999999:1000000:999999000000 8289999999:10000000:99999990000000 82999999999:100000000:9999999900000000 830999999999:1000000000:999999999000000000 8319999999999:10000000000:99999999990000000000 83299999999999:100000000000:9999999999900000000000 833999999999999:1000000000000:999999999999000000000000 8349999999999999:10000000000000:99999999999990000000000000 83599999999999999:100000000000000:9999999999999900000000000000 836999999999999999:1000000000000000:999999999999999000000000000000 8379999999999999999:10000000000000000:99999999999999990000000000000000 83899999999999999999:100000000000000000:9999999999999999900000000000000000 839999999999999999999:1000000000000000000:999999999999999999000000000000000000 8409999999999999999999:10000000000000000000:99999999999999999990000000000000000000 8413:3.5:10.5^ 8423.5:3:10.5^ 843&bdiv-list 844100:20:5,0 8454095:4095:1,0 846-4095:-4095:1,0 8474095:-4095:-1,0 848-4095:4095:-1,0 849123:2:61.5,1 8509:5:1.8,4 8519:4:2.25,1 852# inf handling and general remainder 8535:8:0.625,5 8540:8:0,0 85511:2:5.5,1 85611:-2:-5.5,-1 857-11:2:-5.5,1 858# see table in documentation in MBI 8590:inf:0,0 8600:-inf:0,0 8615:inf:0,5 8625:-inf:0,5 863-5:inf:0,-5 864-5:-inf:0,-5 865inf:5:inf,0 866-inf:5:-inf,0 867inf:-5:-inf,0 868-inf:-5:inf,0 8695:5:1,0 870-5:-5:1,0 871inf:inf:NaN,NaN 872-inf:-inf:NaN,NaN 873-inf:inf:NaN,NaN 874inf:-inf:NaN,NaN 8758:0:inf,8 876inf:0:inf,inf 877# exceptions to reminder rule 878-8:0:-inf,-8 879-inf:0:-inf,-inf 8800:0:NaN,NaN 881&bdiv 882abc:abc:NaN 883abc:1:NaN 8841:abc:NaN 8850:0:NaN 886# inf handling (see table in doc) 8870:inf:0 8880:-inf:0 8895:inf:0 8905:-inf:0 891-5:inf:0 892-5:-inf:0 893inf:5:inf 894-inf:5:-inf 895inf:-5:-inf 896-inf:-5:inf 8975:5:1 898-5:-5:1 899inf:inf:NaN 900-inf:-inf:NaN 901-inf:inf:NaN 902inf:-inf:NaN 9038:0:inf 904inf:0:inf 905-8:0:-inf 906-inf:0:-inf 9070:0:NaN 90811:2:5.5^ 909-11:-2:5.5^ 910-11:2:-5.5^ 91111:-2:-5.5^ 9120:1:0 9130:-1:0 9141:1:1 915-1:-1:1 9161:-1:-1 917-1:1:-1 9181:2:0.5^ 9192:1:2 9201000000000:9:111111111.1111111111111111111111111111111^ 9212000000000:9:222222222.2222222222222222222222222222222^ 9223000000000:9:333333333.3333333333333333333333333333333^ 9234000000000:9:444444444.4444444444444444444444444444444^ 9245000000000:9:555555555.5555555555555555555555555555556^ 9256000000000:9:666666666.6666666666666666666666666666667^ 9267000000000:9:777777777.7777777777777777777777777777778^ 9278000000000:9:888888888.8888888888888888888888888888889^ 9289000000000:9:1000000000 92935500000:113:314159.2920353982300884955752212389380531^ 93071000000:226:314159.2920353982300884955752212389380531^ 931106500000:339:314159.2920353982300884955752212389380531^ 9321000000000:3:333333333.3333333333333333333333333333333^ 933+10:+5:2 934+100:+4:25 935+1000:+8:125 936+10000:+16:625 937999999999999:9:111111111111 938999999999999:99:10101010101 939999999999999:999:1001001001 940999999999999:9999:100010001 941999999999999999:99999:10000100001 942+1111088889:99999:11111 943-5:-3:1.666666666666666666666666666666666666667^ 944-5:3:-1.666666666666666666666666666666666666667^ 9454:3:1.333333333333333333333333333333333333333^ 9464:-3:-1.333333333333333333333333333333333333333^ 9471:3:0.3333333333333333333333333333333333333333^ 9481:-3:-0.3333333333333333333333333333333333333333^ 949-2:-3:0.6666666666666666666666666666666666666667^ 950-2:3:-0.6666666666666666666666666666666666666667^ 9518:5:1.6^ 952-8:5:-1.6^ 95314:-3:-4.666666666666666666666666666666666666667^ 954-14:3:-4.666666666666666666666666666666666666667^ 955-14:-3:4.666666666666666666666666666666666666667^ 95614:3:4.666666666666666666666666666666666666667^ 957# bug in Calc with '99999' vs $BASE-1 958#10000000000000000000000000000000000000000000000000000000000000000000000000000000000:10000000375084540248994272022843165711074:999999962491547381984643365663244474111576 95912:24:0.5^ 960&bmod 961# inf handling, see table in doc 9620:inf:0 9630:-inf:0 9645:inf:5 9655:-inf:5 966-5:inf:-5 967-5:-inf:-5 968inf:5:0 969-inf:5:0 970inf:-5:0 971-inf:-5:0 9725:5:0 973-5:-5:0 974inf:inf:NaN 975-inf:-inf:NaN 976-inf:inf:NaN 977inf:-inf:NaN 9788:0:8 979inf:0:inf 980# exceptions to reminder rule 981-inf:0:-inf 982-8:0:-8 9830:0:NaN 984abc:abc:NaN 985abc:1:abc:NaN 9861:abc:NaN 9870:0:NaN 9880:1:0 9891:0:1 9900:-1:0 991-1:0:-1 9921:1:0 993-1:-1:0 9941:-1:0 995-1:1:0 9961:2:1 9972:1:0 9981000000000:9:1 9992000000000:9:2 10003000000000:9:3 10014000000000:9:4 10025000000000:9:5 10036000000000:9:6 10047000000000:9:7 10058000000000:9:8 10069000000000:9:0 100735500000:113:33 100871000000:226:66 1009106500000:339:99 10101000000000:3:1 101110:5:0 1012100:4:0 10131000:8:0 101410000:16:0 1015999999999999:9:0 1016999999999999:99:0 1017999999999999:999:0 1018999999999999:9999:0 1019999999999999999:99999:0 1020-9:+5:1 1021+9:-5:-1 1022-9:-5:-4 1023-5:3:1 1024-2:3:1 10254:3:1 10261:3:1 1027-5:-3:-2 1028-2:-3:-2 10294:-3:-2 10301:-3:-2 10314095:4095:0 1032100041000510123:3:0 1033152403346:12345:4321 10349:5:4 1035&bgcd 1036abc:abc:NaN 1037abc:+0:NaN 1038+0:abc:NaN 1039+0:+0:0 1040+0:+1:1 1041+1:+0:1 1042+1:+1:1 1043+2:+3:1 1044+3:+2:1 1045-3:+2:1 1046100:625:25 10474096:81:1 10481034:804:2 104927:90:56:1 105027:90:54:9 1051&blcm 1052abc:abc:NaN 1053abc:+0:NaN 1054+0:abc:NaN 1055+0:+0:NaN 1056+1:+0:0 1057+0:+1:0 1058+27:+90:270 1059+1034:+804:415668 1060&band 1061abc:abc:NaN 1062abc:0:NaN 10630:abc:NaN 10641:2:0 10653:2:2 1066+8:+2:0 1067+281474976710656:0:0 1068+281474976710656:1:0 1069+281474976710656:+281474976710656:281474976710656 1070-2:-3:-4 1071-1:-1:-1 1072-6:-6:-6 1073-7:-4:-8 1074-7:4:0 1075-4:7:4 1076# equal arguments are treated special, so also do some test with unequal ones 10770xFFFF:0xFFFF:0x0xFFFF 10780xFFFFFF:0xFFFFFF:0x0xFFFFFF 10790xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF 10800xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF 10810xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF 10820xF0F0:0xF0F0:0x0xF0F0 10830x0F0F:0x0F0F:0x0x0F0F 10840xF0F0F0:0xF0F0F0:0x0xF0F0F0 10850x0F0F0F:0x0F0F0F:0x0x0F0F0F 10860xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0 10870x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F 10880xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0 10890x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F 10900xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0 10910x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F 10920x1F0F0F0F0F0F:0x3F0F0F0F0F0F:0x0x1F0F0F0F0F0F 1093&bior 1094abc:abc:NaN 1095abc:0:NaN 10960:abc:NaN 10971:2:3 1098+8:+2:10 1099+281474976710656:0:281474976710656 1100+281474976710656:1:281474976710657 1101+281474976710656:281474976710656:281474976710656 1102-2:-3:-1 1103-1:-1:-1 1104-6:-6:-6 1105-7:4:-3 1106-4:7:-1 1107# equal arguments are treated special, so also do some test with unequal ones 11080xFFFF:0xFFFF:0x0xFFFF 11090xFFFFFF:0xFFFFFF:0x0xFFFFFF 11100xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF 11110xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF 11120xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF 11130:0xFFFF:0x0xFFFF 11140:0xFFFFFF:0x0xFFFFFF 11150:0xFFFFFFFF:0x0xFFFFFFFF 11160:0xFFFFFFFFFF:0x0xFFFFFFFFFF 11170:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF 11180xFFFF:0:0x0xFFFF 11190xFFFFFF:0:0x0xFFFFFF 11200xFFFFFFFF:0:0x0xFFFFFFFF 11210xFFFFFFFFFF:0:0x0xFFFFFFFFFF 11220xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF 11230xF0F0:0xF0F0:0x0xF0F0 11240x0F0F:0x0F0F:0x0x0F0F 11250xF0F0:0x0F0F:0x0xFFFF 11260xF0F0F0:0xF0F0F0:0x0xF0F0F0 11270x0F0F0F:0x0F0F0F:0x0x0F0F0F 11280x0F0F0F:0xF0F0F0:0x0xFFFFFF 11290xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0 11300x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F 11310x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF 11320xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0 11330x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F 11340x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF 11350xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0 11360x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F 11370x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF 11380x1F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF 1139&bxor 1140abc:abc:NaN 1141abc:0:NaN 11420:abc:NaN 11431:2:3 1144+8:+2:10 1145+281474976710656:0:281474976710656 1146+281474976710656:1:281474976710657 1147+281474976710656:281474976710656:0 1148-2:-3:3 1149-1:-1:0 1150-6:-6:0 1151-7:4:-3 1152-4:7:-5 11534:-7:-3 1154-4:-7:5 1155# equal arguments are treated special, so also do some test with unequal ones 11560xFFFF:0xFFFF:0 11570xFFFFFF:0xFFFFFF:0 11580xFFFFFFFF:0xFFFFFFFF:0 11590xFFFFFFFFFF:0xFFFFFFFFFF:0 11600xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0 11610:0xFFFF:0x0xFFFF 11620:0xFFFFFF:0x0xFFFFFF 11630:0xFFFFFFFF:0x0xFFFFFFFF 11640:0xFFFFFFFFFF:0x0xFFFFFFFFFF 11650:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF 11660xFFFF:0:0x0xFFFF 11670xFFFFFF:0:0x0xFFFFFF 11680xFFFFFFFF:0:0x0xFFFFFFFF 11690xFFFFFFFFFF:0:0x0xFFFFFFFFFF 11700xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF 11710xF0F0:0xF0F0:0 11720x0F0F:0x0F0F:0 11730xF0F0:0x0F0F:0x0xFFFF 11740xF0F0F0:0xF0F0F0:0 11750x0F0F0F:0x0F0F0F:0 11760x0F0F0F:0xF0F0F0:0x0xFFFFFF 11770xF0F0F0F0:0xF0F0F0F0:0 11780x0F0F0F0F:0x0F0F0F0F:0 11790x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF 11800xF0F0F0F0F0:0xF0F0F0F0F0:0 11810x0F0F0F0F0F:0x0F0F0F0F0F:0 11820x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF 11830xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0 11840x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0 11850x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF 1186&bnot 1187abc:NaN 1188+0:-1 1189+8:-9 1190+281474976710656:-281474976710657 1191-1:0 1192-2:1 1193-12:11 1194&digit 11950:0:0 119612:0:2 119712:1:1 1198123:0:3 1199123:1:2 1200123:2:1 1201123:-1:1 1202123:-2:2 1203123:-3:3 1204123456:0:6 1205123456:1:5 1206123456:2:4 1207123456:3:3 1208123456:4:2 1209123456:5:1 1210123456:-1:1 1211123456:-2:2 1212123456:-3:3 1213100000:-3:0 1214100000:0:0 1215100000:1:0 1216&mantissa 1217abc:NaN 12181e4:1 12192e0:2 1220123:123 1221-1:-1 1222-2:-2 1223+inf:inf 1224-inf:-inf 1225&exponent 1226abc:NaN 12271e4:4 12282e0:0 1229123:0 1230-1:0 1231-2:0 12320:1 1233+inf:inf 1234-inf:inf 1235&parts 1236abc:NaN,NaN 12371e4:1,4 12382e0:2,0 1239123:123,0 1240-1:-1,0 1241-2:-2,0 12420:0,1 1243+inf:inf,inf 1244-inf:-inf,inf 1245&bfac 1246-1:NaN 1247NaNfac:NaN 1248+inf:inf 1249-inf:NaN 12500:1 12511:1 12522:2 12533:6 12544:24 12555:120 12566:720 125710:3628800 125811:39916800 125912:479001600 1260&bpow 1261abc:12:NaN 126212:abc:NaN 12630:0:1 12640:1:0 12650:2:0 12660:-1:inf 12670:-2:inf 12681:0:1 12691:1:1 12701:2:1 12711:3:1 12721:-1:1 12731:-2:1 12741:-3:1 12752:0:1 12762:1:2 12772:2:4 12782:3:8 12793:3:27 12802:-1:NaN 1281-2:-1:NaN 12822:-2:NaN 1283-2:-2:NaN 1284+inf:1234500012:inf 1285-inf:1234500012:inf 1286-inf:1234500013:-inf 1287+inf:-12345000123:inf 1288-inf:-12345000123:-inf 1289# 1 ** -x => 1 / (1 ** x) 1290-1:0:1 1291-2:0:1 1292-1:1:-1 1293-1:2:1 1294-1:3:-1 1295-1:4:1 1296-1:5:-1 1297-1:-1:-1 1298-1:-2:1 1299-1:-3:-1 1300-1:-4:1 1301-2:2:4 1302-2:3:-8 1303-2:4:16 1304-2:5:-32 1305-3:2:9 1306-3:3:-27 1307-3:4:81 1308-3:5:-243 130910:2:100 131010:3:1000 131110:4:10000 131210:5:100000 131310:6:1000000 131410:7:10000000 131510:8:100000000 131610:9:1000000000 131710:20:100000000000000000000 1318123456:2:15241383936 1319#2:0.5:1.41^ 1320&length 1321100:3 132210:2 13231:1 13240:1 132512345:5 132610000000000000000:17 1327-123:3 1328215960156869840440586892398248:30 1329# broot always upgrades 1330&broot 1331144:2:12^ 1332123:2:11.09053650640941716205160010260993291846^ 1333# bsqrt always upgrades 1334&bsqrt 1335145:12.04159457879229548012824103037860805243^ 1336144:12^ 1337143:11.95826074310139802112984075619561661399^ 133816:4 1339170:13.03840481040529742916594311485836883306^ 1340169:13 1341168:12.96148139681572046193193487217599331541^ 13424:2 13433:1.732050807568877293527446341505872366943^ 13442:1.41421356237309504880168872420969807857^ 13459:3 134612:3.464101615137754587054892683011744733886^ 1347256:16 1348100000000:10000 13494000000000000:2000000 1350152399026:12345.00004050222755607815159966235881398^ 1351152399025:12345 1352152399024:12344.99995949777231103967404745303741942^ 13531:1 13540:0 1355-2:NaN 1356-123:NaN 1357Nan:NaN 1358+inf:inf 1359-inf:NaN 1360&bround 1361$round_mode('trunc') 13620:12:0 1363NaNbround:12:NaN 1364+inf:12:inf 1365-inf:12:-inf 13661234:0:1234 13671234:2:1200 1368123456:4:123400 1369123456:5:123450 1370123456:6:123456 1371+10123456789:5:10123000000 1372-10123456789:5:-10123000000 1373+10123456789:9:10123456700 1374-10123456789:9:-10123456700 1375+101234500:6:101234000 1376-101234500:6:-101234000 1377#+101234500:-4:101234000 1378#-101234500:-4:-101234000 1379$round_mode('zero') 1380+20123456789:5:20123000000 1381-20123456789:5:-20123000000 1382+20123456789:9:20123456800 1383-20123456789:9:-20123456800 1384+201234500:6:201234000 1385-201234500:6:-201234000 1386#+201234500:-4:201234000 1387#-201234500:-4:-201234000 1388+12345000:4:12340000 1389-12345000:4:-12340000 1390$round_mode('+inf') 1391+30123456789:5:30123000000 1392-30123456789:5:-30123000000 1393+30123456789:9:30123456800 1394-30123456789:9:-30123456800 1395+301234500:6:301235000 1396-301234500:6:-301234000 1397#+301234500:-4:301235000 1398#-301234500:-4:-301234000 1399+12345000:4:12350000 1400-12345000:4:-12340000 1401$round_mode('-inf') 1402+40123456789:5:40123000000 1403-40123456789:5:-40123000000 1404+40123456789:9:40123456800 1405-40123456789:9:-40123456800 1406+401234500:6:401234000 1407+401234500:6:401234000 1408#-401234500:-4:-401235000 1409#-401234500:-4:-401235000 1410+12345000:4:12340000 1411-12345000:4:-12350000 1412$round_mode('odd') 1413+50123456789:5:50123000000 1414-50123456789:5:-50123000000 1415+50123456789:9:50123456800 1416-50123456789:9:-50123456800 1417+501234500:6:501235000 1418-501234500:6:-501235000 1419#+501234500:-4:501235000 1420#-501234500:-4:-501235000 1421+12345000:4:12350000 1422-12345000:4:-12350000 1423$round_mode('even') 1424+60123456789:5:60123000000 1425-60123456789:5:-60123000000 1426+60123456789:9:60123456800 1427-60123456789:9:-60123456800 1428+601234500:6:601234000 1429-601234500:6:-601234000 1430#+601234500:-4:601234000 1431#-601234500:-4:-601234000 1432#-601234500:-9:0 1433#-501234500:-9:0 1434#-601234500:-8:0 1435#-501234500:-8:0 1436+1234567:7:1234567 1437+1234567:6:1234570 1438+12345000:4:12340000 1439-12345000:4:-12340000 1440&is_zero 14410:1 1442NaNzero:0 1443+inf:0 1444-inf:0 1445123:0 1446-1:0 14471:0 1448&is_one 14490:0 1450NaNone:0 1451+inf:0 1452-inf:0 14531:1 14542:0 1455-1:0 1456-2:0 1457# floor and ceil tests are pretty pointless in integer space...but play safe 1458&bfloor 14590:0 1460NaNfloor:NaN 1461+inf:inf 1462-inf:-inf 1463-1:-1 1464-2:-2 14652:2 14663:3 1467abc:NaN 1468&bceil 1469NaNceil:NaN 1470+inf:inf 1471-inf:-inf 14720:0 1473-1:-1 1474-2:-2 14752:2 14763:3 1477abc:NaN 1478&as_hex 1479128:0x80 1480-128:-0x80 14810:0x0 1482-0:0x0 14831:0x1 14840x123456789123456789:0x123456789123456789 1485+inf:inf 1486-inf:-inf 1487NaNas_hex:NaN 1488&as_bin 1489128:0b10000000 1490-128:-0b10000000 14910:0b0 1492-0:0b0 14931:0b1 14940b1010111101010101010110110110110110101:0b1010111101010101010110110110110110101 1495+inf:inf 1496-inf:-inf 1497NaNas_bin:NaN 1498