![]() |
![]()
| ![]() |
![]()
NAMEbigfloat - transparent big floating point number support for Perl SYNOPSISuse bigfloat; $x = 2 + 4.5; # Math::BigFloat 6.5 print 2 ** 512 * 0.1; # Math::BigFloat 134...09.6 print inf + 42; # Math::BigFloat inf print NaN * 7; # Math::BigFloat NaN print hex("0x1234567890123490"); # Perl v5.10.0 or later { no bigfloat; print 2 ** 256; # a normal Perl scalar now } # for older Perls, import into current package: use bigfloat qw/hex oct/; print hex("0x1234567890123490"); print oct("01234567890123490"); DESCRIPTIONAll numeric literals in the given scope are converted to Math::BigFloat objects. All operators (including basic math operations) except the range operator ".." are overloaded. So, the following: use bigfloat; $x = 1234; creates a Math::BigFloat 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 -Mbigfloat -le 'print ref(1234)' Since numbers are actually objects, you can call all the usual methods from Math::BigFloat on them. This even works to some extent on expressions: perl -Mbigfloat -le '$x = 1234; print $x->bdec()' perl -Mbigfloat -le 'print 1234->copy()->binc();' perl -Mbigfloat -le 'print 1234->copy()->binc->badd(6);' perl -Mbigfloat -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 -Mbigfloat -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 -Mbigfloat -le 'for (1..2) { print ref($_); }' Options"bigfloat" recognizes some options that can be passed while loading it via 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 bigfloat lib => 'Calc'; you can change this by using: use bigfloat 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 bigfloat 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 bigfloat try => 'GMP'; If you want the code to die instead of falling back, use "only" instead: use bigfloat only => 'GMP'; Please see respective module documentation for further details. Method callsSince all numbers are now objects, you can use all methods that are part of the Math::BigFloat 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
EXAMPLESSome cool command line examples to impress the Python crowd ;) perl -Mbigfloat -le 'print sqrt(33)' perl -Mbigfloat -le 'print 2**255' perl -Mbigfloat -le 'print 4.5+2**255' perl -Mbigfloat -le 'print 3/7 + 5/7 + 8/3' perl -Mbigfloat -le 'print 123->is_odd()' perl -Mbigfloat -le 'print log(2)' perl -Mbigfloat -le 'print exp(1)' perl -Mbigfloat -le 'print 2 ** 0.5' perl -Mbigfloat=a,65 -le 'print 2 ** 0.2' perl -Mbigfloat=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 bigfloat 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 ALSObigint and bigrat. Math::BigInt, Math::BigFloat, Math::BigRat and Math::Big as well as Math::BigInt::FastCalc, Math::BigInt::Pari and Math::BigInt::GMP. AUTHORS
|