Had the age-old problem with significant figures when comparing floats in Python today, and came up with this little function to deal with it. It ensures that the two values are equal down to 10 significant figures, no matter at what scale they start. This is as opposed to the conventional test, which checks at a fixed scale (e.g. return abs(a - b) < 1e-10).
def equal(a, b):
return abs(a - b) <= abs(a - b)/10000000000
Testing:
a = .0000000000000000837
b = .00000000000000004315
c = a + 100
d = b + 100
equal(a,b)
False
equal(b,a)
False
equal(c,d)
True
equal(d,c)
True
equal(1,1)
True
(Of course, we wound up defining a hard limit, 1e-10, and not using my function, but I still thought it was clever.)
UPDATE: Yes, I recognize that this is hardly a new problem or solution, but it's MY BLOG and I mostly use it as a memory aid anyway - outside readers are incidental (which is a good thing, given my Google Analytics stats).
Tuesday, August 26, 2008
Subscribe to:
Posts (Atom)