|
NAMEbigfloat - transparent big floating point number support for Perl SYNOPSIS use 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
|