[Tutor] math question

Karl Pflästerer sigurd at 12move.de
Fri Apr 23 11:16:04 EDT 2004


On 23 Apr 2004, Chris Lott <- chris at chrislott.org wrote:

> Given below, why isn't the answer ever "right"?

>  >>> math.sqrt(2) * math.sqrt(2)
> 2.0000000000000004

>  >>> (math.sqrt(2))**2
> 2.0000000000000004

Here are several problems:
(a) sqrt(2) can't be written as exact value (neither base 10 nor base
    2).  So Python uses a floating point approximation
(b) you see the internal representation of the numbers (repr())
(c) most floating point numbers can't be represented exactly in the way
    Python stores them

A very good explanation of the problems with floating point numbers can
be found in the Python tutorial in the official documentation.  You
should read it.

A simple example from it which shows the problem:

,----[ Python tutorial: Floating Point Arithmetic:  Issues and Limitations]
|
| The problem is easier to understand at first in base 10.  Consider the
| fraction 1/3.  You can approximate that as a base 10 fraction:
| 
|      0.3
| 
| or, better,
| 
|      0.33
| 
| or, better,
| 
|      0.333
| 
| and so on.  No matter how many digits you're willing to write down, the
| result will never be exactly 1/3, but will be an increasingly better
| approximation to 1/3.
| 
| In the same way, no matter how many base 2 digits you're willing to
| use, the decimal value 0.1 cannot be represented exactly as a base 2
| fraction.  In base 2, 1/10 is the infinitely repeating fraction
| 
|      0.0001100110011001100110011001100110011001100110011...
| 
| Stop at any finite number of bits, and you get an approximation.  This
| is why you see things like:
| 
|      >>> 0.1
|      0.10000000000000001
`----



   Karl
-- 
Please do *not* send copies of replies to me.
I read the list




More information about the Tutor mailing list