[Python-Dev] Expert floats (original) (raw)

Tim Peters tim.one at comcast.net
Tue Apr 6 11:00:27 EDT 2004


[Ka-Ping Yee]

>>> 3.3 3.2999999999999998

confused and frightened them, and continues to confuse and frighten almost everyone i teach.

[Jim Jewitt]

It bothered me when I first saw it (not in Python).

It was still better than trying to figure out why my code was doing the wrong thing, when my math and logic were both clearly correct. To steal Simon Percivall's example, I assumed 2.20 - 1.20 == 1.00. It didn't even occur to me to check something as obviously true as that -- until I had learned and remembered that floats were not decimals.

I believe Ping would have

2.20 - 1.20 1.0000000000000002

because "1.0000000000000002" is the shortest string that evals to the true machine result. OTOH, he'd have

2.20 - 1.10 1.1

The true machine result isn't decimal 1.1, but "1.1" is again the shortest string that evals to the true machine result. Presumably newbies aren't confused or frightened by 1.0000000000000002, because their intuition about shortest-possible reproducing decimal representations of binary floats is finely honed .

Most people should use Decimal:

print Decimal("2.20") - Decimal("1.20") 1.00 print Decimal("2.20") - Decimal("1.1") 1.10

The output is "what they expect" then, 100% truthful (the internal results are exactly 1. and decimal 1.1, respectively), and even preserves a useful notion of significant trailing zeroes.



More information about the Python-Dev mailing list