use bigrat; print 2 + 4.5,"\n"; # BigFloat 6.5 print 1/3 + 1/4,"\n"; # produces 7/12 { no bigrat; print 1/3,"\n"; # 0.33333... } # Note that this will make hex() and oct() be globally overriden: use bigrat qw/hex oct/; print hex("0x1234567890123490"),"\n"; print oct("01234567890123490"),"\n";
Other than bignum, this module upgrades to Math::BigRat, meaning that instead of 2.5 you will get 2+1/2 as output.
The following modules are currently used by bignum:
Math::BigInt::Lite (for speed, and only if it is loadable) Math::BigInt Math::BigFloat Math::BigRat
use bigrat lib => 'Calc';
You can change this by using:
use bignum lib => 'GMP';
The following would first try to find Math::BigInt::Foo, then Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
use bigrat lib => 'Foo,Math::BigInt::Bar';
Using "lib" warns if none of the specified libraries can be found and Math::BigInt did fall back to one of the default libraries. To supress this warning, use "try" instead:
use bignum try => 'GMP';
If you want the code to die instead of falling back, use "only" instead:
use bignum only => 'GMP';
Please see respective module documentation for further details.
A sign of 'NaN' is used to represent the result when input arguments are not numbers or as a result of 0/0. '+inf' and '-inf' represent plus respectively minus infinity. You will get '+inf' when dividing a positive number by 0, and '-inf' when dividing any negative number by 0.
# perl -Mbigrat=e -wle 'print e'
Returns Euler's number "e", aka exp(1).
# perl -Mbigrat=PI -wle 'print PI'
Returns PI.
bexp($power,$accuracy);
Returns Euler's number "e" raised to the appropriate power, to the wanted accuracy.
Example:
# perl -Mbigrat=bexp -wle 'print bexp(1,80)'
bpi($accuracy);
Returns PI to the wanted accuracy.
Example:
# perl -Mbigrat=bpi -wle 'print bpi(80)'
use bigrat; print "in effect\n" if bigrat::in_effect; # true { no bigrat; print "in effect\n" if bigrat::in_effect; # false }
Returns true or false if "bigrat" is in effect in the current scope.
This method only works on Perl v5.9.4 or later.
$x = 9; $y = $x; $x = $y = 7;
If you want to make a real copy, use the following:
$y = $x->copy();
Using the copy or the original with overloaded math is okay, e.g. the following work:
$x = 9; $y = $x; print $x + 1, " ", $y,"\n"; # prints 10 9
but calling any method that modifies the number directly will result in both the original and the copy being destroyed:
$x = 9; $y = $x; print $x->badd(1), " ", $y,"\n"; # prints 10 10 $x = 9; $y = $x; print $x->binc(1), " ", $y,"\n"; # prints 10 10 $x = 9; $y = $x; print $x->bmul(2), " ", $y,"\n"; # prints 18 18
Using methods that do not modify, but testthe contents works:
$x = 9; $y = $x; $z = 9 if $x->is_zero(); # works fine
See the documentation about the copy constructor and "=" in overload, as well as the documentation in BigInt for further details.
perl -Mbigrat=a,50 -le 'print sqrt(20)'
Note that setting precision and accurary at the same time is not possible.
perl -Mbigrat=p,-50 -le 'print sqrt(20)'
Note that setting precision and accurary at the same time is not possible.
perl -Mbigrat=l,GMP -e 'print 2 ** 512'
Currently there is no way to specify more than one library on the command line. This means the following does not work:
perl -Mbignum=l,GMP,Pari -e 'print 2 ** 512'
This will be hopefully fixed soon ;)
perl -Mbigrat=v
use bigint qw/hex oct/; print hex("0x1234567890123456"); { no bigint; print hex("0x1234567890123456"); }
The second call to hex() will warn about a non-portable constant.
Compare this to:
use bigint; # will warn only under Perl older than v5.9.4 print hex("0x1234567890123456");
perl -Mbigrat -le 'print sqrt(33)' perl -Mbigrat -le 'print 2*255' perl -Mbigrat -le 'print 4.5+2*255' perl -Mbigrat -le 'print 3/7 + 5/7 + 8/3' perl -Mbigrat -le 'print 12->is_odd()'; perl -Mbignum=l,GMP -le 'print 7 ** 7777'
Math::BigFloat, Math::BigInt, Math::BigRat and Math::Big as well as Math::BigInt::BitVect, Math::BigInt::Pari and Math::BigInt::GMP.