3 ms·
The arithmetic is correct - the problem is that "9999999999999999.0" isn't representable exactly. 9999999999999998.0 in IEEE754 is 0x4341C37937E07FFF "9999999
by al2o3cr 8y ago
The arithmetic is correct - the problem is that "9999999999999999.0" isn't representable exactly.
9999999999999998.0 in IEEE754 is 0x4341C37937E07FFF
"9999999999999999.0" in IEEE754 is 0x4341C37937E08000 - the significand is exactly one higher.
With an exponent of 53, the ULP is 2 - so parsing "9999999999999999.0" returns 1.0E16 because it's the next representable number.
Using one of these workarounds requires a certain prescience of the
data domain, so they were not generally considered for the table above.
Doing arithmetic reliably with fixed-precision arithmetic always requires understanding of the data domain. If you need arbitrary precision, you'll need to pay the overhead costs of arbitrary-precision: either by opting-in by using the right library, or by default in languages like Perl6 and Wolfram.