📄 bigintpm.inc
字号:
ok ($class->bone(),1);ok ($class->bone('+'),1);ok ($class->bone('-'),-1);ok ($class->bnan(),'NaN');ok ($class->binf(),'inf');ok ($class->binf('+'),'inf');ok ($class->binf('-'),'-inf');ok ($class->binf('-inf'),'-inf');################################################################################ is_one('-')ok ($class->new(1)->is_one('-'),0);ok ($class->new(-1)->is_one('-'),1);ok ($class->new(1)->is_one(),1);ok ($class->new(-1)->is_one(),0);################################################################################ [perl #30609] bug with $x -= $x not being 0, but 2*$x$x = $class->new(3); $x -= $x; ok ($x, 0);$x = $class->new(-3); $x -= $x; ok ($x, 0);$x = $class->new('NaN'); $x -= $x; ok ($x->is_nan(), 1);$x = $class->new('inf'); $x -= $x; ok ($x->is_nan(), 1);$x = $class->new('-inf'); $x -= $x; ok ($x->is_nan(), 1);$x = $class->new('NaN'); $x += $x; ok ($x->is_nan(), 1);$x = $class->new('inf'); $x += $x; ok ($x->is_inf(), 1);$x = $class->new('-inf'); $x += $x; ok ($x->is_inf('-'), 1);$x = $class->new(3); $x += $x; ok ($x, 6);$x = $class->new(-3); $x += $x; ok ($x, -6);$x = $class->new(3); $x *= $x; ok ($x, 9);$x = $class->new(-3); $x *= $x; ok ($x, 9);$x = $class->new(3); $x /= $x; ok ($x, 1);$x = $class->new(-3); $x /= $x; ok ($x, 1);$x = $class->new(3); $x %= $x; ok ($x, 0);$x = $class->new(-3); $x %= $x; ok ($x, 0);################################################################################ all tests done1;############################################################################################################################################################### Perl 5.005 does not like ok ($x,undef)sub ok_undef { my $x = shift; ok (1,1) and return if !defined $x; ok ($x,'undef'); }################################################################################ sub to check validity of a BigInt internally, to ensure that no op leaves a# number object in an invalid state (f.i. "-0")sub is_valid { my ($x,$f) = @_; my $e = 0; # error? # allow the check to pass for all Lite, and all MBI and subclasses # ok as reference? $e = 'Not a reference to Math::BigInt' if ref($x) !~ /^Math::BigInt/; if (ref($x) ne 'Math::BigInt::Lite') { # has ok sign? $e = "Illegal sign $x->{sign} (expected: '+', '-', '-inf', '+inf' or 'NaN'" if $e eq '0' && $x->{sign} !~ /^(\+|-|\+inf|-inf|NaN)$/; $e = "-0 is invalid!" if $e ne '0' && $x->{sign} eq '-' && $x == 0; $e = $CALC->_check($x->{value}) if $e eq '0'; } # test done, see if error did crop up ok (1,1), return if ($e eq '0'); ok (1,$e." after op '$f'"); }__DATA__&.=1234:-345:1234-345&+=1:2:3-1:-2:-3&-=1:2:-1-1:-2:1&*=2:3:6-1:5:-5&%=100:3:18:9:8-629:5033:4404&/=100:3:33-8:2:-4&|=2:1:3&&=5:7:5&^=5:7:2&blogNaNlog:2:NaN122:NaNlog:NaNNaNlog1:NaNlog:NaN122:inf:NaNinf:122:NaN122:-inf:NaN-inf:122:NaN-inf:-inf:NaNinf:inf:NaN0:4:NaN-21:4:NaN21:-21:NaN# normal results1024:2:1081:3:4# 3.01.. truncate82:3:4# 3.9... truncate80:3:315625:5:615626:5:615624:5:51000:10:310000:10:4100000:10:51000000:10:610000000:10:7100000000:10:88916100448256:12:128916100448257:12:128916100448255:12:112251799813685248:8:1772057594037927936:2:56144115188075855872:2:57288230376151711744:2:58576460752303423488:2:594096:2:121329227995784915872903807060280344576:2:120# $x == $base => result 13:3:1# $x < $base => result 0 ($base ** 0 <= $x)3:4:0# $x == 1 => result 01:5:0&is_negative0:0-1:11:0+inf:0-inf:1NaNneg:0&is_positive0:0-1:01:1+inf:1-inf:0NaNneg:0&is_int-inf:0+inf:0NaNis_int:01:10:1123e12:1&is_oddabc:00:01:13:1-1:1-3:110000001:110000002:02:0120:0121:1&is_evenabc:00:11:03:0-1:0-3:010000001:010000002:12:1120:1121:0&bacmp+0:-0:0+0:+1:-1-1:+1:0+1:-1:0-1:+2:-1+2:-1:1-123456789:+987654321:-1+123456789:-987654321:-1+987654321:+123456789:1-987654321:+123456789:1-123:+4567889:-1# NaNsacmpNaN:123:123:acmpNaN:acmpNaN:acmpNaN:# infinity+inf:+inf:0-inf:-inf:0+inf:-inf:0-inf:+inf:0+inf:123:1-inf:123:1+inf:-123:1-inf:-123:1123:-inf:-1-123:inf:-1-123:-inf:-1123:inf:-1# return undef+inf:NaN:NaN:inf:-inf:NaN:NaN:-inf:&bnorm0e999:00e-999:0-0e999:0-0e-999:0123:123# binary input0babc:NaN0b123:NaN0b0:0-0b0:0-0b1:-10b0001:10b001:10b011:30b101:50b1001:90b10001:170b100001:330b1000001:650b10000001:1290b100000001:2570b1000000001:5130b10000000001:10250b100000000001:20490b1000000000001:40970b10000000000001:81930b100000000000001:163850b1000000000000001:327690b10000000000000001:655370b100000000000000001:1310730b1000000000000000001:2621450b10000000000000000001:5242890b100000000000000000001:10485770b1000000000000000000001:20971530b10000000000000000000001:41943050b100000000000000000000001:83886090b1000000000000000000000001:167772170b10000000000000000000000001:335544330b100000000000000000000000001:671088650b1000000000000000000000000001:1342177290b10000000000000000000000000001:2684354570b100000000000000000000000000001:5368709130b1000000000000000000000000000001:10737418250b10000000000000000000000000000001:21474836490b100000000000000000000000000000001:42949672970b1000000000000000000000000000000001:85899345930b10000000000000000000000000000000001:171798691850b_101:NaN0b1_0_1:50b0_0_0_1:1# hex input-0x0:00xabcdefgh:NaN0x1234:46600xabcdef:11259375-0xABCDEF:-11259375-0x1234:-46600x12345678:3054198960x1_2_3_4_56_78:3054198960xa_b_c_d_e_f:112593750x_123:NaN0x9:90x11:170x21:330x41:650x81:1290x101:2570x201:5130x401:10250x801:20490x1001:40970x2001:81930x4001:163850x8001:327690x10001:655370x20001:1310730x40001:2621450x80001:5242890x100001:10485770x200001:20971530x400001:41943050x800001:83886090x1000001:167772170x2000001:335544330x4000001:671088650x8000001:1342177290x10000001:2684354570x20000001:5368709130x40000001:10737418250x80000001:21474836490x100000001:42949672970x200000001:85899345930x400000001:171798691850x800000001:34359738369# bug found by Mark Lakata in Calc.pm creating too big one-element numbers in _from_hex()0x2dd59e18a125dbed30a6ab1d93e9c855569f44f75806f0645dc9a2e98b808c3:1295719234436071846486578237372801883390756472611551858964079371952886122691# inf inputinf:inf+inf:inf-inf:-inf0inf:NaN# abnormal input:NaNabc:NaN 1 a:NaN1bcd2:NaN11111b:NaN+1z:NaN-1z:NaN# only one underscore between two digits_123:NaN_123_:NaN123_:NaN1__23:NaN1E1__2:NaN1_E12:NaN1E_12:NaN1_E_12:NaN+_1E12:NaN+0_1E2:100+0_0_1E2:100-0_0_1E2:-100-0_0_1E+0_0_2:-100E1:NaNE23:NaN1.23E1:NaN1.23E-1:NaN# bug with two E's in number being valid1e2e3:NaN1e2r:NaN1e2.0:NaN# bug with two '.' in number being valid1.2.2:NaN1.2.3e1:NaN-1.2.3:NaN-1.2.3e-4:NaN1.2e3.4:NaN1.2e-3.4:NaN1.2.3.4:NaN1.2.t:NaN1..2:NaN1..2e1:NaN1..2e1..1:NaN12e1..1:NaN..2:NaN.-2:NaN# leading zeros012:120123:12301234:1234012345:123450123456:12345601234567:1234567012345678:123456780123456789:12345678901234567891:1234567891012345678912:123456789120123456789123:12345678912301234567891234:1234567891234# some inputs that result in zero0e0:0+0e0:0+0e+0:0-0e+0:00e-0:0-0e-0:0+0e-0:0000:000e2:000e02:0000e002:0000e1230:000e-3:000e+3:000e-03:000e+03:0-000:0-00e2:0-00e02:0-000e002:0-000e1230:0-00e-3:0-00e+3:0-00e-03:0-00e+03:0# normal input0:0+0:0+00:0+000:0000000000000000000:0-0:0-0000:0+1:1+01:1+001:1+00000100000:100000123456789:123456789-1:-1-01:-1-001:-1-123456789:-123456789-00000100000:-1000001_2_3:12310000000000E-1_0:11E2:1001E1:101E0:11.23E2:123100E-1:10# floating point input# .2e2:201.E3:10001.01E2:1011010E-1:101-1010E0:-1010-1010E1:-101001234.00:1234# non-integer numbers-1010E-2:NaN-1.01E+1:NaN-1.01E-1:NaN&bnan1:NaN2:NaNabc:NaN&bone2:+:12:-:-1boneNaN:-:-1boneNaN:+:12:abc:13::1&binf1:+:inf2:-:-inf3:abc:inf&is_nan123:0abc:1NaN:1-123:0&is_inf+inf::1-inf::1abc::01::0NaN::0-1::0+inf:-:0+inf:+:1-inf:-:1-inf:+:0-inf:-inf:1-inf:+inf:0+inf:-inf:0+inf:+inf:1# it must be exactly /^[+-]inf$/+infinity::0-infinity::0&blsftabc:abc:NaN+2:+2:8+1:+32:4294967296+1:+48:281474976710656+8:-2:NaN# excercise base 10+12345:4:10:123450000-1234:0:10:-1234+1234:0:10:1234+2:2:10:200+12:2:10:1200+1234:-3:10:NaN1234567890123:12:10:1234567890123000000000000-3:1:2:-6-5:1:2:-10-2:1:2:-4-102533203:1:2:-205066406&brsftabc:abc:NaN+8:+2:2+4294967296:+32:1+281474976710656:+48:1+2:-2:NaN# excercise base 10-1234:0:10:-1234+1234:0:10:1234+200:2:10:2+1234:3:10:1+1234:2:10:12+1234:-3:10:NaN310000:4:10:3112300000:5:10:1231230000000000:10:10:12309876123456789067890:12:10:98761231234561234567890123:13:10:123456820265627:1:2:410132813# test shifting negative numbers in base 2-15:1:2:-8-14:1:2:-7-13:1:2:-7-12:1:2:-6-11:1:2:-6-10:1:2:-5-9:1:2:-5-8:1:2:-4-7:1:2:-4-6:1:2:-3-5:1:2:-3-4:1:2:-2-3:1:2:-2-2:1:2:-1-1:1:2:-1-1640531254:2:2:-410132814-1640531254:1:2:-820265627-820265627:1:2:-410132814-205066405:1:2:-102533203&bsstr+inf:inf-inf:-inf1e+34:1e+34123.456E3:123456e+0100:1e+2bsstrabc:NaN-5:-5e+0-100:-1e+2&numifynumifyabc:NaN+inf:inf-inf:-inf5:5-5:-5100:100-100:-100&bnegbnegNaN:NaN+inf:-inf-inf:infabd:NaN0:01:-1-1:1+123456789:-123456789-123456789:123456789&babsbabsNaN:NaN+inf:inf-inf:inf0:01:1-1:1+123456789:123456789-123456789:123456789&bcmpbcmpNaN:bcmpNaN:bcmpNaN:0:0:bcmpNaN:0:0:0-1:0:-10:-1:11:0:10:1:-1-1:1:-11:-1:1-1:-1:01:1:0123:123:0123:12:112:123:-1-123:-123:0-123:-12:-1-12:-123:1123:124:-1124:123:1-123:-124:1-124:-123:-1100:5:1-123456789:987654321:-1+123456789:-987654321:1-987654321:123456789:-1-inf:5432112345:-1+inf:5432112345:1-inf:-5432112345:-1+inf:-5432112345:1+inf:+inf:0-inf:-inf:0+inf:-inf:1-inf:+inf:-15:inf:-15:inf:-1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -