Open
Description
numpy.isclose (https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.isclose.html):
abs(a - b) <= (atol + rtol * abs(b))
math.isclose (https://docs.python.org/3/library/math.html#math.isclose):
abs(a - b) <= max(rtol * max(abs(a), abs(b)), atol)
Note that Numpy's equation is not symmetric and correlates the atol
and rtol
parameters, both are bad things (IMO).
Here is a situation where Numpy "incorrectly" flags two numbers as equal:
a = 0.142253
b = 0.142219
rtol = 1e-4
atol = 2e-5
# true because atol interferes with the rtol measurement
abs(a - b) <= (atol + rtol * abs(b))
Out[24]: True
# correct result, rtol fails
abs(a - b) <= max(rtol * max(abs(a), abs(b)), atol)
Out[29]: False
Here is another one, this case symmetry problem:
a = 0.142253
b = 0.142219
rtol = 1e-4
atol = 1.9776e-05
# relative to b
abs(a - b) <= (atol + rtol * abs(b))
Out[73]: False
#relative to a
abs(a - b) <= (atol + rtol * abs(a))
Out[74]: True
# math one has no problems with this
abs(a - b) <= max(rtol * max(abs(a), abs(b)), atol)
Out[75]: False
Python math version looks to be bulletproof, should Numpy start using this? Are there any benefits of using the Numpy version?