diff options
author | David Mitchell <davem@iabyn.com> | 2013-12-02 15:04:49 +0000 |
---|---|---|
committer | David Mitchell <davem@iabyn.com> | 2013-12-25 21:40:32 +0000 |
commit | b27804d8b48d647c08dc853b49e5b311fe166616 (patch) | |
tree | 8ba60a501056223f70bc9dfffa54c8f8752750c4 /perlapi.h | |
parent | ba0f5503397ddc65667224047f121adc8b44784c (diff) | |
download | perl-b27804d8b48d647c08dc853b49e5b311fe166616.tar.gz |
[perl #120426] atof() small value rounding errors
For something like 0.153e-305, which is small, but not quite the smallest
number (which is around 2.2e-308), adding extra digits to the fractional part
could cause unnecessary rounding to zero.
From the bug report:
$ echo 0.1530e-305 | perl -e '$v = <STDIN>; print "v=", $v + 0, "\n";'
v=0
$ echo 0.153e-305 | perl -e '$v = <STDIN>; print "v=", $v + 0, "\n";'
v=1.53e-306
This was because 0.1234e-305 is calculated as
1234 / (10^309)
and 10^309 becomes infinity. In these edge cases, repeatedly decrement
the exponent and divide the mantissa by 10 until the exponent becomes in
range; in this case we instead calculate
123 / (10^308)
Diffstat (limited to 'perlapi.h')
0 files changed, 0 insertions, 0 deletions