1# include this file into another for subclass testing 2 3# This file is nearly identical to bigintpm.t, except that certain results are 4# _requird_ to be different due to "upgrading" or "promoting" to 5# Math::BigFloat. The reverse is not true. Any unmarked results can be either 6# Math::BigInt or Math::BigFloat, depending on how good the internal 7# optimization is (e.g., it is usually desirable to have 2 ** 2 return a 8# Math::BigInt, not a Math::BigFloat). 9 10# Results that are required to be Math::BigFloat are marked with C<^> at the 11# end. 12 13# Please note that the testcount goes up by two for each extra result marked 14# with ^, since then we test whether it has the proper class and that it left 15# the upgrade variable alone. 16 17use strict; 18use warnings; 19 20our ($CLASS, $LIB, $EXPECTED_CLASS); 21 22############################################################################## 23# for testing inheritance of _swap 24 25package Math::Foo; 26 27use Math::BigInt lib => $main::LIB; 28our @ISA = ('Math::BigInt'); 29 30use overload 31 # customized overload for sub, since original does not use swap there 32 '-' => sub { my @a = ref($_[0])->_swap(@_); 33 $a[0]->bsub($a[1]); 34 }; 35 36sub _swap { 37 # a fake _swap, which reverses the params 38 my $self = shift; # for override in subclass 39 if ($_[2]) { 40 my $c = ref ($_[0] ) || 'Math::Foo'; 41 return ( $_[0]->copy(), $_[1] ); 42 } else { 43 return ( Math::Foo->new($_[1]), $_[0] ); 44 } 45} 46 47############################################################################## 48package main; 49 50is($CLASS->config('lib'), $LIB, "$CLASS->config('lib')"); 51 52my ($x, $y, $z, @args, $a, $m, $e, $try, $got, $want, $exp); 53my ($f, $round_mode, $expected_class); 54 55while (<DATA>) { 56 s/#.*$//; # remove comments 57 s/\s+$//; # remove trailing whitespace 58 next unless length; # skip empty lines 59 60 if (s/^&//) { 61 $f = $_; 62 next; 63 } 64 65 if (/^\$/) { 66 $round_mode = $_; 67 $round_mode =~ s/^\$/$CLASS\->/; 68 next; 69 } 70 71 @args = split(/:/, $_, 99); 72 $want = pop(@args); 73 $expected_class = $CLASS; 74 75 if ($want =~ /\^$/) { 76 $expected_class = $EXPECTED_CLASS; 77 $want =~ s/\^$//; 78 } 79 80 $try = qq|\$x = $CLASS->new("$args[0]");|; 81 if ($f eq "bnorm") { 82 $try = qq|\$x = $CLASS->bnorm("$args[0]");|; 83 } elsif ($f =~ /^is_(zero|one|odd|even||(non_)?(negative|positive)|nan|int)$/) { 84 $try .= " \$x->$f();"; 85 } elsif ($f =~ /^(to|as)_(hex|oct|bin)$/) { 86 $try .= " \$x->$f();"; 87 } elsif ($f eq "is_inf") { 88 $try .= " \$x->is_inf('$args[1]');"; 89 } elsif ($f eq "binf") { 90 $try .= " \$x->binf('$args[1]');"; 91 } elsif ($f eq "bone") { 92 $try .= " \$x->bone('$args[1]');"; 93 # some unary ops 94 } elsif ($f =~ /^b(nan|floor|ceil|int|sstr|neg|abs|inc|dec|not|sqrt)$/) { 95 $try .= " \$x->$f();"; 96 } elsif ($f eq "length") { 97 $try .= ' $x->length();'; 98 } elsif ($f eq "exponent") { 99 # ->bstr() to see if an object is returned 100 $try .= ' $x = $x->exponent()->bstr();'; 101 } elsif ($f eq "mantissa") { 102 # ->bstr() to see if an object is returned 103 $try .= ' $x = $x->mantissa()->bstr();'; 104 } elsif ($f eq "parts") { 105 $try .= ' ($m, $e) = $x->parts();'; 106 # ->bstr() to see if an object is returned 107 $try .= ' $m = $m->bstr(); $m = "NaN" if !defined $m;'; 108 $try .= ' $e = $e->bstr(); $e = "NaN" if !defined $e;'; 109 $try .= ' "$m,$e";'; 110 } else { 111 if ($args[1] !~ /\./) { 112 $try .= qq| \$y = $CLASS->new("$args[1]");|; 113 } else { 114 $try .= qq| \$y = $EXPECTED_CLASS->new("$args[1]");|; 115 } 116 if ($f eq "bcmp") { 117 $try .= ' $x->bcmp($y);'; 118 } elsif ($f eq "bacmp") { 119 $try .= ' $x->bacmp($y);'; 120 } elsif ($f eq "bround") { 121 $try .= " $round_mode; \$x->bround(\$y);"; 122 } elsif ($f eq "broot") { 123 $try .= " \$x->broot(\$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 if (defined $args[2]) { 144 $try .= qq| \$z = $CLASS->new("$args[2]");|; 145 } 146 $try .= " $CLASS\::bgcd(\$x, \$y"; 147 $try .= ", \$z" if defined $args[2]; 148 $try .= ");"; 149 } elsif ($f eq "blcm") { 150 if (defined $args[2]) { 151 $try .= qq| \$z = $CLASS->new("$args[2]");|; 152 } 153 $try .= " $CLASS\::blcm(\$x, \$y"; 154 $try .= ", \$z" if defined $args[2]; 155 $try .= ");"; 156 } elsif ($f eq "blsft") { 157 if (defined $args[2]) { 158 $try .= " \$x->blsft(\$y, $args[2]);"; 159 } else { 160 $try .= " \$x << \$y;"; 161 } 162 } elsif ($f eq "brsft") { 163 if (defined $args[2]) { 164 $try .= " \$x->brsft(\$y, $args[2]);"; 165 } else { 166 $try .= " \$x >> \$y;"; 167 } 168 } elsif ($f eq "band") { 169 $try .= " \$x & \$y;"; 170 } elsif ($f eq "bior") { 171 $try .= " \$x | \$y;"; 172 } elsif ($f eq "bxor") { 173 $try .= " \$x ^ \$y;"; 174 } elsif ($f eq "bpow") { 175 $try .= " \$x ** \$y;"; 176 } elsif ($f eq "digit") { 177 $try = qq|\$x = $CLASS->new("$args[0]"); \$x->digit($args[1]);|; 178 } else { 179 warn "Unknown op '$f'"; 180 } 181 } # end else all other ops 182 183 $got = eval $try; 184 print "# Error: $@\n" if $@; 185 186 # convert hex/binary targets to decimal 187 if ($want =~ /^(0x0x|0b0b)/) { 188 $want =~ s/^0[xb]//; 189 $want = Math::BigInt->new($want)->bstr(); 190 } 191 if ($want eq "") { 192 is($got, undef, $try); 193 } else { 194 # print "try: $try ans: $got $want\n"; 195 is($got, $want, $try); 196 if ($expected_class ne $CLASS) { 197 is(ref($got), $expected_class, 'ref($got)'); 198 is($Math::BigInt::upgrade, 'Math::BigFloat', 199 '$Math::BigInt::upgrade'); 200 } 201 } 202 # check internal state of number objects 203 is_valid($got, $f) if ref $got; 204} # endwhile data tests 205close DATA; 206 207my $warn = ''; 208$SIG{__WARN__} = sub { $warn = shift; }; 209 210# these should not warn 211 212$warn = ''; 213eval '$z = 3.17 <= $y'; 214is($z, 1, '$z = 3.17 <= $y'); 215is($warn, '', 'the code "$z = 3.17 <= $y" issued no warning'); 216 217$warn = ''; 218eval '$z = $y >= 3.17'; 219is($z, 1, '$z = $y >= 3.17'); 220is($warn, '', 'the code "$z = $y >= 3.17" issued no warning'); 221 222# all tests done 223 2241; 225 226############################################################################### 227# sub to check validity of a Math::BigInt internally, to ensure that no op 228# leaves a number object in an invalid state (f.i. "-0") 229 230sub is_valid { 231 my ($x, $f, $c) = @_; 232 233 # The checks here are loosened a bit to allow Math::BigInt or 234 # Math::BigFloat objects to pass 235 236 my $e = 0; # error? 237 238 # ok as reference? 239 # $e = "Not a reference to $c" if (ref($x) || '') ne $c; 240 241 # has ok sign? 242 $e = "Illegal sign $x->{sign} (expected: '+', '-', '-inf', '+inf' or 'NaN'" 243 if $e eq '0' && $x->{sign} !~ /^(\+|-|\+inf|-inf|NaN)$/; 244 245 $e = "-0 is invalid!" if $e ne '0' && $x->{sign} eq '-' && $x == 0; 246 #$e = $LIB->_check($x->{value}) if $e eq '0'; 247 248 # test done, see if error did crop up 249 if ($e eq '0') { 250 pass('is a valid object'); 251 return; 252 } 253 254 fail($e . " after op '$f'"); 255} 256 257__DATA__ 258 259&.= 2601234:-345:1234-345 261 262&+= 2631:2:3 264-1:-2:-3 265 266&-= 2671:2:-1 268-1:-2:1 269 270&*= 2712:3:6 272-1:5:-5 273 274&%= 275100:3:1 2768:9:8 277 278&/= 279100:3:33.33333333333333333333333333333333333333 280-8:2:-4 281 282&|= 2832:1:3 284 285&&= 2865:7:5 287 288&^= 2895:7:2 290 291&is_negative 2920:0 293-1:1 2941:0 295+inf:0 296-inf:1 297NaNneg:0 298 299&is_positive 3000:0 301-1:0 3021:1 303+inf:1 304-inf:0 305NaNneg:0 306 307&is_non_negative 3080:1 309-1:0 3101:1 311+inf:1 312-inf:0 313NaN:0 314 315&is_non_positive 3160:1 317-1:1 3181:0 319+inf:0 320-inf:1 321NaN:0 322 323&is_odd 324abc:0 3250:0 3261:1 3273:1 328-1:1 329-3:1 33010000001:1 33110000002:0 3322:0 333120:0 334121:1 335 336&is_int 337NaN:0 338inf:0 339-inf:0 3401:1 34112:1 342123e12:1 343 344&is_even 345abc:0 3460:1 3471:0 3483:0 349-1:0 350-3:0 35110000001:0 35210000002:1 3532:1 354120:1 355121:0 356 357&bacmp 358+0:-0:0 359+0:+1:-1 360-1:+1:0 361+1:-1:0 362-1:+2:-1 363+2:-1:1 364-123456789:+987654321:-1 365+123456789:-987654321:-1 366+987654321:+123456789:1 367-987654321:+123456789:1 368-123:+4567889:-1 369# NaNs 370acmpNaN:123: 371123:acmpNaN: 372acmpNaN:acmpNaN: 373# infinity 374+inf:+inf:0 375-inf:-inf:0 376+inf:-inf:0 377-inf:+inf:0 378+inf:123:1 379-inf:123:1 380+inf:-123:1 381-inf:-123:1 382# return undef 383+inf:NaN: 384NaN:inf: 385-inf:NaN: 386NaN:-inf: 387 388&bnorm 389123:123 39012.3:12.3^ 391# binary input 3920babc:NaN 3930b123:NaN 3940b0:0 395-0b0:0 396-0b1:-1 3970b0001:1 3980b001:1 3990b011:3 4000b101:5 4010b1001:9 4020b10001:17 4030b100001:33 4040b1000001:65 4050b10000001:129 4060b100000001:257 4070b1000000001:513 4080b10000000001:1025 4090b100000000001:2049 4100b1000000000001:4097 4110b10000000000001:8193 4120b100000000000001:16385 4130b1000000000000001:32769 4140b10000000000000001:65537 4150b100000000000000001:131073 4160b1000000000000000001:262145 4170b10000000000000000001:524289 4180b100000000000000000001:1048577 4190b1000000000000000000001:2097153 4200b10000000000000000000001:4194305 4210b100000000000000000000001:8388609 4220b1000000000000000000000001:16777217 4230b10000000000000000000000001:33554433 4240b100000000000000000000000001:67108865 4250b1000000000000000000000000001:134217729 4260b10000000000000000000000000001:268435457 4270b100000000000000000000000000001:536870913 4280b1000000000000000000000000000001:1073741825 4290b10000000000000000000000000000001:2147483649 4300b100000000000000000000000000000001:4294967297 4310b1000000000000000000000000000000001:8589934593 4320b10000000000000000000000000000000001:17179869185 4330b1_0_1:5 4340b0_0_0_1:1 435# hex input 436-0x0:0 4370xabcdefgh:NaN 4380x1234:4660 4390xabcdef:11259375 440-0xABCDEF:-11259375 441-0x1234:-4660 4420x12345678:305419896 4430x1_2_3_4_56_78:305419896 4440xa_b_c_d_e_f:11259375 4450x9:9 4460x11:17 4470x21:33 4480x41:65 4490x81:129 4500x101:257 4510x201:513 4520x401:1025 4530x801:2049 4540x1001:4097 4550x2001:8193 4560x4001:16385 4570x8001:32769 4580x10001:65537 4590x20001:131073 4600x40001:262145 4610x80001:524289 4620x100001:1048577 4630x200001:2097153 4640x400001:4194305 4650x800001:8388609 4660x1000001:16777217 4670x2000001:33554433 4680x4000001:67108865 4690x8000001:134217729 4700x10000001:268435457 4710x20000001:536870913 4720x40000001:1073741825 4730x80000001:2147483649 4740x100000001:4294967297 4750x200000001:8589934593 4760x400000001:17179869185 4770x800000001:34359738369 478# inf input 479inf:inf 480+inf:inf 481-inf:-inf 4820inf:NaN 483# abnormal input 484:NaN 485abc:NaN 486 1 a:NaN 4871bcd2:NaN 48811111b:NaN 489+1z:NaN 490-1z:NaN 491# only one underscore between two digits 492_123:NaN 493_123_:NaN 4941E_12:NaN 4951_E_12:NaN 496+_1E12:NaN 497+0_1E2:100 498+0_0_1E2:100 499-0_0_1E2:-100 500-0_0_1E+0_0_2:-100 501E1:NaN 502E23:NaN 5031.23E1:12.3^ 5041.23E-1:0.123^ 505# bug with two E's in number being valid 5061e2e3:NaN 5071e2r:NaN 5081e2.0:NaN 509# leading zeros 510012:12 5110123:123 51201234:1234 513012345:12345 5140123456:123456 51501234567:1234567 516012345678:12345678 5170123456789:123456789 51801234567891:1234567891 519012345678912:12345678912 5200123456789123:123456789123 52101234567891234:1234567891234 522# normal input 5230:0 524+0:0 525+00:0 526+000:0 527000000000000000000:0 528-0:0 529-0000:0 530+1:1 531+01:1 532+001:1 533+00000100000:100000 534123456789:123456789 535-1:-1 536-01:-1 537-001:-1 538-123456789:-123456789 539-00000100000:-100000 5401_2_3:123 54110000000000E-1_0:1 5421E2:100 5431E1:10 5441E0:1 5451.23E2:123 546100E-1:10 547# floating point input 548# .2e2:20 5491.E3:1000 5501.01E2:101 5511010E-1:101 552-1010E0:-1010 553-1010E1:-10100 5541234.00:1234 555# non-integer numbers 556-1010E-2:-10.1^ 557-1.01E+1:-10.1^ 558-1.01E-1:-0.101^ 559 560&bnan 5611:NaN 5622:NaN 563abc:NaN 564 565&bone 5662:+:1 5672:-:-1 568boneNaN:-:-1 569boneNaN:+:1 5702:abc:1 5713::1 572 573&binf 5741:+:inf 5752:-:-inf 5763:+inf:inf 577 578&is_nan 579123:0 580abc:1 581NaN:1 582-123:0 583 584&is_inf 585+inf::1 586-inf::1 587abc::0 5881::0 589NaN::0 590-1::0 591+inf:-:0 592+inf:+:1 593-inf:-:1 594-inf:+:0 595+iNfInItY::1 596-InFiNiTy::1 597 598&blsft 599abc:abc:NaN 600+2:+2:8 601+1:+32:4294967296 602+1:+48:281474976710656 603+8:-2:NaN 604# exercise base 10 605+12345:4:10:123450000 606-1234:0:10:-1234 607+1234:0:10:1234 608+2:2:10:200 609+12:2:10:1200 610+1234:-3:10:NaN 6111234567890123:12:10:1234567890123000000000000 612 613&brsft 614abc:abc:NaN 615+8:+2:2 616+4294967296:+32:1 617+281474976710656:+48:1 618+2:-2:NaN 619# exercise base 10 620-1234:0:10:-1234 621+1234:0:10:1234 622+200:2:10:2 623+1234:3:10:1.234 624+1234:2:10:12.34 625+1234:-3:10:NaN 626310000:4:10:31 62712300000:5:10:123 6281230000000000:10:10:123 62909876123456789067890:12:10:9876123.45678906789 6301234561234567890123:13:10:123456.1234567890123 631 632&bsstr 6331e+34:1e+34 634123.456E3:123456e+0 635100:1e+2 636abc:NaN 637 638&bneg 639bnegNaN:NaN 640+inf:-inf 641-inf:inf 642abd:NaN 6430:0 6441:-1 645-1:1 646+123456789:-123456789 647-123456789:123456789 648 649&babs 650babsNaN:NaN 651+inf:inf 652-inf:inf 6530:0 6541:1 655-1:1 656+123456789:123456789 657-123456789:123456789 658 659&bcmp 660bcmpNaN:bcmpNaN: 661bcmpNaN:0: 6620:bcmpNaN: 6630:0:0 664-1:0:-1 6650:-1:1 6661:0:1 6670:1:-1 668-1:1:-1 6691:-1:1 670-1:-1:0 6711:1:0 672123:123:0 673123:12:1 67412:123:-1 675-123:-123:0 676-123:-12:-1 677-12:-123:1 678123:124:-1 679124:123:1 680-123:-124:1 681-124:-123:-1 682100:5:1 683-123456789:987654321:-1 684+123456789:-987654321:1 685-987654321:123456789:-1 686-inf:5432112345:-1 687+inf:5432112345:1 688-inf:-5432112345:-1 689+inf:-5432112345:1 690+inf:+inf:0 691-inf:-inf:0 692+inf:-inf:1 693-inf:+inf:-1 6945:inf:-1 6955:inf:-1 696-5:-inf:1 697-5:-inf:1 698# return undef 699+inf:NaN: 700NaN:inf: 701-inf:NaN: 702NaN:-inf: 703 704&binc 705abc:NaN 706+inf:inf 707-inf:-inf 708+0:1 709+1:2 710-1:0 711 712&bdec 713abc:NaN 714+inf:inf 715-inf:-inf 716+0:-1 717+1:0 718-1:-2 719 720&badd 721abc:abc:NaN 722abc:0:NaN 723+0:abc:NaN 724+inf:-inf:NaN 725-inf:+inf:NaN 726+inf:+inf:inf 727-inf:-inf:-inf 728baddNaN:+inf:NaN 729baddNaN:+inf:NaN 730+inf:baddNaN:NaN 731-inf:baddNaN:NaN 7320:0:0 7331:0:1 7340:1:1 7351:1:2 736-1:0:-1 7370:-1:-1 738-1:-1:-2 739-1:+1:0 740+1:-1:0 741+9:+1:10 742+99:+1:100 743+999:+1:1000 744+9999:+1:10000 745+99999:+1:100000 746+999999:+1:1000000 747+9999999:+1:10000000 748+99999999:+1:100000000 749+999999999:+1:1000000000 750+9999999999:+1:10000000000 751+99999999999:+1:100000000000 752+10:-1:9 753+100:-1:99 754+1000:-1:999 755+10000:-1:9999 756+100000:-1:99999 757+1000000:-1:999999 758+10000000:-1:9999999 759+100000000:-1:99999999 760+1000000000:-1:999999999 761+10000000000:-1:9999999999 762+123456789:987654321:1111111110 763-123456789:987654321:864197532 764-123456789:-987654321:-1111111110 765+123456789:-987654321:-864197532 7662:2.5:4.5^ 767-123:-1.5:-124.5^ 768-1.2:1:-0.2^ 769 770&bsub 771abc:abc:NaN 772abc:+0:NaN 773+0:abc:NaN 774+inf:-inf:inf 775-inf:+inf:-inf 776+inf:+inf:NaN 777-inf:-inf:NaN 778+0:+0:0 779+1:+0:1 780+0:+1:-1 781+1:+1:0 782-1:+0:-1 783+0:-1:1 784-1:-1:0 785-1:+1:-2 786+1:-1:2 787+9:+1:8 788+99:+1:98 789+999:+1:998 790+9999:+1:9998 791+99999:+1:99998 792+999999:+1:999998 793+9999999:+1:9999998 794+99999999:+1:99999998 795+999999999:+1:999999998 796+9999999999:+1:9999999998 797+99999999999:+1:99999999998 798+10:-1:11 799+100:-1:101 800+1000:-1:1001 801+10000:-1:10001 802+100000:-1:100001 803+1000000:-1:1000001 804+10000000:-1:10000001 805+100000000:-1:100000001 806+1000000000:-1:1000000001 807+10000000000:-1:10000000001 808+123456789:+987654321:-864197532 809-123456789:+987654321:-1111111110 810-123456789:-987654321:864197532 811+123456789:-987654321:1111111110 812 813&bmul 814abc:abc:NaN 815abc:+0:NaN 816+0:abc:NaN 817NaNmul:+inf:NaN 818NaNmul:-inf:NaN 819-inf:NaNmul:NaN 820+inf:NaNmul:NaN 821+inf:+inf:inf 822+inf:-inf:-inf 823-inf:+inf:-inf 824-inf:-inf:inf 825+0:+0:0 826+0:+1:0 827+1:+0:0 828+0:-1:0 829-1:+0:0 830123456789123456789:0:0 8310:123456789123456789:0 832-1:-1:1 833-1:+1:-1 834+1:-1:-1 835+1:+1:1 836+2:+3:6 837-2:+3:-6 838+2:-3:-6 839-2:-3:6 840111:111:12321 84110101:10101:102030201 8421001001:1001001:1002003002001 843100010001:100010001:10002000300020001 84410000100001:10000100001:100002000030000200001 84511111111111:9:99999999999 84622222222222:9:199999999998 84733333333333:9:299999999997 84844444444444:9:399999999996 84955555555555:9:499999999995 85066666666666:9:599999999994 85177777777777:9:699999999993 85288888888888:9:799999999992 85399999999999:9:899999999991 854+25:+25:625 855+12345:+12345:152399025 856+99999:+11111:1111088889 8579999:10000:99990000 85899999:100000:9999900000 859999999:1000000:999999000000 8609999999:10000000:99999990000000 86199999999:100000000:9999999900000000 862999999999:1000000000:999999999000000000 8639999999999:10000000000:99999999990000000000 86499999999999:100000000000:9999999999900000000000 865999999999999:1000000000000:999999999999000000000000 8669999999999999:10000000000000:99999999999990000000000000 86799999999999999:100000000000000:9999999999999900000000000000 868999999999999999:1000000000000000:999999999999999000000000000000 8699999999999999999:10000000000000000:99999999999999990000000000000000 87099999999999999999:100000000000000000:9999999999999999900000000000000000 871999999999999999999:1000000000000000000:999999999999999999000000000000000000 8729999999999999999999:10000000000000000000:99999999999999999990000000000000000000 8733:3.5:10.5^ 8743.5:3:10.5^ 875 876&bdiv-list 877100:20:5,0 8784095:4095:1,0 879-4095:-4095:1,0 8804095:-4095:-1,0 881-4095:4095:-1,0 882123:2:61,1 8839:5:1,4 8849:4:2,1 885# inf handling and general remainder 8865:8:0,5 8870:8:0,0 88811:2:5,1 88911:-2:-6,-1 890-11:2:-6,1 891# see table in documentation in MBI 8920:inf:0,0 8930:-inf:0,0 8945:inf:0,5 8955:-inf:-1,-inf 896-5:inf:-1,inf 897-5:-inf:0,-5 898inf:5:inf,NaN 899-inf:5:-inf,NaN 900inf:-5:-inf,NaN 901-inf:-5:inf,NaN 9025:5:1,0 903-5:-5:1,0 904inf:inf:NaN,NaN 905-inf:-inf:NaN,NaN 906-inf:inf:NaN,NaN 907inf:-inf:NaN,NaN 9088:0:inf,8 909inf:0:inf,inf 910# exceptions to remainder rule 911-8:0:-inf,-8 912-inf:0:-inf,-inf 9130:0:NaN,0 914 915&bdiv 916abc:abc:NaN 917abc:1:NaN 9181:abc:NaN 9190:0:NaN 920# inf handling (see table in doc) 9210:inf:0 9220:-inf:0 9235:inf:0 9245:-inf:-1 925-5:inf:-1 926-5:-inf:0 927inf:5:inf 928-inf:5:-inf 929inf:-5:-inf 930-inf:-5:inf 9315:5:1 932-5:-5:1 933inf:inf:NaN 934-inf:-inf:NaN 935-inf:inf:NaN 936inf:-inf:NaN 9378:0:inf 938inf:0:inf 939-8:0:-inf 940-inf:0:-inf 94111:2:5.5^ 942-11:-2:5.5^ 943-11:2:-5.5^ 94411:-2:-5.5^ 9450:1:0 9460:-1:0 9471:1:1 948-1:-1:1 9491:-1:-1 950-1:1:-1 9511:2:0.5^ 9522:1:2 9531000000000:9:111111111.1111111111111111111111111111111^ 9542000000000:9:222222222.2222222222222222222222222222222^ 9553000000000:9:333333333.3333333333333333333333333333333^ 9564000000000:9:444444444.4444444444444444444444444444444^ 9575000000000:9:555555555.5555555555555555555555555555556^ 9586000000000:9:666666666.6666666666666666666666666666667^ 9597000000000:9:777777777.7777777777777777777777777777778^ 9608000000000:9:888888888.8888888888888888888888888888889^ 9619000000000:9:1000000000 96235500000:113:314159.2920353982300884955752212389380531^ 96371000000:226:314159.2920353982300884955752212389380531^ 964106500000:339:314159.2920353982300884955752212389380531^ 9651000000000:3:333333333.3333333333333333333333333333333^ 966+10:+5:2 967+100:+4:25 968+1000:+8:125 969+10000:+16:625 970999999999999:9:111111111111 971999999999999:99:10101010101 972999999999999:999:1001001001 973999999999999:9999:100010001 974999999999999999:99999:10000100001 975+1111088889:99999:11111 976-5:-3:1.666666666666666666666666666666666666667^ 977-5:3:-1.666666666666666666666666666666666666667^ 9784:3:1.333333333333333333333333333333333333333^ 9794:-3:-1.333333333333333333333333333333333333333^ 9801:3:0.3333333333333333333333333333333333333333^ 9811:-3:-0.3333333333333333333333333333333333333333^ 982-2:-3:0.6666666666666666666666666666666666666667^ 983-2:3:-0.6666666666666666666666666666666666666667^ 9848:5:1.6^ 985-8:5:-1.6^ 98614:-3:-4.666666666666666666666666666666666666667^ 987-14:3:-4.666666666666666666666666666666666666667^ 988-14:-3:4.666666666666666666666666666666666666667^ 98914:3:4.666666666666666666666666666666666666667^ 990# bug in Calc with '99999' vs $BASE-1 991#10000000000000000000000000000000000000000000000000000000000000000000000000000000000:10000000375084540248994272022843165711074:999999962491547381984643365663244474111576 99212:24:0.5^ 993 994&bmod 995# inf handling, see table in doc 9960:inf:0 9970:-inf:0 9985:inf:5 9995:-inf:-inf 1000-5:inf:inf 1001-5:-inf:-5 1002inf:5:NaN 1003-inf:5:NaN 1004inf:-5:NaN 1005-inf:-5:NaN 10065:5:0 1007-5:-5:0 1008inf:inf:NaN 1009-inf:-inf:NaN 1010-inf:inf:NaN 1011inf:-inf:NaN 10128:0:8 1013inf:0:inf 1014-inf:0:-inf 1015-8:0:-8 10160:0:0 1017abc:abc:NaN 1018abc:1:abc:NaN 10191:abc:NaN 10200:1:0 10211:0:1 10220:-1:0 1023-1:0:-1 10241:1:0 1025-1:-1:0 10261:-1:0 1027-1:1:0 10281:2:1 10292:1:0 10301000000000:9:1 10312000000000:9:2 10323000000000:9:3 10334000000000:9:4 10345000000000:9:5 10356000000000:9:6 10367000000000:9:7 10378000000000:9:8 10389000000000:9:0 103935500000:113:33 104071000000:226:66 1041106500000:339:99 10421000000000:3:1 104310:5:0 1044100:4:0 10451000:8:0 104610000:16:0 1047999999999999:9:0 1048999999999999:99:0 1049999999999999:999:0 1050999999999999:9999:0 1051999999999999999:99999:0 1052-9:+5:1 1053+9:-5:-1 1054-9:-5:-4 1055-5:3:1 1056-2:3:1 10574:3:1 10581:3:1 1059-5:-3:-2 1060-2:-3:-2 10614:-3:-2 10621:-3:-2 10634095:4095:0 1064100041000510123:3:0 1065152403346:12345:4321 10669:5:4 1067 1068&bgcd 1069abc:abc:NaN 1070abc:+0:NaN 1071+0:abc:NaN 1072+0:+0:0 1073+0:+1:1 1074+1:+0:1 1075+1:+1:1 1076+2:+3:1 1077+3:+2:1 1078-3:+2:1 1079100:625:25 10804096:81:1 10811034:804:2 108227:90:56:1 108327:90:54:9 1084 1085&blcm 1086abc:abc:NaN 1087abc:+0:NaN 1088+0:abc:NaN 1089+0:+0:0 1090+1:+0:0 1091+0:+1:0 1092+27:+90:270 1093+1034:+804:415668 1094 1095&band 1096abc:abc:NaN 1097abc:0:NaN 10980:abc:NaN 10991:2:0 11003:2:2 1101+8:+2:0 1102+281474976710656:0:0 1103+281474976710656:1:0 1104+281474976710656:+281474976710656:281474976710656 1105-2:-3:-4 1106-1:-1:-1 1107-6:-6:-6 1108-7:-4:-8 1109-7:4:0 1110-4:7:4 1111# equal arguments are treated special, so also do some test with unequal ones 11120xFFFF:0xFFFF:0x0xFFFF 11130xFFFFFF:0xFFFFFF:0x0xFFFFFF 11140xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF 11150xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF 11160xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF 11170xF0F0:0xF0F0:0x0xF0F0 11180x0F0F:0x0F0F:0x0x0F0F 11190xF0F0F0:0xF0F0F0:0x0xF0F0F0 11200x0F0F0F:0x0F0F0F:0x0x0F0F0F 11210xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0 11220x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F 11230xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0 11240x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F 11250xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0 11260x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F 11270x1F0F0F0F0F0F:0x3F0F0F0F0F0F:0x0x1F0F0F0F0F0F 1128 1129&bior 1130abc:abc:NaN 1131abc:0:NaN 11320:abc:NaN 11331:2:3 1134+8:+2:10 1135+281474976710656:0:281474976710656 1136+281474976710656:1:281474976710657 1137+281474976710656:281474976710656:281474976710656 1138-2:-3:-1 1139-1:-1:-1 1140-6:-6:-6 1141-7:4:-3 1142-4:7:-1 1143# equal arguments are treated special, so also do some test with unequal ones 11440xFFFF:0xFFFF:0x0xFFFF 11450xFFFFFF:0xFFFFFF:0x0xFFFFFF 11460xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF 11470xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF 11480xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF 11490:0xFFFF:0x0xFFFF 11500:0xFFFFFF:0x0xFFFFFF 11510:0xFFFFFFFF:0x0xFFFFFFFF 11520:0xFFFFFFFFFF:0x0xFFFFFFFFFF 11530:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF 11540xFFFF:0:0x0xFFFF 11550xFFFFFF:0:0x0xFFFFFF 11560xFFFFFFFF:0:0x0xFFFFFFFF 11570xFFFFFFFFFF:0:0x0xFFFFFFFFFF 11580xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF 11590xF0F0:0xF0F0:0x0xF0F0 11600x0F0F:0x0F0F:0x0x0F0F 11610xF0F0:0x0F0F:0x0xFFFF 11620xF0F0F0:0xF0F0F0:0x0xF0F0F0 11630x0F0F0F:0x0F0F0F:0x0x0F0F0F 11640x0F0F0F:0xF0F0F0:0x0xFFFFFF 11650xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0 11660x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F 11670x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF 11680xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0 11690x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F 11700x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF 11710xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0 11720x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F 11730x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF 11740x1F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF 1175 1176&bxor 1177abc:abc:NaN 1178abc:0:NaN 11790:abc:NaN 11801:2:3 1181+8:+2:10 1182+281474976710656:0:281474976710656 1183+281474976710656:1:281474976710657 1184+281474976710656:281474976710656:0 1185-2:-3:3 1186-1:-1:0 1187-6:-6:0 1188-7:4:-3 1189-4:7:-5 11904:-7:-3 1191-4:-7:5 1192# equal arguments are treated special, so also do some test with unequal ones 11930xFFFF:0xFFFF:0 11940xFFFFFF:0xFFFFFF:0 11950xFFFFFFFF:0xFFFFFFFF:0 11960xFFFFFFFFFF:0xFFFFFFFFFF:0 11970xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0 11980:0xFFFF:0x0xFFFF 11990:0xFFFFFF:0x0xFFFFFF 12000:0xFFFFFFFF:0x0xFFFFFFFF 12010:0xFFFFFFFFFF:0x0xFFFFFFFFFF 12020:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF 12030xFFFF:0:0x0xFFFF 12040xFFFFFF:0:0x0xFFFFFF 12050xFFFFFFFF:0:0x0xFFFFFFFF 12060xFFFFFFFFFF:0:0x0xFFFFFFFFFF 12070xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF 12080xF0F0:0xF0F0:0 12090x0F0F:0x0F0F:0 12100xF0F0:0x0F0F:0x0xFFFF 12110xF0F0F0:0xF0F0F0:0 12120x0F0F0F:0x0F0F0F:0 12130x0F0F0F:0xF0F0F0:0x0xFFFFFF 12140xF0F0F0F0:0xF0F0F0F0:0 12150x0F0F0F0F:0x0F0F0F0F:0 12160x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF 12170xF0F0F0F0F0:0xF0F0F0F0F0:0 12180x0F0F0F0F0F:0x0F0F0F0F0F:0 12190x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF 12200xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0 12210x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0 12220x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF 1223 1224&bnot 1225abc:NaN 1226+0:-1 1227+8:-9 1228+281474976710656:-281474976710657 1229-1:0 1230-2:1 1231-12:11 1232 1233&digit 12340:0:0 123512:0:2 123612:1:1 1237123:0:3 1238123:1:2 1239123:2:1 1240123:-1:1 1241123:-2:2 1242123:-3:3 1243123456:0:6 1244123456:1:5 1245123456:2:4 1246123456:3:3 1247123456:4:2 1248123456:5:1 1249123456:-1:1 1250123456:-2:2 1251123456:-3:3 1252100000:-3:0 1253100000:0:0 1254100000:1:0 1255 1256&mantissa 1257abc:NaN 12581e4:1 12592e0:2 1260123:123 1261-1:-1 1262-2:-2 1263+inf:inf 1264-inf:-inf 1265 1266&exponent 1267abc:NaN 12681e4:4 12692e0:0 1270123:0 1271-1:0 1272-2:0 12730:0 1274+inf:inf 1275-inf:inf 1276 1277&parts 1278abc:NaN,NaN 12791e4:1,4 12802e0:2,0 1281123:123,0 1282-1:-1,0 1283-2:-2,0 12840:0,0 1285+inf:inf,inf 1286-inf:-inf,inf 1287 1288&bpow 1289abc:12:NaN 129012:abc:NaN 12910:0:1 12920:1:0 12930:2:0 12940:-1:inf 12950:-2:inf 12961:0:1 12971:1:1 12981:2:1 12991:3:1 13001:-1:1 13011:-2:1 13021:-3:1 13032:0:1 13042:1:2 13052:2:4 13062:3:8 13073:3:27 13082:-1:0.5^ 1309-2:-1:-0.5^ 13102:-2:0.25^ 1311# Y is even => result positive 1312-2:-2:0.25^ 1313# Y is odd => result negative 1314-2:-3:-0.125^ 1315+inf:1234500012:inf 1316-inf:1234500012:inf 1317-inf:1234500013:-inf 1318+inf:-12345000123:0 1319-inf:-12345000123:0 1320# 1 ** -x => 1 / (1 ** x) 1321-1:0:1 1322-2:0:1 1323-1:1:-1 1324-1:2:1 1325-1:3:-1 1326-1:4:1 1327-1:5:-1 1328-1:-1:-1 1329-1:-2:1 1330-1:-3:-1 1331-1:-4:1 1332-2:2:4 1333-2:3:-8 1334-2:4:16 1335-2:5:-32 1336-3:2:9 1337-3:3:-27 1338-3:4:81 1339-3:5:-243 134010:2:100 134110:3:1000 134210:4:10000 134310:5:100000 134410:6:1000000 134510:7:10000000 134610:8:100000000 134710:9:1000000000 134810:20:100000000000000000000 1349123456:2:15241383936 1350#2:0.5:1.41^ 1351 1352&length 1353100:3 135410:2 13551:1 13560:1 135712345:5 135810000000000000000:17 1359-123:3 1360215960156869840440586892398248:30 1361# broot always upgrades 1362 1363&broot 1364144:2:12^ 1365123:2:11.09053650640941716205160010260993291846^ 1366# bsqrt always upgrades 1367 1368&bsqrt 1369145:12.04159457879229548012824103037860805243^ 1370144:12^ 1371143:11.95826074310139802112984075619561661399^ 137216:4 1373170:13.03840481040529742916594311485836883306^ 1374169:13 1375168:12.96148139681572046193193487217599331541^ 13764:2 13773:1.732050807568877293527446341505872366943^ 13782:1.41421356237309504880168872420969807857^ 13799:3 138012:3.464101615137754587054892683011744733886^ 1381256:16 1382100000000:10000 13834000000000000:2000000 1384152399026:12345.00004050222755607815159966235881398^ 1385152399025:12345 1386152399024:12344.99995949777231103967404745303741942^ 13871:1 13880:0 1389-2:NaN 1390-123:NaN 1391Nan:NaN 1392+inf:inf 1393-inf:NaN 1394 1395&bround 1396$round_mode('trunc') 13970:12:0 1398NaNbround:12:NaN 1399+inf:12:inf 1400-inf:12:-inf 14011234:0:1234 14021234:2:1200 1403123456:4:123400 1404123456:5:123450 1405123456:6:123456 1406+10123456789:5:10123000000 1407-10123456789:5:-10123000000 1408+10123456789:9:10123456700 1409-10123456789:9:-10123456700 1410+101234500:6:101234000 1411-101234500:6:-101234000 1412#+101234500:-4:101234000 1413#-101234500:-4:-101234000 1414$round_mode('zero') 1415+20123456789:5:20123000000 1416-20123456789:5:-20123000000 1417+20123456789:9:20123456800 1418-20123456789:9:-20123456800 1419+201234500:6:201234000 1420-201234500:6:-201234000 1421#+201234500:-4:201234000 1422#-201234500:-4:-201234000 1423+12345000:4:12340000 1424-12345000:4:-12340000 1425$round_mode('+inf') 1426+30123456789:5:30123000000 1427-30123456789:5:-30123000000 1428+30123456789:9:30123456800 1429-30123456789:9:-30123456800 1430+301234500:6:301235000 1431-301234500:6:-301234000 1432#+301234500:-4:301235000 1433#-301234500:-4:-301234000 1434+12345000:4:12350000 1435-12345000:4:-12340000 1436$round_mode('-inf') 1437+40123456789:5:40123000000 1438-40123456789:5:-40123000000 1439+40123456789:9:40123456800 1440-40123456789:9:-40123456800 1441+401234500:6:401234000 1442+401234500:6:401234000 1443#-401234500:-4:-401235000 1444#-401234500:-4:-401235000 1445+12345000:4:12340000 1446-12345000:4:-12350000 1447$round_mode('odd') 1448+50123456789:5:50123000000 1449-50123456789:5:-50123000000 1450+50123456789:9:50123456800 1451-50123456789:9:-50123456800 1452+501234500:6:501235000 1453-501234500:6:-501235000 1454#+501234500:-4:501235000 1455#-501234500:-4:-501235000 1456+12345000:4:12350000 1457-12345000:4:-12350000 1458$round_mode('even') 1459+60123456789:5:60123000000 1460-60123456789:5:-60123000000 1461+60123456789:9:60123456800 1462-60123456789:9:-60123456800 1463+601234500:6:601234000 1464-601234500:6:-601234000 1465#+601234500:-4:601234000 1466#-601234500:-4:-601234000 1467#-601234500:-9:0 1468#-501234500:-9:0 1469#-601234500:-8:0 1470#-501234500:-8:0 1471+1234567:7:1234567 1472+1234567:6:1234570 1473+12345000:4:12340000 1474-12345000:4:-12340000 1475 1476&is_zero 14770:1 1478NaNzero:0 1479+inf:0 1480-inf:0 1481123:0 1482-1:0 14831:0 1484 1485&is_one 14860:0 1487NaNone:0 1488+inf:0 1489-inf:0 14901:1 14912:0 1492-1:0 1493-2:0 1494# floor and ceil are pretty pointless in integer space, but play safe 1495 1496&bfloor 14970:0 1498NaNfloor:NaN 1499+inf:inf 1500-inf:-inf 1501-1:-1 1502-2:-2 15032:2 15043:3 1505abc:NaN 1506 1507&bceil 1508NaNceil:NaN 1509+inf:inf 1510-inf:-inf 15110:0 1512-1:-1 1513-2:-2 15142:2 15153:3 1516abc:NaN 1517 1518&bint 1519NaN:NaN 1520+inf:inf 1521-inf:-inf 15220:0 1523-1:-1 1524-2:-2 15252:2 15263:3 1527 1528&to_hex 1529128:80 1530-128:-80 15310:0 1532-0:0 15331:1 15340x123456789123456789:123456789123456789 1535+inf:inf 1536-inf:-inf 1537NaNto_hex:NaN 1538 1539&to_oct 1540128:200 1541-128:-200 15420:0 1543-0:0 15441:1 15450b1010111101010101010110110110110110101:1275252666665 15460x123456789123456789:44321263611044321263611 1547+inf:inf 1548-inf:-inf 1549NaNto_oct:NaN 1550 1551&to_bin 1552128:10000000 1553-128:-10000000 15540:0 1555-0:0 15561:1 15570b1010111101010101010110110110110110101:1010111101010101010110110110110110101 1558+inf:inf 1559-inf:-inf 1560NaNto_bin:NaN 1561 1562&as_hex 1563128:0x80 1564-128:-0x80 15650:0x0 1566-0:0x0 15671:0x1 15680x123456789123456789:0x123456789123456789 1569+inf:inf 1570-inf:-inf 1571NaNas_hex:NaN 1572 1573&as_bin 1574128:0b10000000 1575-128:-0b10000000 15760:0b0 1577-0:0b0 15781:0b1 15790b1010111101010101010110110110110110101:0b1010111101010101010110110110110110101 1580+inf:inf 1581-inf:-inf 1582NaNas_bin:NaN 1583 1584&as_oct 1585128:0200 1586-128:-0200 15870:00 1588-0:00 15891:01 15900b1010111101010101010110110110110110101:01275252666665 15910x123456789123456789:044321263611044321263611 1592+inf:inf 1593-inf:-inf 1594NaNas_oct:NaN 1595