[triangle-zpug] rounding errors with floating point operations

Joseph Mack NA3T jmack at wm7d.net
Sat Jul 19 14:21:45 UTC 2008


This is about floating point ops, and not specific to 
python. It just came up when I was writing python code.

If you do the following floating point ops

x=0.1
y=x/n	#n some floating point number
z=y*n

I would expect due to the finite precision of floating point 
representation, that some digits would fall off the end when 
doing y=x/n and that the z you get would give z!=x. However 
I find that z==x. Here's an example where n is a power of 2.

>>> n_128=2**128
>>> print n_128
340282366920938463463374607431768211456
>>> x=0.1
>>> y=x/n_128
>>> z=y*n_128
>>> print "%30.30g, %30.30g, %30.30g" %(x,y,z)
0.100000000000000005551115123126, 2.93873587705571893305445304302e-40, 0.100000000000000005551115123126

I'm happy with this one. Dividing by a power of 2 
just changes the exponent and not the mantissa in the 
floating point prepresentation of a number. So I wouldn't 
expect the precision of the mantissa to change.

Here's an example when the divisor should affect the 
mantisssa, but still I don't see any sign of digits falling 
off the right side of the mantissa due to the division

>>> n_prime=149.0
>>> y=x/n_prime
>>> z=y*n_prime
>>> print "%30.30g, %30.30g, %30.30g" %(x,y,z)
0.100000000000000005551115123126, 0.000671140939597315508424735241988, 0.100000000000000005551115123126

Why doesn't division of reals loose precision?

Thanks Joe
-- 
Joseph Mack NA3T EME(B,D), FM05lw North Carolina
jmack (at) wm7d (dot) net - azimuthal equidistant map
generator at http://www.wm7d.net/azproj.shtml
Homepage http://www.austintek.com/ It's GNU/Linux!



More information about the triangle-zpug mailing list