[Python-Dev] Feedback on new floating point info in tutorial

Tim Peters tim.one@home.com
Mon, 11 Jun 2001 22:17:24 -0400

[Skip Montanaro, on the in-progess 2.2 Tutorial appendix]
> I took a quick look at that appendix.  One thing that confused me
> a bit was that if 0.1 is approximated by something ever-so-slightly
> larger than 0.1, how is it that if you add ten of them together you
> wind up with a result that is ever-so-slightly less than 1.0?

Good for you, Skip!  In all the years I've been explaining this stuff, I
only recall one other picking up on that immediately.  I'm not writing a
book here, though <wink>, and any intro numeric programming text emphasizes
that n*x is a better bet than adding x together n times.

>>> .1 * 10

Greg Ewing put you on the right track, if you want to figure it out yourself
(as Deep Throat said, "follow the bits, Skip -- follow the bits").

> I didn't expect it to be exactly 1.0.  Other floating point naifs
> may be confused in the same way:
>     >>> "%.55f" % 0.5
>     '0.5000000000000000000000000000000000000000000000000000000'
>     >>> "%.55f" % 0.1
>     '0.1000000000000000055511151231257827021181583404541015625'
>     >>> "%.55f" % (0.5+0.1)
>     '0.5999999999999999777955395074968691915273666381835937500'

Note that this output is platform-dependent.  For example, the last on
Windows is

>>> "%.55f" % (0.5+0.1)

> ...
> IEEE-754-is-full-of-traps-for-the-unwary-ly y'rs,

All computer arithmetic is; and among binary fp systems, 754 has got to be
the best-behaved there is.  Know how many irksome bugs I've fixed in Python
mucking with different sizes of integers across platforms, and what C does
and doesn't guarantee about them?  About 20x more than fp bugs.  Of course
there's 10000x as much integer code in Python too <wink>.

    y'rs  - tim