There are probably hundreds of questions on here about floating point rounding errors, and the solution is supposed to be interval arithmetic which helps keep track of them. As I’d like to experiment with this, I tried installing pyinterval.
Unfortunately, it doesn’t seem to be working. For this trivial case of floating point error, I’d expect an interval with 2 numbers, one higher and one lower than the actual answer (0.001):
>>> from interval import interval
>>> interval(1.001)-1
interval([0.0009999999999998899])
After some head scratching, my best guess was that the number 1.001 is being converted to a single floating point value before being passed to the interval module, so I tried using the floating point fpu.up and fpu.down functions to force the conversion:
>>> from interval import fpu
>>> fpu.down(lambda : float("1.001")-1)
0.0009999999999998899
>>> fpu.up(lambda : float("1.001")-1)
0.0009999999999998899
Any idea what is wrong? Or have I got the wrong end of the stick on how this is supposed to work?
I’m using an x86 mac with “Python 2.7.1 (r271:86832, Jan 1 2011, 22:28:41) [GCC 4.2.1 (Apple Inc. build 5664)] on darwin”
It looks like the conversion of strings to floats is not respecting the rounding, but if I do it manually by entering 1.001 as 1001/1000, I get the sort of thing I am expecting: