![]() |
![]()
| ![]() |
![]()
NAMEbigrat - transparent big rational number support for Perl SYNOPSISuse bigrat; print 2 + 4.5; # Math::BigRat 13/2 print 1/3 + 1/4; # Math::BigRat 7/12 print inf + 42; # Math::BigRat inf print NaN * 7; # Math::BigRat NaN print hex("0x1234567890123490"); # Perl v5.10.0 or later { no bigrat; print 1/3; # 0.33333... } # for older Perls, import into current package: use bigrat qw/hex oct/; print hex("0x1234567890123490"); print oct("01234567890123490"); DESCRIPTIONAll numeric literal in the given scope are converted to Math::BigRat objects. All operators (including basic math operations) except the range operator ".." are overloaded. So, the following: use bigrat; $x = 1234; creates a Math::BigRat and stores a reference to in $x. This happens transparently and behind your back, so to speak. You can see this with the following: perl -Mbigrat -le 'print ref(1234)' Since numbers are actually objects, you can call all the usual methods from Math::BigRat on them. This even works to some extent on expressions: perl -Mbigrat -le '$x = 1234; print $x->bdec()' perl -Mbigrat -le 'print 1234->copy()->binc();' perl -Mbigrat -le 'print 1234->copy()->binc->badd(6);' perl -Mbigrat -le 'print +(1234)->copy()->binc()' (Note that print doesn't do what you expect if the expression starts with '(' hence the "+") You can even chain the operations together as usual: perl -Mbigrat -le 'print 1234->copy()->binc->badd(6);' 1241 Please note the following does not work as expected (prints nothing), since overloading of '..' is not yet possible in Perl (as of v5.8.0): perl -Mbigrat -le 'for (1..2) { print ref($_); }' Options"bigrat" recognizes some options that can be passed while loading it via "use". The following options exist:
Math LibraryMath with the numbers is done (by default) by a backend library module called Math::BigInt::Calc. The default is equivalent to saying: use bigrat lib => 'Calc'; you can change this by using: use bigrat lib => 'GMP'; The following would first try to find Math::BigInt::Foo, then Math::BigInt::Bar, and if this also fails, revert to Math::BigInt::Calc: use bigrat lib => 'Foo,Math::BigInt::Bar'; Using c<lib> warns if none of the specified libraries can be found and Math::BigInt fell back to one of the default libraries. To suppress this warning, use c<try> instead: use bigrat try => 'GMP'; If you want the code to die instead of falling back, use "only" instead: use bigrat only => 'GMP'; Please see the respective module documentation for further details. Method callsSince all numbers are now objects, you can use all methods that are part of the Math::BigRat API. But a warning is in order. When using the following to make a copy of a number, only a shallow copy will be made. $x = 9; $y = $x; $x = $y = 7; 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 test that the 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 Math::BigFloat for further details. Methods
CAVEATS
EXAMPLESperl -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 -Mbigrat=l,GMP -le 'print 7 ** 7777' BUGSPlease report any bugs or feature requests to "bug-bignum at rt.cpan.org", or through the web interface at <https://rt.cpan.org/Ticket/Create.html?Queue=bignum> (requires login). We will be notified, and then you'll automatically be notified of progress on your bug as I make changes. SUPPORTYou can find documentation for this module with the perldoc command. perldoc bigrat You can also look for information at:
LICENSEThis program is free software; you may redistribute it and/or modify it under the same terms as Perl itself. SEE ALSObignum and bigint. Math::BigInt, Math::BigFloat, Math::BigRat and Math::Big as well as Math::BigInt::FastCalc, Math::BigInt::Pari and Math::BigInt::GMP. AUTHORS
|