1*5486feefSafresh1# -*- mode: perl; -*- 2*5486feefSafresh1 3*5486feefSafresh1use strict; 4*5486feefSafresh1use warnings; 5*5486feefSafresh1 6*5486feefSafresh1use Test::More tests => 203; 7*5486feefSafresh1 8*5486feefSafresh1# basic testing of Math::BigRat 9*5486feefSafresh1 10*5486feefSafresh1use Math::BigRat; 11*5486feefSafresh1use Math::BigInt; 12*5486feefSafresh1use Math::BigFloat; 13*5486feefSafresh1 14*5486feefSafresh1# shortcuts 15*5486feefSafresh1my $mbr = 'Math::BigRat'; 16*5486feefSafresh1my $mbi = 'Math::BigInt'; 17*5486feefSafresh1my $mbf = 'Math::BigFloat'; 18*5486feefSafresh1 19*5486feefSafresh1my ($x, $y, $z); 20*5486feefSafresh1 21*5486feefSafresh1$x = Math::BigRat->new(1234); 22*5486feefSafresh1is($x, 1234, 'value of $x'); 23*5486feefSafresh1isa_ok($x, 'Math::BigRat'); 24*5486feefSafresh1ok(!$x->isa('Math::BigInt'), 25*5486feefSafresh1 "An object of class '" . ref($x) . "' isn't a 'Math::BigInt'"); 26*5486feefSafresh1ok(!$x->isa('Math::BigFloat'), 27*5486feefSafresh1 "An object of class '" . ref($x) . "' isn't a 'Math::BigFloat'"); 28*5486feefSafresh1 29*5486feefSafresh1############################################################################## 30*5486feefSafresh1# new and bnorm() 31*5486feefSafresh1 32*5486feefSafresh1foreach my $method (qw/ new bnorm /) { 33*5486feefSafresh1 $x = $mbr->$method(1234); 34*5486feefSafresh1 is($x, 1234, qq|\$x = $mbr->$method(1234)|); 35*5486feefSafresh1 36*5486feefSafresh1 $x = $mbr->$method("1234/1"); 37*5486feefSafresh1 is($x, 1234, qq|\$x = $mbr->$method("1234/1")|); 38*5486feefSafresh1 39*5486feefSafresh1 $x = $mbr->$method("1234/2"); 40*5486feefSafresh1 is($x, 617, qq|\$x = $mbr->$method("1234/2")|); 41*5486feefSafresh1 42*5486feefSafresh1 $x = $mbr->$method("100/1.0"); 43*5486feefSafresh1 is($x, 100, qq|\$x = $mbr->$method("100/1.0")|); 44*5486feefSafresh1 45*5486feefSafresh1 $x = $mbr->$method("10.0/1.0"); 46*5486feefSafresh1 is($x, 10, qq|\$x = $mbr->$method("10.0/1.0")|); 47*5486feefSafresh1 48*5486feefSafresh1 $x = $mbr->$method("0.1/10"); 49*5486feefSafresh1 is($x, "1/100", qq|\$x = $mbr->$method("0.1/10")|); 50*5486feefSafresh1 51*5486feefSafresh1 $x = $mbr->$method("0.1/0.1"); 52*5486feefSafresh1 is($x, "1", qq|\$x = $mbr->$method("0.1/0.1")|); 53*5486feefSafresh1 54*5486feefSafresh1 $x = $mbr->$method("1e2/10"); 55*5486feefSafresh1 is($x, 10, qq|\$x = $mbr->$method("1e2/10")|); 56*5486feefSafresh1 57*5486feefSafresh1 $x = $mbr->$method("5/1e2"); 58*5486feefSafresh1 is($x, "1/20", qq|\$x = $mbr->$method("5/1e2")|); 59*5486feefSafresh1 60*5486feefSafresh1 $x = $mbr->$method("1e2/1e1"); 61*5486feefSafresh1 is($x, 10, qq|\$x = $mbr->$method("1e2/1e1")|); 62*5486feefSafresh1 63*5486feefSafresh1 $x = $mbr->$method("1 / 3"); 64*5486feefSafresh1 is($x, "1/3", qq|\$x = $mbr->$method("1 / 3")|); 65*5486feefSafresh1 66*5486feefSafresh1 $x = $mbr->$method("-1 / 3"); 67*5486feefSafresh1 is($x, "-1/3", qq|\$x = $mbr->$method("-1 / 3")|); 68*5486feefSafresh1 69*5486feefSafresh1 $x = $mbr->$method("NaN"); 70*5486feefSafresh1 is($x, "NaN", qq|\$x = $mbr->$method("NaN")|); 71*5486feefSafresh1 72*5486feefSafresh1 $x = $mbr->$method("inf"); 73*5486feefSafresh1 is($x, "inf", qq|\$x = $mbr->$method("inf")|); 74*5486feefSafresh1 75*5486feefSafresh1 $x = $mbr->$method("-inf"); 76*5486feefSafresh1 is($x, "-inf", qq|\$x = $mbr->$method("-inf")|); 77*5486feefSafresh1 78*5486feefSafresh1 $x = $mbr->$method("1/"); 79*5486feefSafresh1 is($x, "NaN", qq|\$x = $mbr->$method("1/")|); 80*5486feefSafresh1 81*5486feefSafresh1 $x = $mbr->$method("0x7e"); 82*5486feefSafresh1 is($x, 126, qq|\$x = $mbr->$method("0x7e")|); 83*5486feefSafresh1 84*5486feefSafresh1 # input ala "1+1/3" isn"t parsed ok yet 85*5486feefSafresh1 $x = $mbr->$method("1+1/3"); 86*5486feefSafresh1 is($x, "NaN", qq|\$x = $mbr->$method("1+1/3")|); 87*5486feefSafresh1 88*5486feefSafresh1 $x = $mbr->$method("1/1.2"); 89*5486feefSafresh1 is($x, "5/6", qq|\$x = $mbr->$method("1/1.2")|); 90*5486feefSafresh1 91*5486feefSafresh1 $x = $mbr->$method("1.3/1.2"); 92*5486feefSafresh1 is($x, "13/12", qq|\$x = $mbr->$method("1.3/1.2")|); 93*5486feefSafresh1 94*5486feefSafresh1 $x = $mbr->$method("1.2/1"); 95*5486feefSafresh1 is($x, "6/5", qq|\$x = $mbr->$method("1.2/1")|); 96*5486feefSafresh1 97*5486feefSafresh1 ############################################################################ 98*5486feefSafresh1 # other classes as input 99*5486feefSafresh1 100*5486feefSafresh1 $x = $mbr->$method($mbi->new(1231)); 101*5486feefSafresh1 is($x, "1231", qq|\$x = $mbr->$method($mbi->new(1231))|); 102*5486feefSafresh1 103*5486feefSafresh1 $x = $mbr->$method($mbf->new(1232)); 104*5486feefSafresh1 is($x, "1232", qq|\$x = $mbr->$method($mbf->new(1232))|); 105*5486feefSafresh1 106*5486feefSafresh1 $x = $mbr->$method($mbf->new(1232.3)); 107*5486feefSafresh1 is($x, "12323/10", qq|\$x = $mbr->$method($mbf->new(1232.3))|); 108*5486feefSafresh1} 109*5486feefSafresh1 110*5486feefSafresh1my $n = 'numerator'; 111*5486feefSafresh1my $d = 'denominator'; 112*5486feefSafresh1 113*5486feefSafresh1$x = $mbr->new('-0'); 114*5486feefSafresh1is($x, '0'); 115*5486feefSafresh1is($x->$n(), '0'); 116*5486feefSafresh1is($x->$d(), '1'); 117*5486feefSafresh1 118*5486feefSafresh1$x = $mbr->new('NaN'); 119*5486feefSafresh1is($x, 'NaN'); is($x->$n(), 'NaN'); 120*5486feefSafresh1is($x->$d(), 'NaN'); 121*5486feefSafresh1 122*5486feefSafresh1$x = $mbr->new('-NaN'); 123*5486feefSafresh1is($x, 'NaN'); is($x->$n(), 'NaN'); 124*5486feefSafresh1is($x->$d(), 'NaN'); 125*5486feefSafresh1 126*5486feefSafresh1$x = $mbr->new('-1r4'); 127*5486feefSafresh1is($x, 'NaN'); is($x->$n(), 'NaN'); 128*5486feefSafresh1is($x->$d(), 'NaN'); 129*5486feefSafresh1 130*5486feefSafresh1$x = $mbr->new('+inf'); 131*5486feefSafresh1is($x, 'inf'); is($x->$n(), 'inf'); 132*5486feefSafresh1is($x->$d(), '1'); 133*5486feefSafresh1 134*5486feefSafresh1$x = $mbr->new('-inf'); 135*5486feefSafresh1is($x, '-inf'); 136*5486feefSafresh1is($x->$n(), '-inf'); 137*5486feefSafresh1is($x->$d(), '1'); 138*5486feefSafresh1 139*5486feefSafresh1$x = $mbr->new('123a4'); 140*5486feefSafresh1is($x, 'NaN'); 141*5486feefSafresh1is($x->$n(), 'NaN'); 142*5486feefSafresh1is($x->$d(), 'NaN'); 143*5486feefSafresh1 144*5486feefSafresh1# wrong inputs 145*5486feefSafresh1$x = $mbr->new('1e2e2'); 146*5486feefSafresh1is($x, 'NaN'); 147*5486feefSafresh1is($x->$n(), 'NaN'); 148*5486feefSafresh1is($x->$d(), 'NaN'); 149*5486feefSafresh1 150*5486feefSafresh1$x = $mbr->new('1+2+2'); 151*5486feefSafresh1is($x, 'NaN'); 152*5486feefSafresh1is($x->$n(), 'NaN'); 153*5486feefSafresh1is($x->$d(), 'NaN'); 154*5486feefSafresh1 155*5486feefSafresh1# failed due to BigFloat bug 156*5486feefSafresh1$x = $mbr->new('1.2.2'); 157*5486feefSafresh1is($x, 'NaN'); 158*5486feefSafresh1is($x->$n(), 'NaN'); 159*5486feefSafresh1is($x->$d(), 'NaN'); 160*5486feefSafresh1 161*5486feefSafresh1is($mbr->new('123a4'), 'NaN'); 162*5486feefSafresh1is($mbr->new('123e4'), '1230000'); 163*5486feefSafresh1is($mbr->new('-NaN'), 'NaN'); 164*5486feefSafresh1is($mbr->new('NaN'), 'NaN'); 165*5486feefSafresh1is($mbr->new('+inf'), 'inf'); 166*5486feefSafresh1is($mbr->new('-inf'), '-inf'); 167*5486feefSafresh1 168*5486feefSafresh1############################################################################## 169*5486feefSafresh1# two Bigints 170*5486feefSafresh1 171*5486feefSafresh1is($mbr->new($mbi->new(3), $mbi->new(7))->badd(1), '10/7'); 172*5486feefSafresh1is($mbr->new($mbi->new(-13), $mbi->new(7)), '-13/7'); 173*5486feefSafresh1is($mbr->new($mbi->new(13), $mbi->new(-7)), '-13/7'); 174*5486feefSafresh1is($mbr->new($mbi->new(-13), $mbi->new(-7)), '13/7'); 175*5486feefSafresh1 176*5486feefSafresh1############################################################################## 177*5486feefSafresh1# mixed arguments 178*5486feefSafresh1 179*5486feefSafresh1is($mbr->new('3/7')->badd(1), '10/7'); 180*5486feefSafresh1is($mbr->new('3/10')->badd(1.1), '7/5'); 181*5486feefSafresh1is($mbr->new('3/7')->badd($mbi->new(1)), '10/7'); 182*5486feefSafresh1is($mbr->new('3/10')->badd($mbf->new('1.1')), '7/5'); 183*5486feefSafresh1 184*5486feefSafresh1is($mbr->new('3/7')->bsub(1), '-4/7'); 185*5486feefSafresh1is($mbr->new('3/10')->bsub(1.1), '-4/5'); 186*5486feefSafresh1is($mbr->new('3/7')->bsub($mbi->new(1)), '-4/7'); 187*5486feefSafresh1is($mbr->new('3/10')->bsub($mbf->new('1.1')), '-4/5'); 188*5486feefSafresh1 189*5486feefSafresh1is($mbr->new('3/7')->bmul(1), '3/7'); 190*5486feefSafresh1is($mbr->new('3/10')->bmul(1.1), '33/100'); 191*5486feefSafresh1is($mbr->new('3/7')->bmul($mbi->new(1)), '3/7'); 192*5486feefSafresh1is($mbr->new('3/10')->bmul($mbf->new('1.1')), '33/100'); 193*5486feefSafresh1 194*5486feefSafresh1is($mbr->new('3/7')->bdiv(1), '3/7'); 195*5486feefSafresh1is($mbr->new('3/10')->bdiv(1.1), '3/11'); 196*5486feefSafresh1is($mbr->new('3/7')->bdiv($mbi->new(1)), '3/7'); 197*5486feefSafresh1is($mbr->new('3/10')->bdiv($mbf->new('1.1')), '3/11'); 198*5486feefSafresh1 199*5486feefSafresh1############################################################################## 200*5486feefSafresh1$x = $mbr->new('1/4'); 201*5486feefSafresh1$y = $mbr->new('1/3'); 202*5486feefSafresh1 203*5486feefSafresh1is($x + $y, '7/12'); 204*5486feefSafresh1is($x * $y, '1/12'); 205*5486feefSafresh1is($x / $y, '3/4'); 206*5486feefSafresh1 207*5486feefSafresh1$x = $mbr->new('7/5'); 208*5486feefSafresh1$x *= '3/2'; 209*5486feefSafresh1is($x, '21/10'); 210*5486feefSafresh1$x -= '0.1'; 211*5486feefSafresh1is($x, '2'); # not 21/10 212*5486feefSafresh1 213*5486feefSafresh1$x = $mbr->new('2/3'); 214*5486feefSafresh1$y = $mbr->new('3/2'); 215*5486feefSafresh1is($x > $y, ''); 216*5486feefSafresh1is($x < $y, 1); 217*5486feefSafresh1is($x == $y, ''); 218*5486feefSafresh1 219*5486feefSafresh1$x = $mbr->new('-2/3'); 220*5486feefSafresh1$y = $mbr->new('3/2'); 221*5486feefSafresh1is($x > $y, ''); 222*5486feefSafresh1is($x < $y, '1'); 223*5486feefSafresh1is($x == $y, ''); 224*5486feefSafresh1 225*5486feefSafresh1$x = $mbr->new('-2/3'); 226*5486feefSafresh1$y = $mbr->new('-2/3'); 227*5486feefSafresh1is($x > $y, ''); 228*5486feefSafresh1is($x < $y, ''); 229*5486feefSafresh1is($x == $y, '1'); 230*5486feefSafresh1 231*5486feefSafresh1$x = $mbr->new('-2/3'); 232*5486feefSafresh1$y = $mbr->new('-1/3'); 233*5486feefSafresh1is($x > $y, ''); 234*5486feefSafresh1is($x < $y, '1'); 235*5486feefSafresh1is($x == $y, ''); 236*5486feefSafresh1 237*5486feefSafresh1$x = $mbr->new('-124'); 238*5486feefSafresh1$y = $mbr->new('-122'); 239*5486feefSafresh1is($x->bacmp($y), 1); 240*5486feefSafresh1 241*5486feefSafresh1$x = $mbr->new('-124'); 242*5486feefSafresh1$y = $mbr->new('-122'); 243*5486feefSafresh1is($x->bcmp($y), -1); 244*5486feefSafresh1 245*5486feefSafresh1$x = $mbr->new('3/7'); 246*5486feefSafresh1$y = $mbr->new('5/7'); 247*5486feefSafresh1is($x+$y, '8/7'); 248*5486feefSafresh1 249*5486feefSafresh1$x = $mbr->new('3/7'); 250*5486feefSafresh1$y = $mbr->new('5/7'); 251*5486feefSafresh1is($x*$y, '15/49'); 252*5486feefSafresh1 253*5486feefSafresh1$x = $mbr->new('3/5'); 254*5486feefSafresh1$y = $mbr->new('5/7'); 255*5486feefSafresh1is($x*$y, '3/7'); 256*5486feefSafresh1 257*5486feefSafresh1$x = $mbr->new('3/5'); 258*5486feefSafresh1$y = $mbr->new('5/7'); 259*5486feefSafresh1is($x/$y, '21/25'); 260*5486feefSafresh1 261*5486feefSafresh1$x = $mbr->new('7/4'); 262*5486feefSafresh1$y = $mbr->new('1'); 263*5486feefSafresh1is($x % $y, '3/4'); 264*5486feefSafresh1 265*5486feefSafresh1$x = $mbr->new('7/4'); 266*5486feefSafresh1$y = $mbr->new('5/13'); 267*5486feefSafresh1is($x % $y, '11/52'); 268*5486feefSafresh1 269*5486feefSafresh1$x = $mbr->new('7/4'); 270*5486feefSafresh1$y = $mbr->new('5/9'); 271*5486feefSafresh1is($x % $y, '1/12'); 272*5486feefSafresh1 273*5486feefSafresh1$x = $mbr->new('-144/9')->bsqrt(); 274*5486feefSafresh1is($x, 'NaN'); 275*5486feefSafresh1 276*5486feefSafresh1$x = $mbr->new('144/9')->bsqrt(); 277*5486feefSafresh1is($x, '4'); 278*5486feefSafresh1 279*5486feefSafresh1$x = $mbr->new('3/4')->bsqrt(); 280*5486feefSafresh1is($x, 281*5486feefSafresh1 '4330127018922193233818615853764680917357/' . 282*5486feefSafresh1 '5000000000000000000000000000000000000000'); 283*5486feefSafresh1 284*5486feefSafresh1############################################################################## 285*5486feefSafresh1# bpow 286*5486feefSafresh1 287*5486feefSafresh1$x = $mbr->new('2/1'); 288*5486feefSafresh1$z = $x->bpow('3/1'); 289*5486feefSafresh1is($x, '8'); 290*5486feefSafresh1 291*5486feefSafresh1$x = $mbr->new('1/2'); 292*5486feefSafresh1$z = $x->bpow('3/1'); 293*5486feefSafresh1is($x, '1/8'); 294*5486feefSafresh1 295*5486feefSafresh1$x = $mbr->new('1/3'); 296*5486feefSafresh1$z = $x->bpow('4/1'); 297*5486feefSafresh1is($x, '1/81'); 298*5486feefSafresh1 299*5486feefSafresh1$x = $mbr->new('2/3'); 300*5486feefSafresh1$z = $x->bpow('4/1'); 301*5486feefSafresh1is($x, '16/81'); 302*5486feefSafresh1 303*5486feefSafresh1$x = $mbr->new('2/3'); 304*5486feefSafresh1$z = $x->bpow('5/3'); 305*5486feefSafresh1is($x, '31797617848703662994667839220546583581/62500000000000000000000000000000000000'); 306*5486feefSafresh1 307*5486feefSafresh1############################################################################## 308*5486feefSafresh1# bfac 309*5486feefSafresh1 310*5486feefSafresh1$x = $mbr->new('1'); 311*5486feefSafresh1$x->bfac(); 312*5486feefSafresh1is($x, '1'); 313*5486feefSafresh1 314*5486feefSafresh1for (my $i = 0; $i < 8; $i++) { 315*5486feefSafresh1 $x = $mbr->new("$i/1")->bfac(); 316*5486feefSafresh1 is($x, $mbi->new($i)->bfac()); 317*5486feefSafresh1} 318*5486feefSafresh1 319*5486feefSafresh1# test for $self->bnan() vs. $x->bnan(); 320*5486feefSafresh1$x = $mbr->new('-1'); 321*5486feefSafresh1$x->bfac(); 322*5486feefSafresh1is($x, 'NaN'); 323*5486feefSafresh1 324*5486feefSafresh1############################################################################## 325*5486feefSafresh1# binc/bdec 326*5486feefSafresh1 327*5486feefSafresh1note("binc()"); 328*5486feefSafresh1$x = $mbr->new('3/2'); 329*5486feefSafresh1is($x->binc(), '5/2'); 330*5486feefSafresh1 331*5486feefSafresh1note("bdec()"); 332*5486feefSafresh1 333*5486feefSafresh1$x = $mbr->new('15/6'); 334*5486feefSafresh1is($x->bdec(), '3/2'); 335*5486feefSafresh1 336*5486feefSafresh1############################################################################## 337*5486feefSafresh1# bfloor 338*5486feefSafresh1 339*5486feefSafresh1note("bfloor()"); 340*5486feefSafresh1$x = $mbr->new('-7/7'); 341*5486feefSafresh1is($x->$n(), '-1'); 342*5486feefSafresh1is($x->$d(), '1'); 343*5486feefSafresh1$x = $mbr->new('-7/7')->bfloor(); 344*5486feefSafresh1is($x->$n(), '-1'); 345*5486feefSafresh1is($x->$d(), '1'); 346*5486feefSafresh1 347*5486feefSafresh1############################################################################## 348*5486feefSafresh1# bsstr 349*5486feefSafresh1 350*5486feefSafresh1$x = $mbr->new('7/5')->bsstr(); 351*5486feefSafresh1is($x, '7/5'); 352*5486feefSafresh1$x = $mbr->new('-7/5')->bsstr(); 353*5486feefSafresh1is($x, '-7/5'); 354*5486feefSafresh1 355*5486feefSafresh1############################################################################## 356*5486feefSafresh1 357*5486feefSafresh1note("numify()"); 358*5486feefSafresh1 359*5486feefSafresh1my @array = qw/1 2 3 4 5 6 7 8 9/; 360*5486feefSafresh1$x = $mbr->new('8/8'); 361*5486feefSafresh1is($array[$x], 2); 362*5486feefSafresh1 363*5486feefSafresh1$x = $mbr->new('16/8'); 364*5486feefSafresh1is($array[$x], 3); 365*5486feefSafresh1 366*5486feefSafresh1$x = $mbr->new('17/8'); 367*5486feefSafresh1is($array[$x], 3); 368*5486feefSafresh1 369*5486feefSafresh1$x = $mbr->new('33/8'); 370*5486feefSafresh1is($array[$x], 5); 371*5486feefSafresh1 372*5486feefSafresh1$x = $mbr->new('-33/8'); 373*5486feefSafresh1is($array[$x], 6); 374*5486feefSafresh1 375*5486feefSafresh1$x = $mbr->new('-8/1'); 376*5486feefSafresh1is($array[$x], 2); # -8 => 2 377*5486feefSafresh1 378*5486feefSafresh1require Math::Complex; 379*5486feefSafresh1 380*5486feefSafresh1my $inf = $Math::Complex::Inf; 381*5486feefSafresh1my $nan = $inf - $inf; 382*5486feefSafresh1 383*5486feefSafresh1sub isnumeric { 384*5486feefSafresh1 my $value = shift; 385*5486feefSafresh1 ($value ^ $value) eq "0"; 386*5486feefSafresh1} 387*5486feefSafresh1 388*5486feefSafresh1subtest qq|$mbr -> new("33/8") -> numify()| => sub { 389*5486feefSafresh1 plan tests => 3; 390*5486feefSafresh1 391*5486feefSafresh1 $x = $mbr -> new("33/8") -> numify(); 392*5486feefSafresh1 is(ref($x), "", '$x is a scalar'); 393*5486feefSafresh1 ok(isnumeric($x), '$x is numeric'); 394*5486feefSafresh1 cmp_ok($x, "==", 4.125, '$x has the right value'); 395*5486feefSafresh1}; 396*5486feefSafresh1 397*5486feefSafresh1subtest qq|$mbr -> new("-33/8") -> numify()| => sub { 398*5486feefSafresh1 plan tests => 3; 399*5486feefSafresh1 400*5486feefSafresh1 $x = $mbr -> new("-33/8") -> numify(); 401*5486feefSafresh1 is(ref($x), "", '$x is a scalar'); 402*5486feefSafresh1 ok(isnumeric($x), '$x is numeric'); 403*5486feefSafresh1 cmp_ok($x, "==", -4.125, '$x has the right value'); 404*5486feefSafresh1}; 405*5486feefSafresh1 406*5486feefSafresh1subtest qq|$mbr -> new("inf") -> numify()| => sub { 407*5486feefSafresh1 plan tests => 3; 408*5486feefSafresh1 409*5486feefSafresh1 $x = $mbr -> new("inf") -> numify(); 410*5486feefSafresh1 is(ref($x), "", '$x is a scalar'); 411*5486feefSafresh1 ok(isnumeric($x), '$x is numeric'); 412*5486feefSafresh1 cmp_ok($x, "==", $inf, '$x has the right value'); 413*5486feefSafresh1}; 414*5486feefSafresh1 415*5486feefSafresh1subtest qq|$mbr -> new("-inf") -> numify()| => sub { 416*5486feefSafresh1 plan tests => 3; 417*5486feefSafresh1 418*5486feefSafresh1 $x = $mbr -> new("-inf") -> numify(); 419*5486feefSafresh1 is(ref($x), "", '$x is a scalar'); 420*5486feefSafresh1 ok(isnumeric($x), '$x is numeric'); 421*5486feefSafresh1 cmp_ok($x, "==", -$inf, '$x has the right value'); 422*5486feefSafresh1}; 423*5486feefSafresh1 424*5486feefSafresh1subtest qq|$mbr -> new("NaN") -> numify()| => sub { 425*5486feefSafresh1 plan tests => 3; 426*5486feefSafresh1 427*5486feefSafresh1 $x = $mbr -> new("NaN") -> numify(); 428*5486feefSafresh1 is(ref($x), "", '$x is a scalar'); 429*5486feefSafresh1 ok(isnumeric($x), '$x is numeric'); 430*5486feefSafresh1 cmp_ok($x, "!=", $nan, '$x has the right value'); # Note: NaN != NaN 431*5486feefSafresh1}; 432*5486feefSafresh1 433*5486feefSafresh1############################################################################## 434*5486feefSafresh1# as_hex(), as_bin(), as_oct() 435*5486feefSafresh1 436*5486feefSafresh1note("as_hex(), as_bin(), as_oct()"); 437*5486feefSafresh1 438*5486feefSafresh1$x = $mbr->new('8/8'); 439*5486feefSafresh1is($x->as_hex(), '0x1'); 440*5486feefSafresh1is($x->as_bin(), '0b1'); 441*5486feefSafresh1is($x->as_oct(), '01'); 442*5486feefSafresh1 443*5486feefSafresh1$x = $mbr->new('80/8'); 444*5486feefSafresh1is($x->as_hex(), '0xa'); 445*5486feefSafresh1is($x->as_bin(), '0b1010'); 446*5486feefSafresh1is($x->as_oct(), '012'); 447*5486feefSafresh1 448*5486feefSafresh1############################################################################## 449*5486feefSafresh1# broot(), blog(), bmodpow() and bmodinv() 450*5486feefSafresh1 451*5486feefSafresh1note("broot(), blog(), bmodpow(), bmodinv()"); 452*5486feefSafresh1 453*5486feefSafresh1$x = $mbr->new(2) ** 32; 454*5486feefSafresh1$y = $mbr->new(4); 455*5486feefSafresh1$z = $mbr->new(3); 456*5486feefSafresh1 457*5486feefSafresh1is($x->copy()->broot($y), 2 ** 8); 458*5486feefSafresh1is(ref($x->copy()->broot($y)), $mbr, "\$x is a $mbr"); 459*5486feefSafresh1 460*5486feefSafresh1is($x->copy()->bmodpow($y, $z), 1); 461*5486feefSafresh1is(ref($x->copy()->bmodpow($y, $z)), $mbr, "\$x is a $mbr"); 462*5486feefSafresh1 463*5486feefSafresh1$x = $mbr->new(8); 464*5486feefSafresh1$y = $mbr->new(5033); 465*5486feefSafresh1$z = $mbr->new(4404); 466*5486feefSafresh1 467*5486feefSafresh1is($x->copy()->bmodinv($y), $z); 468*5486feefSafresh1is(ref($x->copy()->bmodinv($y)), $mbr, "\$x is a $mbr"); 469*5486feefSafresh1 470*5486feefSafresh1# square root with exact result 471*5486feefSafresh1$x = $mbr->new('1.44'); 472*5486feefSafresh1is($x->copy()->broot(2), '6/5'); 473*5486feefSafresh1is(ref($x->copy()->broot(2)), $mbr, "\$x is a $mbr"); 474*5486feefSafresh1 475*5486feefSafresh1# log with exact result 476*5486feefSafresh1$x = $mbr->new('256.1'); 477*5486feefSafresh1is($x->copy()->blog(2), 478*5486feefSafresh1 '8000563442710106079310294693803606983661/1000000000000000000000000000000000000000', 479*5486feefSafresh1 "\$x = $mbr->new('256.1')->blog(2)"); 480*5486feefSafresh1is(ref($x->copy()->blog(2)), $mbr, "\$x is a $mbr"); 481*5486feefSafresh1 482*5486feefSafresh1$x = $mbr->new(144); 483*5486feefSafresh1is($x->copy()->broot('2'), 12, 'v/144 = 12'); 484*5486feefSafresh1 485*5486feefSafresh1$x = $mbr->new(12*12*12); 486*5486feefSafresh1is($x->copy()->broot('3'), 12, '(12*12*12) ** 1/3 = 12'); 487*5486feefSafresh1 488*5486feefSafresh1############################################################################## 489*5486feefSafresh1# from_hex(), from_bin(), from_oct() 490*5486feefSafresh1 491*5486feefSafresh1note("from_hex(), from_bin(), from_oct()"); 492*5486feefSafresh1 493*5486feefSafresh1$x = Math::BigRat->from_hex('0x100'); 494*5486feefSafresh1is($x, '256', 'from_hex'); 495*5486feefSafresh1 496*5486feefSafresh1$x = $mbr->from_hex('0x100'); 497*5486feefSafresh1is($x, '256', 'from_hex'); 498*5486feefSafresh1 499*5486feefSafresh1$x = Math::BigRat->from_bin('0b100'); 500*5486feefSafresh1is($x, '4', 'from_bin'); 501*5486feefSafresh1 502*5486feefSafresh1$x = $mbr->from_bin('0b100'); 503*5486feefSafresh1is($x, '4', 'from_bin'); 504*5486feefSafresh1 505*5486feefSafresh1$x = Math::BigRat->from_oct('0100'); 506*5486feefSafresh1is($x, '64', 'from_oct'); 507*5486feefSafresh1 508*5486feefSafresh1$x = $mbr->from_oct('0100'); 509*5486feefSafresh1is($x, '64', 'from_oct'); 510*5486feefSafresh1 511*5486feefSafresh1############################################################################## 512*5486feefSafresh1# as_float() 513*5486feefSafresh1 514*5486feefSafresh1$x = Math::BigRat->new('1/2'); 515*5486feefSafresh1my $f = $x->as_float(); 516*5486feefSafresh1 517*5486feefSafresh1is($x, '1/2', '$x unmodified'); 518*5486feefSafresh1is($f, '0.5', 'as_float(0.5)'); 519*5486feefSafresh1 520*5486feefSafresh1$x = Math::BigRat->new('2/3'); 521*5486feefSafresh1$f = $x->as_float(5); 522*5486feefSafresh1 523*5486feefSafresh1is($x, '2/3', '$x unmodified'); 524*5486feefSafresh1is($f, '0.66667', 'as_float(2/3, 5)'); 525*5486feefSafresh1 526*5486feefSafresh1# Integers should be converted exactly. 527*5486feefSafresh1$x = Math::BigRat->new("3141592653589793238462643383279502884197169399375106"); 528*5486feefSafresh1$f = $x->as_float(); 529*5486feefSafresh1 530*5486feefSafresh1is($x, "3141592653589793238462643383279502884197169399375106", '$x unmodified'); 531*5486feefSafresh1is($f, "3141592653589793238462643383279502884197169399375106", 532*5486feefSafresh1 'as_float(3141592653589793238462643383279502884197169399375106, 5)'); 533*5486feefSafresh1 534*5486feefSafresh1############################################################################## 535*5486feefSafresh1# int() 536*5486feefSafresh1 537*5486feefSafresh1$x = Math::BigRat->new('5/2'); 538*5486feefSafresh1is(int($x), '2', '5/2 converted to integer'); 539*5486feefSafresh1 540*5486feefSafresh1$x = Math::BigRat->new('-1/2'); 541*5486feefSafresh1is(int($x), '0', '-1/2 converted to integer'); 542*5486feefSafresh1 543*5486feefSafresh1############################################################################## 544*5486feefSafresh1# done 545*5486feefSafresh1 546*5486feefSafresh11; 547