1N/A#!/usr/bin/perl -w
1N/A
1N/Ause strict;
1N/Ause Test;
1N/A
1N/ABEGIN
1N/A {
1N/A $| = 1;
1N/A chdir 't' if -d 't';
1N/A unshift @INC, '../lib'; # for running manually
1N/A plan tests => 174;
1N/A }
1N/A
1N/A# testing of Math::BigRat
1N/A
1N/Ause Math::BigRat;
1N/Ause Math::BigInt;
1N/Ause Math::BigFloat;
1N/A
1N/A# shortcuts
1N/Amy $cr = 'Math::BigRat';
1N/Amy $mbi = 'Math::BigInt';
1N/Amy $mbf = 'Math::BigFloat';
1N/A
1N/Amy ($x,$y,$z);
1N/A
1N/A$x = Math::BigRat->new(1234); ok ($x,1234);
1N/Aok ($x->isa('Math::BigRat'));
1N/Aok (!$x->isa('Math::BigFloat'));
1N/Aok (!$x->isa('Math::BigInt'));
1N/A
1N/A##############################################################################
1N/A# new and bnorm()
1N/A
1N/Aforeach my $func (qw/new bnorm/)
1N/A {
1N/A $x = $cr->$func(1234); ok ($x,1234);
1N/A
1N/A $x = $cr->$func('1234/1'); ok ($x,1234);
1N/A $x = $cr->$func('1234/2'); ok ($x,617);
1N/A
1N/A $x = $cr->$func('100/1.0'); ok ($x,100);
1N/A $x = $cr->$func('10.0/1.0'); ok ($x,10);
1N/A $x = $cr->$func('0.1/10'); ok ($x,'1/100');
1N/A $x = $cr->$func('0.1/0.1'); ok ($x,'1');
1N/A $x = $cr->$func('1e2/10'); ok ($x,10);
1N/A $x = $cr->$func('5/1e2'); ok ($x,'1/20');
1N/A $x = $cr->$func('1e2/1e1'); ok ($x,10);
1N/A $x = $cr->$func('1 / 3'); ok ($x,'1/3');
1N/A $x = $cr->$func('-1 / 3'); ok ($x,'-1/3');
1N/A $x = $cr->$func('NaN'); ok ($x,'NaN');
1N/A $x = $cr->$func('inf'); ok ($x,'inf');
1N/A $x = $cr->$func('-inf'); ok ($x,'-inf');
1N/A $x = $cr->$func('1/'); ok ($x,'NaN');
1N/A
1N/A # input ala '1+1/3' isn't parsed ok yet
1N/A $x = $cr->$func('1+1/3'); ok ($x,'NaN');
1N/A
1N/A $x = $cr->$func('1/1.2'); ok ($x,'5/6');
1N/A $x = $cr->$func('1.3/1.2'); ok ($x,'13/12');
1N/A $x = $cr->$func('1.2/1'); ok ($x,'6/5');
1N/A
1N/A ############################################################################
1N/A # other classes as input
1N/A
1N/A $x = $cr->$func($mbi->new(1231)); ok ($x,'1231');
1N/A $x = $cr->$func($mbf->new(1232)); ok ($x,'1232');
1N/A $x = $cr->$func($mbf->new(1232.3)); ok ($x,'12323/10');
1N/A }
1N/A
1N/A$x = $cr->new('-0'); ok ($x,'0'); ok ($x->{_n}, '0'); ok ($x->{_d},'1');
1N/A$x = $cr->new('NaN'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
1N/A$x = $cr->new('-NaN'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
1N/A$x = $cr->new('-1r4'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
1N/A
1N/A$x = $cr->new('+inf'); ok ($x,'inf'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
1N/A$x = $cr->new('-inf'); ok ($x,'-inf'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
1N/A$x = $cr->new('123a4'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
1N/A
1N/A# wrong inputs
1N/A$x = $cr->new('1e2e2'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
1N/A$x = $cr->new('1+2+2'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
1N/A# failed due to BigFlaot bug
1N/A$x = $cr->new('1.2.2'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
1N/A
1N/Aok ($cr->new('123a4'),'NaN');
1N/Aok ($cr->new('123e4'),'1230000');
1N/Aok ($cr->new('-NaN'),'NaN');
1N/Aok ($cr->new('NaN'),'NaN');
1N/Aok ($cr->new('+inf'),'inf');
1N/Aok ($cr->new('-inf'),'-inf');
1N/A
1N/A##############################################################################
1N/A# mixed arguments
1N/A
1N/Aok ($cr->new('3/7')->badd(1),'10/7');
1N/Aok ($cr->new('3/10')->badd(1.1),'7/5');
1N/Aok ($cr->new('3/7')->badd($mbi->new(1)),'10/7');
1N/Aok ($cr->new('3/10')->badd($mbf->new('1.1')),'7/5');
1N/A
1N/Aok ($cr->new('3/7')->bsub(1),'-4/7');
1N/Aok ($cr->new('3/10')->bsub(1.1),'-4/5');
1N/Aok ($cr->new('3/7')->bsub($mbi->new(1)),'-4/7');
1N/Aok ($cr->new('3/10')->bsub($mbf->new('1.1')),'-4/5');
1N/A
1N/Aok ($cr->new('3/7')->bmul(1),'3/7');
1N/Aok ($cr->new('3/10')->bmul(1.1),'33/100');
1N/Aok ($cr->new('3/7')->bmul($mbi->new(1)),'3/7');
1N/Aok ($cr->new('3/10')->bmul($mbf->new('1.1')),'33/100');
1N/A
1N/Aok ($cr->new('3/7')->bdiv(1),'3/7');
1N/Aok ($cr->new('3/10')->bdiv(1.1),'3/11');
1N/Aok ($cr->new('3/7')->bdiv($mbi->new(1)),'3/7');
1N/Aok ($cr->new('3/10')->bdiv($mbf->new('1.1')),'3/11');
1N/A
1N/A##############################################################################
1N/A$x = $cr->new('1/4'); $y = $cr->new('1/3');
1N/A
1N/Aok ($x + $y, '7/12');
1N/Aok ($x * $y, '1/12');
1N/Aok ($x / $y, '3/4');
1N/A
1N/A$x = $cr->new('7/5'); $x *= '3/2';
1N/Aok ($x,'21/10');
1N/A$x -= '0.1';
1N/Aok ($x,'2'); # not 21/10
1N/A
1N/A$x = $cr->new('2/3'); $y = $cr->new('3/2');
1N/Aok ($x > $y,'');
1N/Aok ($x < $y,1);
1N/Aok ($x == $y,'');
1N/A
1N/A$x = $cr->new('-2/3'); $y = $cr->new('3/2');
1N/Aok ($x > $y,'');
1N/Aok ($x < $y,'1');
1N/Aok ($x == $y,'');
1N/A
1N/A$x = $cr->new('-2/3'); $y = $cr->new('-2/3');
1N/Aok ($x > $y,'');
1N/Aok ($x < $y,'');
1N/Aok ($x == $y,'1');
1N/A
1N/A$x = $cr->new('-2/3'); $y = $cr->new('-1/3');
1N/Aok ($x > $y,'');
1N/Aok ($x < $y,'1');
1N/Aok ($x == $y,'');
1N/A
1N/A$x = $cr->new('-124'); $y = $cr->new('-122');
1N/Aok ($x->bacmp($y),1);
1N/A
1N/A$x = $cr->new('-124'); $y = $cr->new('-122');
1N/Aok ($x->bcmp($y),-1);
1N/A
1N/A$x = $cr->new('3/7'); $y = $cr->new('5/7');
1N/Aok ($x+$y,'8/7');
1N/A
1N/A$x = $cr->new('3/7'); $y = $cr->new('5/7');
1N/Aok ($x*$y,'15/49');
1N/A
1N/A$x = $cr->new('3/5'); $y = $cr->new('5/7');
1N/Aok ($x*$y,'3/7');
1N/A
1N/A$x = $cr->new('3/5'); $y = $cr->new('5/7');
1N/Aok ($x/$y,'21/25');
1N/A
1N/A$x = $cr->new('7/4'); $y = $cr->new('1');
1N/Aok ($x % $y,'3/4');
1N/A
1N/A$x = $cr->new('7/4'); $y = $cr->new('5/13');
1N/Aok ($x % $y,'11/52');
1N/A
1N/A$x = $cr->new('7/4'); $y = $cr->new('5/9');
1N/Aok ($x % $y,'1/12');
1N/A
1N/A$x = $cr->new('-144/9')->bsqrt(); ok ($x,'NaN');
1N/A$x = $cr->new('144/9')->bsqrt(); ok ($x,'4');
1N/A$x = $cr->new('3/4')->bsqrt(); ok ($x,
1N/A '1732050807568877293527446341505872366943/'
1N/A .'2000000000000000000000000000000000000000');
1N/A
1N/A##############################################################################
1N/A# bpow
1N/A
1N/A$x = $cr->new('2/1'); $z = $x->bpow('3/1'); ok ($x,'8');
1N/A$x = $cr->new('1/2'); $z = $x->bpow('3/1'); ok ($x,'1/8');
1N/A$x = $cr->new('1/3'); $z = $x->bpow('4/1'); ok ($x,'1/81');
1N/A$x = $cr->new('2/3'); $z = $x->bpow('4/1'); ok ($x,'16/81');
1N/A
1N/A# XXX todo:
1N/A#$x = $cr->new('2/3'); $z = $x->bpow('5/3'); ok ($x,'32/81 ???');
1N/A
1N/A##############################################################################
1N/A# bfac
1N/A
1N/A$x = $cr->new('1'); $x->bfac(); ok ($x,'1');
1N/Afor (my $i = 0; $i < 8; $i++)
1N/A {
1N/A $x = $cr->new("$i/1")->bfac(); ok ($x,$mbi->new($i)->bfac());
1N/A }
1N/A
1N/A# test for $self->bnan() vs. $x->bnan();
1N/A$x = $cr->new('-1'); $x->bfac(); ok ($x,'NaN');
1N/A
1N/A##############################################################################
1N/A# binc/bdec
1N/A
1N/A$x = $cr->new('3/2'); ok ($x->binc(),'5/2');
1N/A$x = $cr->new('15/6'); ok ($x->bdec(),'3/2');
1N/A
1N/A##############################################################################
1N/A# bfloor/bceil
1N/A
1N/A$x = $cr->new('-7/7'); ok ($x->{_n}, '1'); ok ($x->{_d}, '1');
1N/A$x = $cr->new('-7/7')->bfloor(); ok ($x->{_n}, '1'); ok ($x->{_d}, '1');
1N/A
1N/A##############################################################################
1N/A# bsstr
1N/A
1N/A$x = $cr->new('7/5')->bsstr(); ok ($x,'7/5');
1N/A$x = $cr->new('-7/5')->bsstr(); ok ($x,'-7/5');
1N/A
1N/A##############################################################################
1N/A# numify()
1N/A
1N/Amy @array = qw/1 2 3 4 5 6 7 8 9/;
1N/A$x = $cr->new('8/8'); ok ($array[$x],2);
1N/A$x = $cr->new('16/8'); ok ($array[$x],3);
1N/A$x = $cr->new('17/8'); ok ($array[$x],3);
1N/A$x = $cr->new('33/8'); ok ($array[$x],5);
1N/A$x = $cr->new('-33/8'); ok ($array[$x],6);
1N/A
1N/A$x = $cr->new('33/8'); ok ($x->numify() * 1000, 4125);
1N/A$x = $cr->new('-33/8'); ok ($x->numify() * 1000, -4125);
1N/A$x = $cr->new('inf'); ok ($x->numify(), 'inf');
1N/A$x = $cr->new('-inf'); ok ($x->numify(), '-inf');
1N/A$x = $cr->new('NaN'); ok ($x->numify(), 'NaN');
1N/A
1N/A$x = $cr->new('4/3'); ok ($x->numify(), 4/3);
1N/A
1N/A##############################################################################
1N/A# broot(), bmodpow() and bmodinv()
1N/A
1N/A$x = $cr->new(2) ** 32;
1N/A$y = $cr->new(4);
1N/A$z = $cr->new(3);
1N/A
1N/Aok ($x->copy()->broot($y), 2 ** 8);
1N/Aok (ref($x->copy()->broot($y)), $cr);
1N/A
1N/A
1N/Aok ($x->copy()->bmodpow($y,$z), 1);
1N/Aok (ref($x->copy()->bmodpow($y,$z)), $cr);
1N/A
1N/A$x = $cr->new(8);
1N/A$y = $cr->new(5033);
1N/A$z = $cr->new(4404);
1N/A
1N/Aok ($x->copy()->bmodinv($y), $z);
1N/Aok (ref($x->copy()->bmodinv($y)), $cr);
1N/A
1N/A# square root with exact result
1N/A$x = $cr->new('1.44');
1N/Aok ($x->copy()->broot(2), '12/10');
1N/Aok (ref($x->copy()->broot(2)), $cr);
1N/A
1N/A# log with exact result
1N/A$x = $cr->new('256.1');
1N/Aok ($x->copy()->blog(2), '8000563442710106079310294693803606983661/1000000000000000000000000000000000000000');
1N/Aok (ref($x->copy()->blog(2)), $cr);
1N/A
1N/A
1N/A##############################################################################
1N/A# done
1N/A
1N/A1;
1N/A