1eac174f2Safresh1# -*- mode: perl; -*- 2b8851fccSafresh1 3b8851fccSafresh1# test rounding, accuracy, precision and fallback, round_mode and mixing 4b8851fccSafresh1# of classes 5b8851fccSafresh1 6b8851fccSafresh1use strict; 7b8851fccSafresh1use warnings; 8b8851fccSafresh1 99f11ffb7Safresh1use Test::More tests => 712 # tests in require'd file 10*3d61058aSafresh1 + 52; # tests in this file 11b8851fccSafresh1 129f11ffb7Safresh1use Math::BigInt only => 'Calc'; 13b8851fccSafresh1use Math::BigFloat; 14b8851fccSafresh1 15b8851fccSafresh1our $mbi = 'Math::BigInt'; 16b8851fccSafresh1our $mbf = 'Math::BigFloat'; 17b8851fccSafresh1 18b46d8ef2Safresh1require './t/mbimbf.inc'; 19b8851fccSafresh1 20b8851fccSafresh1# some tests that won't work with subclasses, since the things are only 21b8851fccSafresh1# guaranteed in the Math::Big(Int|Float) (unless subclass chooses to support 22b8851fccSafresh1# this) 23b8851fccSafresh1 24b8851fccSafresh1Math::BigInt->round_mode("even"); # reset for tests 25b8851fccSafresh1Math::BigFloat->round_mode("even"); # reset for tests 26b8851fccSafresh1 27b8851fccSafresh1is($Math::BigInt::rnd_mode, "even", '$Math::BigInt::rnd_mode = "even"'); 28b8851fccSafresh1is($Math::BigFloat::rnd_mode, "even", '$Math::BigFloat::rnd_mode = "even"'); 29b8851fccSafresh1 30b8851fccSafresh1my $x = eval '$mbi->round_mode("huhmbi");'; 31b8851fccSafresh1like($@, qr/^Unknown round mode 'huhmbi' at/, 32b8851fccSafresh1 '$mbi->round_mode("huhmbi")'); 33b8851fccSafresh1 34b8851fccSafresh1$x = eval '$mbf->round_mode("huhmbf");'; 35b8851fccSafresh1like($@, qr/^Unknown round mode 'huhmbf' at/, 36b8851fccSafresh1 '$mbf->round_mode("huhmbf")'); 37b8851fccSafresh1 38b8851fccSafresh1# old way (now with test for validity) 39b8851fccSafresh1$x = eval '$Math::BigInt::rnd_mode = "huhmbi";'; 40b8851fccSafresh1like($@, qr/^Unknown round mode 'huhmbi' at/, 41b8851fccSafresh1 '$Math::BigInt::rnd_mode = "huhmbi"'); 42b8851fccSafresh1$x = eval '$Math::BigFloat::rnd_mode = "huhmbf";'; 43b8851fccSafresh1like($@, qr/^Unknown round mode 'huhmbf' at/, 44b8851fccSafresh1 '$Math::BigFloat::rnd_mode = "huhmbf"'); 45b8851fccSafresh1 46b8851fccSafresh1# see if accessor also changes old variable 47b8851fccSafresh1$mbi->round_mode('odd'); 48b8851fccSafresh1is($Math::BigInt::rnd_mode, 'odd', '$Math::BigInt::rnd_mode = "odd"'); 49b8851fccSafresh1 50b8851fccSafresh1$mbf->round_mode('odd'); 51b8851fccSafresh1is($Math::BigInt::rnd_mode, 'odd', '$Math::BigInt::rnd_mode = "odd"'); 52b8851fccSafresh1 53b8851fccSafresh1foreach my $class (qw/Math::BigInt Math::BigFloat/) { 54b8851fccSafresh1 is($class->accuracy(5), 5, "set A ..."); 55b8851fccSafresh1 is($class->precision(), undef, "... and now P must be cleared"); 56b8851fccSafresh1 is($class->precision(5), 5, "set P ..."); 57b8851fccSafresh1 is($class->accuracy(), undef, "... and now A must be cleared"); 58b8851fccSafresh1} 59b8851fccSafresh1 60b8851fccSafresh1foreach my $class (qw/Math::BigInt Math::BigFloat/) { 61*3d61058aSafresh1 my $x; 62b8851fccSafresh1 63*3d61058aSafresh1 # Accuracy 64b8851fccSafresh1 65*3d61058aSafresh1 # set and check the class accuracy 66*3d61058aSafresh1 $class->accuracy(1); 67*3d61058aSafresh1 is($class->accuracy(), 1, "$class has A of 1"); 68b8851fccSafresh1 69*3d61058aSafresh1 # a new instance gets the class accuracy 70*3d61058aSafresh1 $x = $class->new(123); 71*3d61058aSafresh1 is($x->accuracy(), 1, '$x has A of 1'); 72b8851fccSafresh1 73*3d61058aSafresh1 # set and check the instance accuracy 74*3d61058aSafresh1 $x->accuracy(2); 75*3d61058aSafresh1 is($x->accuracy(), 2, '$x has A of 2'); 76b8851fccSafresh1 77*3d61058aSafresh1 # change the class accuracy 78*3d61058aSafresh1 $class->accuracy(3); 79*3d61058aSafresh1 is($class->accuracy(), 3, "$class has A of 3"); 80*3d61058aSafresh1 81*3d61058aSafresh1 # verify that the instance accuracy hasn't changed 82*3d61058aSafresh1 is($x->accuracy(), 2, '$x still has A of 2'); 83*3d61058aSafresh1 84*3d61058aSafresh1 # change the instance accuracy 85*3d61058aSafresh1 $x->accuracy(undef); 86*3d61058aSafresh1 is($x->accuracy(), undef, '$x now has A of undef'); 87*3d61058aSafresh1 88*3d61058aSafresh1 # check the class accuracy 89*3d61058aSafresh1 is($class->accuracy(), 3, "$class still has A of 3"); 90*3d61058aSafresh1 91*3d61058aSafresh1 # change the class accuracy again 92b8851fccSafresh1 $class->accuracy(undef); 93*3d61058aSafresh1 is($class->accuracy(), undef, "$class now has A of undef"); 94*3d61058aSafresh1 95*3d61058aSafresh1 # Precision 96*3d61058aSafresh1 97*3d61058aSafresh1 # set and check the class precision 98*3d61058aSafresh1 $class->precision(1); 99*3d61058aSafresh1 is($class->precision(), 1, "$class has A of 1"); 100*3d61058aSafresh1 101*3d61058aSafresh1 # a new instance gets the class precision 102*3d61058aSafresh1 $x = $class->new(123); 103*3d61058aSafresh1 is($x->precision(), 1, '$x has A of 1'); 104*3d61058aSafresh1 105*3d61058aSafresh1 # set and check the instance precision 106*3d61058aSafresh1 $x->precision(2); 107*3d61058aSafresh1 is($x->precision(), 2, '$x has A of 2'); 108*3d61058aSafresh1 109*3d61058aSafresh1 # change the class precision 110*3d61058aSafresh1 $class->precision(3); 111*3d61058aSafresh1 is($class->precision(), 3, "$class has A of 3"); 112*3d61058aSafresh1 113*3d61058aSafresh1 # verify that the instance precision hasn't changed 114*3d61058aSafresh1 is($x->precision(), 2, '$x still has A of 2'); 115*3d61058aSafresh1 116*3d61058aSafresh1 # change the instance precision 117*3d61058aSafresh1 $x->precision(undef); 118*3d61058aSafresh1 is($x->precision(), undef, '$x now has A of undef'); 119*3d61058aSafresh1 120*3d61058aSafresh1 # check the class precision 121*3d61058aSafresh1 is($class->precision(), 3, "$class still has A of 3"); 122*3d61058aSafresh1 123*3d61058aSafresh1 # change the class precision again 124b8851fccSafresh1 $class->precision(undef); 125*3d61058aSafresh1 is($class->precision(), undef, "$class now has A of undef"); 126b8851fccSafresh1} 127b8851fccSafresh1 128b8851fccSafresh1# bug with blog(Math::BigFloat, Math::BigInt) 129b8851fccSafresh1$x = Math::BigFloat->new(100); 130b8851fccSafresh1$x = $x->blog(Math::BigInt->new(10)); 131b8851fccSafresh1 132b8851fccSafresh1is($x, 2, 'bug with blog(Math::BigFloat, Math::BigInt)'); 133b8851fccSafresh1 134b8851fccSafresh1# bug until v1.88 for sqrt() with enough digits 135b8851fccSafresh1for my $i (80, 88, 100) { 136b8851fccSafresh1 $x = Math::BigFloat->new("1." . ("0" x $i) . "1"); 137b8851fccSafresh1 $x = $x->bsqrt; 138b8851fccSafresh1 is($x, 1, '$x->bsqrt() with many digits'); 139b8851fccSafresh1} 140