10 unshift @INC, '../lib'; # for running manually
14 # testing of Math::BigRat
21 my $cr = 'Math::BigRat';
22 my $mbi = 'Math::BigInt';
23 my $mbf = 'Math::BigFloat';
27 $x = Math::BigRat->new(1234); ok ($x,1234);
28 ok ($x->isa('Math::BigRat'));
29 ok (!$x->isa('Math::BigFloat'));
30 ok (!$x->isa('Math::BigInt'));
32 ##############################################################################
35 foreach my $func (qw/new bnorm/)
37 $x = $cr->$func(1234); ok ($x,1234);
39 $x = $cr->$func('1234/1'); ok ($x,1234);
40 $x = $cr->$func('1234/2'); ok ($x,617);
42 $x = $cr->$func('100/1.0'); ok ($x,100);
43 $x = $cr->$func('10.0/1.0'); ok ($x,10);
44 $x = $cr->$func('0.1/10'); ok ($x,'1/100');
45 $x = $cr->$func('0.1/0.1'); ok ($x,'1');
46 $x = $cr->$func('1e2/10'); ok ($x,10);
47 $x = $cr->$func('1e2/1e1'); ok ($x,10);
48 $x = $cr->$func('1 / 3'); ok ($x,'1/3');
49 $x = $cr->$func('-1 / 3'); ok ($x,'-1/3');
50 $x = $cr->$func('NaN'); ok ($x,'NaN');
51 $x = $cr->$func('inf'); ok ($x,'inf');
52 $x = $cr->$func('-inf'); ok ($x,'-inf');
53 $x = $cr->$func('1/'); ok ($x,'NaN');
55 # input ala '1+1/3' isn't parsed ok yet
56 $x = $cr->$func('1+1/3'); ok ($x,'NaN');
58 ############################################################################
59 # other classes as input
61 $x = $cr->$func($mbi->new(1231)); ok ($x,'1231');
62 $x = $cr->$func($mbf->new(1232)); ok ($x,'1232');
63 $x = $cr->$func($mbf->new(1232.3)); ok ($x,'12323/10');
66 $x = $cr->new('-0'); ok ($x,'0'); ok ($x->{_n}, '0'); ok ($x->{_d},'1');
67 $x = $cr->new('NaN'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
68 $x = $cr->new('-NaN'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
69 $x = $cr->new('-1r4'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
71 $x = $cr->new('+inf'); ok ($x,'inf'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
72 $x = $cr->new('-inf'); ok ($x,'-inf'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
73 $x = $cr->new('123a4'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
76 $x = $cr->new('1e2e2'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
77 $x = $cr->new('1+2+2'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
78 # failed due to BigFlaot bug
79 $x = $cr->new('1.2.2'); ok ($x,'NaN'); ok ($x->{_n}, '0'); ok ($x->{_d},'0');
81 ok ($cr->new('123a4'),'NaN');
82 ok ($cr->new('123e4'),'1230000');
83 ok ($cr->new('-NaN'),'NaN');
84 ok ($cr->new('NaN'),'NaN');
85 ok ($cr->new('+inf'),'inf');
86 ok ($cr->new('-inf'),'-inf');
88 ##############################################################################
91 ok ($cr->new('3/7')->badd(1),'10/7');
92 ok ($cr->new('3/10')->badd(1.1),'7/5');
93 ok ($cr->new('3/7')->badd($mbi->new(1)),'10/7');
94 ok ($cr->new('3/10')->badd($mbf->new('1.1')),'7/5');
96 ok ($cr->new('3/7')->bsub(1),'-4/7');
97 ok ($cr->new('3/10')->bsub(1.1),'-4/5');
98 ok ($cr->new('3/7')->bsub($mbi->new(1)),'-4/7');
99 ok ($cr->new('3/10')->bsub($mbf->new('1.1')),'-4/5');
101 ok ($cr->new('3/7')->bmul(1),'3/7');
102 ok ($cr->new('3/10')->bmul(1.1),'33/100');
103 ok ($cr->new('3/7')->bmul($mbi->new(1)),'3/7');
104 ok ($cr->new('3/10')->bmul($mbf->new('1.1')),'33/100');
106 ok ($cr->new('3/7')->bdiv(1),'3/7');
107 ok ($cr->new('3/10')->bdiv(1.1),'3/11');
108 ok ($cr->new('3/7')->bdiv($mbi->new(1)),'3/7');
109 ok ($cr->new('3/10')->bdiv($mbf->new('1.1')),'3/11');
111 ##############################################################################
112 $x = $cr->new('1/4'); $y = $cr->new('1/3');
113 ok ($x + $y, '7/12');
114 ok ($x * $y, '1/12');
117 $x = $cr->new('7/5'); $x *= '3/2';
120 ok ($x,'2'); # not 21/10
122 $x = $cr->new('2/3'); $y = $cr->new('3/2');
127 $x = $cr->new('-2/3'); $y = $cr->new('3/2');
132 $x = $cr->new('-2/3'); $y = $cr->new('-2/3');
137 $x = $cr->new('-2/3'); $y = $cr->new('-1/3');
142 $x = $cr->new('-124'); $y = $cr->new('-122');
143 ok ($x->bacmp($y),1);
145 $x = $cr->new('-124'); $y = $cr->new('-122');
146 ok ($x->bcmp($y),-1);
148 $x = $cr->new('3/7'); $y = $cr->new('5/7');
151 $x = $cr->new('3/7'); $y = $cr->new('5/7');
154 $x = $cr->new('3/5'); $y = $cr->new('5/7');
157 $x = $cr->new('3/5'); $y = $cr->new('5/7');
160 $x = $cr->new('-144/9')->bsqrt(); ok ($x,'NaN');
161 $x = $cr->new('144/9')->bsqrt(); ok ($x,'4');
163 ##############################################################################
166 $x = $cr->new('2/1'); $z = $x->bpow('3/1'); ok ($x,'8');
168 ##############################################################################
171 $x = $cr->new('1'); $x->bfac(); ok ($x,'1');
172 for (my $i = 0; $i < 8; $i++)
174 $x = $cr->new("$i/1")->bfac(); ok ($x,$mbi->new($i)->bfac());
177 # test for $self->bnan() vs. $x->bnan();
178 $x = $cr->new('-1'); $x->bfac(); ok ($x,'NaN');
180 ##############################################################################
183 $x = $cr->new('3/2'); ok ($x->binc(),'5/2');
184 $x = $cr->new('15/6'); ok ($x->bdec(),'3/2');
186 ##############################################################################
189 $x = $cr->new('-7/7'); ok ($x->{_n}, '1'); ok ($x->{_d}, '1');
190 $x = $cr->new('-7/7')->bfloor(); ok ($x->{_n}, '1'); ok ($x->{_d}, '1');
192 ##############################################################################