1N/A# include this file into another for subclass testing 1N/A# This file is nearly identical to bigintpm.t, except that certain results 1N/A# are _requird_ to be different due to "upgrading" or "promoting" to BigFloat. 1N/A# The reverse is not true, any unmarked results can be either BigInt or 1N/A# BigFloat, depending on how good the internal optimization is (e.g. it 1N/A# is usually desirable to have 2 ** 2 return a BigInt, not a BigFloat). 1N/A# Results that are required to be BigFloat are marked with C<^> at the end. 1N/A# Please note that the testcount goes up by two for each extra result marked 1N/A# with ^, since then we test whether it has the proper class and that it left 1N/A# the upgrade variable alone. 1N/Amy $version = ${"$class\::VERSION"}; 1N/A############################################################################## 1N/A# for testing inheritance of _swap 1N/Ause Math::BigInt lib => $main::CL; 1N/A@ISA = (qw/Math::BigInt/); 1N/A# customized overload for sub, since original does not use swap there 1N/A'-' => sub { my @a = ref($_[0])->_swap(@_); 1N/A############################################################################## 1N/Amy $CALC = $class->config()->{lib}; ok ($CALC,$CL); 1N/Amy ($f,$z,$a,$exp,@a,$m,$e,$round_mode,$expected_class); 1N/A $
try =
"\$x = $class->new(\"$args[0]\");";
1N/A $
try =
"\$x = $class->bnorm(\"$args[0]\");";
1N/A $
try .=
"\$x->is_inf('$args[1]');";
1N/A $
try .=
"\$x->binf('$args[1]');";
1N/A $
try .=
"\$x->bone('$args[1]');";
1N/A $
try .=
'$x = $x->exponent()->bstr();';
1N/A $
try .=
'$x = $x->mantissa()->bstr();';
1N/A $
try .=
'($m,$e) = $x->parts();';
1N/A $
try .=
'$m = $m->bstr(); $m = "NaN" if !defined $m;';
1N/A $
try .=
'$e = $e->bstr(); $e = "NaN" if !defined $e;';
1N/A $
try .=
"$round_mode; \$x->bround(\$y);";
1N/A $
try .=
'join (",",$x->bdiv($y));';
1N/A $
try .=
" \$z = $class->new('$args[2]'); ";
1N/A $
try .=
"$class\::bgcd(\$x, \$y";
1N/A $
try .=
" \$z = $class->new('$args[2]'); ";
1N/A $
try .=
"$class\::blcm(\$x, \$y";
1N/A $
try .=
"\$x->blsft(\$y,$args[2]);";
1N/A $
try .=
"\$x->brsft(\$y,$args[2]);";
1N/A $
try =
"\$x = $class->new('$args[0]'); \$x->digit($args[1]);";
1N/A #
print "try: $try ans: $ans1 $ans\n";
1N/A print "# Tried: '$try'\n" if !ok ($ans1, $ans); 1N/Amy $warn = ''; $SIG{__WARN__} = sub { $warn = shift; }; 1N/A# these should not warn 1N/A$warn = ''; eval "\$z = 3.17 <= \$y"; ok ($z, 1); ok ($warn, ''); 1N/A$warn = ''; eval "\$z = \$y >= 3.17"; ok ($z, 1); ok ($warn, ''); 1N/A############################################################################### 1N/A############################################################################### 1N/A# Perl 5.005 does not like ok ($x,undef) 1N/A ok (
1,
1)
and return if !defined $x; 1N/A############################################################################### 1N/A# sub to check validity of a BigInt internally, to ensure that no op leaves a 1N/A# number object in an invalid state (f.i. "-0") 1N/A # $e =
"Not a reference to $c" if (
ref($x) ||
'')
ne $c;
1N/A $e =
"Illegal sign $x->{sign} (expected: '+', '-', '-inf', '+inf' or 'NaN'" 1N/A if $e
eq '0' && $x->{
sign}
!~ /^(\+|-|\+inf|-inf|NaN)$/; 1N/A $e =
"-0 is invalid!" if $e
ne '0' && $x->{
sign}
eq '-' && $x ==
0;
1N/A ok (
1,
1),
return if ($e
eq '0');
1N/A ok (
1,$e.
" after op '$f'");
1N/A100:3:33.33333333333333333333333333333333333333 1N/A-123456789:+987654321:-1 1N/A+123456789:-987654321:-1 1N/A+987654321:+123456789:1 1N/A-987654321:+123456789:1 1N/A0b10000000000001:8193 1N/A0b100000000000001:16385 1N/A0b1000000000000001:32769 1N/A0b10000000000000001:65537 1N/A0b100000000000000001:131073 1N/A0b1000000000000000001:262145 1N/A0b10000000000000000001:524289 1N/A0b100000000000000000001:1048577 1N/A0b1000000000000000000001:2097153 1N/A0b10000000000000000000001:4194305 1N/A0b100000000000000000000001:8388609 1N/A0b1000000000000000000000001:16777217 1N/A0b10000000000000000000000001:33554433 1N/A0b100000000000000000000000001:67108865 1N/A0b1000000000000000000000000001:134217729 1N/A0b10000000000000000000000000001:268435457 1N/A0b100000000000000000000000000001:536870913 1N/A0b1000000000000000000000000000001:1073741825 1N/A0b10000000000000000000000000000001:2147483649 1N/A0b100000000000000000000000000000001:4294967297 1N/A0b1000000000000000000000000000000001:8589934593 1N/A0b10000000000000000000000000000000001:17179869185 1N/A0x1_2_3_4_56_78:305419896 1N/A0xa_b_c_d_e_f:11259375 1N/A0x40000001:1073741825 1N/A0x80000001:2147483649 1N/A0x100000001:4294967297 1N/A0x200000001:8589934593 1N/A0x400000001:17179869185 1N/A0x800000001:34359738369 1N/A# only one underscore between two digits 1N/A# bug with two E's in number beeing valid 1N/A01234567891:1234567891 1N/A012345678912:12345678912 1N/A0123456789123:123456789123 1N/A01234567891234:1234567891234 1N/A-123456789:-123456789 1N/A# floating point input 1N/A# non-integer numbers 1N/A# it must be exactly /^[+-]inf$/ 1N/A+1:+48:281474976710656 1N/A+12345:4:10:123450000 1N/A1234567890123:12:10:1234567890123000000000000 1N/A+281474976710656:+48:1 1N/A1230000000000:10:10:123 1N/A09876123456789067890:12:10:9876123 1N/A1234561234567890123:13:10:123456 1N/A+123456789:-123456789 1N/A-123456789:987654321:-1 1N/A+123456789:-987654321:1 1N/A-987654321:123456789:-1 1N/A+99999999:+1:100000000 1N/A+999999999:+1:1000000000 1N/A+9999999999:+1:10000000000 1N/A+99999999999:+1:100000000000 1N/A+100000000:-1:99999999 1N/A+1000000000:-1:999999999 1N/A+10000000000:-1:9999999999 1N/A+123456789:987654321:1111111110 1N/A-123456789:987654321:864197532 1N/A-123456789:-987654321:-1111111110 1N/A+123456789:-987654321:-864197532 1N/A+99999999:+1:99999998 1N/A+999999999:+1:999999998 1N/A+9999999999:+1:9999999998 1N/A+99999999999:+1:99999999998 1N/A+10000000:-1:10000001 1N/A+100000000:-1:100000001 1N/A+1000000000:-1:1000000001 1N/A+10000000000:-1:10000000001 1N/A+123456789:+987654321:-864197532 1N/A-123456789:+987654321:-1111111110 1N/A-123456789:-987654321:864197532 1N/A+123456789:-987654321:1111111110 1N/A123456789123456789:0:0 1N/A0:123456789123456789:0 1N/A10101:10101:102030201 1N/A1001001:1001001:1002003002001 1N/A100010001:100010001:10002000300020001 1N/A10000100001:10000100001:100002000030000200001 1N/A11111111111:9:99999999999 1N/A22222222222:9:199999999998 1N/A33333333333:9:299999999997 1N/A44444444444:9:399999999996 1N/A55555555555:9:499999999995 1N/A66666666666:9:599999999994 1N/A77777777777:9:699999999993 1N/A88888888888:9:799999999992 1N/A99999999999:9:899999999991 1N/A+12345:+12345:152399025 1N/A+99999:+11111:1111088889 1N/A99999:100000:9999900000 1N/A999999:1000000:999999000000 1N/A9999999:10000000:99999990000000 1N/A99999999:100000000:9999999900000000 1N/A999999999:1000000000:999999999000000000 1N/A9999999999:10000000000:99999999990000000000 1N/A99999999999:100000000000:9999999999900000000000 1N/A999999999999:1000000000000:999999999999000000000000 1N/A9999999999999:10000000000000:99999999999990000000000000 1N/A99999999999999:100000000000000:9999999999999900000000000000 1N/A999999999999999:1000000000000000:999999999999999000000000000000 1N/A9999999999999999:10000000000000000:99999999999999990000000000000000 1N/A99999999999999999:100000000000000000:9999999999999999900000000000000000 1N/A999999999999999999:1000000000000000000:999999999999999999000000000000000000 1N/A9999999999999999999:10000000000000000000:99999999999999999990000000000000000000 1N/A# inf handling and general remainder 1N/A# see table in documentation in MBI 1N/A# exceptions to reminder rule 1N/A# inf handling (see table in doc) 1N/A1000000000:9:111111111.1111111111111111111111111111111^ 1N/A2000000000:9:222222222.2222222222222222222222222222222^ 1N/A3000000000:9:333333333.3333333333333333333333333333333^ 1N/A4000000000:9:444444444.4444444444444444444444444444444^ 1N/A5000000000:9:555555555.5555555555555555555555555555556^ 1N/A6000000000:9:666666666.6666666666666666666666666666667^ 1N/A7000000000:9:777777777.7777777777777777777777777777778^ 1N/A8000000000:9:888888888.8888888888888888888888888888889^ 1N/A9000000000:9:1000000000 1N/A35500000:113:314159.2920353982300884955752212389380531^ 1N/A71000000:226:314159.2920353982300884955752212389380531^ 1N/A106500000:339:314159.2920353982300884955752212389380531^ 1N/A1000000000:3:333333333.3333333333333333333333333333333^ 1N/A999999999999:9:111111111111 1N/A999999999999:99:10101010101 1N/A999999999999:999:1001001001 1N/A999999999999:9999:100010001 1N/A999999999999999:99999:10000100001 1N/A+1111088889:99999:11111 1N/A-5:-3:1.666666666666666666666666666666666666667^ 1N/A-5:3:-1.666666666666666666666666666666666666667^ 1N/A4:3:1.333333333333333333333333333333333333333^ 1N/A4:-3:-1.333333333333333333333333333333333333333^ 1N/A1:3:0.3333333333333333333333333333333333333333^ 1N/A1:-3:-0.3333333333333333333333333333333333333333^ 1N/A-2:-3:0.6666666666666666666666666666666666666667^ 1N/A-2:3:-0.6666666666666666666666666666666666666667^ 1N/A14:-3:-4.666666666666666666666666666666666666667^ 1N/A-14:3:-4.666666666666666666666666666666666666667^ 1N/A-14:-3:4.666666666666666666666666666666666666667^ 1N/A14:3:4.666666666666666666666666666666666666667^ 1N/A# bug in Calc with '99999' vs $BASE-1 1N/A#10000000000000000000000000000000000000000000000000000000000000000000000000000000000:10000000375084540248994272022843165711074:999999962491547381984643365663244474111576 1N/A# inf handling, see table in doc 1N/A# exceptions to reminder rule 1N/A999999999999999:99999:0 1N/A+281474976710656:+281474976710656:281474976710656 1N/A# equal arguments are treated special, so also do some test with unequal ones 1N/A0xFFFF:0xFFFF:0x0xFFFF 1N/A0xFFFFFF:0xFFFFFF:0x0xFFFFFF 1N/A0xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF 1N/A0xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF 1N/A0xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF 1N/A0xF0F0:0xF0F0:0x0xF0F0 1N/A0x0F0F:0x0F0F:0x0x0F0F 1N/A0xF0F0F0:0xF0F0F0:0x0xF0F0F0 1N/A0x0F0F0F:0x0F0F0F:0x0x0F0F0F 1N/A0xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0 1N/A0x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F 1N/A0xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0 1N/A0x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F 1N/A0xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0 1N/A0x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F 1N/A0x1F0F0F0F0F0F:0x3F0F0F0F0F0F:0x0x1F0F0F0F0F0F 1N/A+281474976710656:0:281474976710656 1N/A+281474976710656:1:281474976710657 1N/A+281474976710656:281474976710656:281474976710656 1N/A# equal arguments are treated special, so also do some test with unequal ones 1N/A0xFFFF:0xFFFF:0x0xFFFF 1N/A0xFFFFFF:0xFFFFFF:0x0xFFFFFF 1N/A0xFFFFFFFF:0xFFFFFFFF:0x0xFFFFFFFF 1N/A0xFFFFFFFFFF:0xFFFFFFFFFF:0x0xFFFFFFFFFF 1N/A0xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF 1N/A0:0xFFFFFF:0x0xFFFFFF 1N/A0:0xFFFFFFFF:0x0xFFFFFFFF 1N/A0:0xFFFFFFFFFF:0x0xFFFFFFFFFF 1N/A0:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF 1N/A0xFFFFFF:0:0x0xFFFFFF 1N/A0xFFFFFFFF:0:0x0xFFFFFFFF 1N/A0xFFFFFFFFFF:0:0x0xFFFFFFFFFF 1N/A0xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF 1N/A0xF0F0:0xF0F0:0x0xF0F0 1N/A0x0F0F:0x0F0F:0x0x0F0F 1N/A0xF0F0:0x0F0F:0x0xFFFF 1N/A0xF0F0F0:0xF0F0F0:0x0xF0F0F0 1N/A0x0F0F0F:0x0F0F0F:0x0x0F0F0F 1N/A0x0F0F0F:0xF0F0F0:0x0xFFFFFF 1N/A0xF0F0F0F0:0xF0F0F0F0:0x0xF0F0F0F0 1N/A0x0F0F0F0F:0x0F0F0F0F:0x0x0F0F0F0F 1N/A0x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF 1N/A0xF0F0F0F0F0:0xF0F0F0F0F0:0x0xF0F0F0F0F0 1N/A0x0F0F0F0F0F:0x0F0F0F0F0F:0x0x0F0F0F0F0F 1N/A0x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF 1N/A0xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0x0xF0F0F0F0F0F0 1N/A0x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0x0x0F0F0F0F0F0F 1N/A0x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF 1N/A0x1F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF 1N/A+281474976710656:0:281474976710656 1N/A+281474976710656:1:281474976710657 1N/A+281474976710656:281474976710656:0 1N/A# equal arguments are treated special, so also do some test with unequal ones 1N/A0xFFFFFFFF:0xFFFFFFFF:0 1N/A0xFFFFFFFFFF:0xFFFFFFFFFF:0 1N/A0xFFFFFFFFFFFF:0xFFFFFFFFFFFF:0 1N/A0:0xFFFFFF:0x0xFFFFFF 1N/A0:0xFFFFFFFF:0x0xFFFFFFFF 1N/A0:0xFFFFFFFFFF:0x0xFFFFFFFFFF 1N/A0:0xFFFFFFFFFFFF:0x0xFFFFFFFFFFFF 1N/A0xFFFFFF:0:0x0xFFFFFF 1N/A0xFFFFFFFF:0:0x0xFFFFFFFF 1N/A0xFFFFFFFFFF:0:0x0xFFFFFFFFFF 1N/A0xFFFFFFFFFFFF:0:0x0xFFFFFFFFFFFF 1N/A0xF0F0:0x0F0F:0x0xFFFF 1N/A0x0F0F0F:0xF0F0F0:0x0xFFFFFF 1N/A0xF0F0F0F0:0xF0F0F0F0:0 1N/A0x0F0F0F0F:0x0F0F0F0F:0 1N/A0x0F0F0F0F:0xF0F0F0F0:0x0xFFFFFFFF 1N/A0xF0F0F0F0F0:0xF0F0F0F0F0:0 1N/A0x0F0F0F0F0F:0x0F0F0F0F0F:0 1N/A0x0F0F0F0F0F:0xF0F0F0F0F0:0x0xFFFFFFFFFF 1N/A0xF0F0F0F0F0F0:0xF0F0F0F0F0F0:0 1N/A0x0F0F0F0F0F0F:0x0F0F0F0F0F0F:0 1N/A0x0F0F0F0F0F0F:0xF0F0F0F0F0F0:0x0xFFFFFFFFFFFF 1N/A+281474976710656:-281474976710657 1N/A+inf:-12345000123:inf 1N/A-inf:-12345000123:-inf 1N/A# 1 ** -x => 1 / (1 ** x) 1N/A10:20:100000000000000000000 1N/A215960156869840440586892398248:30 1N/A# broot always upgrades 1N/A123:2:11.09053650640941716205160010260993291846^ 1N/A# bsqrt always upgrades 1N/A145:12.04159457879229548012824103037860805243^ 1N/A143:11.95826074310139802112984075619561661399^ 1N/A170:13.03840481040529742916594311485836883306^ 1N/A168:12.96148139681572046193193487217599331541^ 1N/A3:1.732050807568877293527446341505872366943^ 1N/A2:1.41421356237309504880168872420969807857^ 1N/A12:3.464101615137754587054892683011744733886^ 1N/A4000000000000:2000000 1N/A152399026:12345.00004050222755607815159966235881398^ 1N/A152399024:12344.99995949777231103967404745303741942^ 1N/A+10123456789:5:10123000000 1N/A-10123456789:5:-10123000000 1N/A+10123456789:9:10123456700 1N/A-10123456789:9:-10123456700 1N/A+101234500:6:101234000 1N/A-101234500:6:-101234000 1N/A#+101234500:-4:101234000 1N/A#-101234500:-4:-101234000 1N/A+20123456789:5:20123000000 1N/A-20123456789:5:-20123000000 1N/A+20123456789:9:20123456800 1N/A-20123456789:9:-20123456800 1N/A+201234500:6:201234000 1N/A-201234500:6:-201234000 1N/A#+201234500:-4:201234000 1N/A#-201234500:-4:-201234000 1N/A-12345000:4:-12340000 1N/A+30123456789:5:30123000000 1N/A-30123456789:5:-30123000000 1N/A+30123456789:9:30123456800 1N/A-30123456789:9:-30123456800 1N/A+301234500:6:301235000 1N/A-301234500:6:-301234000 1N/A#+301234500:-4:301235000 1N/A#-301234500:-4:-301234000 1N/A-12345000:4:-12340000 1N/A+40123456789:5:40123000000 1N/A-40123456789:5:-40123000000 1N/A+40123456789:9:40123456800 1N/A-40123456789:9:-40123456800 1N/A+401234500:6:401234000 1N/A+401234500:6:401234000 1N/A#-401234500:-4:-401235000 1N/A#-401234500:-4:-401235000 1N/A-12345000:4:-12350000 1N/A+50123456789:5:50123000000 1N/A-50123456789:5:-50123000000 1N/A+50123456789:9:50123456800 1N/A-50123456789:9:-50123456800 1N/A+501234500:6:501235000 1N/A-501234500:6:-501235000 1N/A#+501234500:-4:501235000 1N/A#-501234500:-4:-501235000 1N/A-12345000:4:-12350000 1N/A+60123456789:5:60123000000 1N/A-60123456789:5:-60123000000 1N/A+60123456789:9:60123456800 1N/A-60123456789:9:-60123456800 1N/A+601234500:6:601234000 1N/A-601234500:6:-601234000 1N/A#+601234500:-4:601234000 1N/A#-601234500:-4:-601234000 1N/A-12345000:4:-12340000 1N/A# floor and ceil tests are pretty pointless in integer space...but play safe 1N/A0x123456789123456789:0x123456789123456789 1N/A0b1010111101010101010110110110110110101:0b1010111101010101010110110110110110101