This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix RT 25274: Math::BigInt::Calc->_num() overflow.
authorPeter John Acklam <pjacklam@online.no>
Sun, 26 Dec 2010 21:17:16 +0000 (13:17 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 26 Dec 2010 22:37:05 +0000 (14:37 -0800)
commite5dcd524f24400d4c59ff25e99f07d5397388205
tree21f703ef87cb3ed690f591dd045c40d4608c6ed1
parentf5d415344cd77e5641abbd31dc8d3080776508ea
Fix RT 25274: Math::BigInt::Calc->_num() overflow.

Why: Math::BigInt::Calc->_num() converts a big integer (in the internal
format) to a Perl scalar. If the big integer is too large to be
represented as a Perl scalar, it might return a Perl scalar numeric
"nan", rather than "inf". The reason is that the current algorithm might
multiply "inf" by "0", giving a "nan" which propagates. The following
example illustrates the bug:

    perl -MMath::BigInt=lib,Calc -wle \
        'print Math::BigInt->new("1e999999")->numify()'

How: This fix computes the output in a different way, never multiply
"inf" by "0".

Test: It is not obvious to me how to test this automatically in a
portable way, since Perl has no standard way of stringifying a scalar
numeric infinity. However the desired behaviour is verified manually and
no existing tests fail with the new code.
dist/Math-BigInt/lib/Math/BigInt/Calc.pm