"Brett Wilkins" <[email protected]> wrote

What you're running into here is the limited accuracy of floating point values... You'll likely find this happens a lot in python.. CPython, at least.

In fact it happens with virtually every programming language available.
The problem traces back to the way that computers represent floating
point numbers in hardware. The integrated circuits cannot hold infinitely
long numbers so they need to use a condensed representation and
that inherently introduces small inaccuracies. (Think of 1/3 in
decimal - an infinite series of 1.3333..., the same is true in binary,
some numbers just cannot be represented accurately)

In the specific case being discussed you can disguise the problem
quite easily by displaying the result with a smaller number of decimal
places using round() or string formatting:

64**(1.0/3)
3.9999999999999996
print 64**(1.0/3)
4.0
round(64**(1.0/3))
4.0
"%5.3f" % 64**(1.0/3)
'4.000'


When you need to compare floating point numbers you also
need to be careful since:

4.0 == 64**(1.0/3)     ## is false!

You need to introduce an error range, typically:

e = 0.00000001
4.0-e < 64**(1.0/3) < 4.0+e     #  is true

You can also use the decimal module for exact decimal
arithmetic but it introduces some other complications.

HTH,


--
Alan Gauld
Author of the Learn to Program web site
http://www.freenetpages.co.uk/hp/alan.gauld


_______________________________________________
Tutor maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/tutor

Reply via email to