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