是否有一种可靠的方法来测试 float 的相等性,或者通常确保应该相等的 float 实际上在 float 的精度范围内彼此相等?例如,这是一个令人痛苦的情况:
>> np.mod(2.1, 2) == 0.1
Out[96]: False
我意识到这是由于浮点错误而发生的:
>> np.mod(2.1, 2)
Out[98]: 0.10000000000000009
我熟悉 np.isclose(a,b,tol)
函数,但使用它让我感到不舒服,因为我可能会得到误报,即被告知事物实际上是平等的不应该是。还有一点需要注意的是,np.isclose(a,b)
可能与np.isclose(b,a)
不同,这甚至更糟。
我想知道,是否有一种更可靠的方法来确定 float 的相等性,没有误报/漏报,并且 a==b
与 b==a
不同code> 并且不必搞乱公差?如果不是,设置容差以确保稳健行为的最佳实践/建议是什么?
最佳答案
您说过,如果它们的无限精度形式相等,您希望检查返回 True。在这种情况下,您需要使用无限精度的数据结构。例如fractions.Fraction
:
>>> from fractions import Fraction
>>> Fraction(21, 10) % 2 == Fraction(1, 10)
True
还支持(虽然很慢!)包含 python 对象的数组:
>>> import numpy as np
>>> arr = np.array([Fraction(1, 10), Fraction(11, 10), Fraction(21, 10),
... Fraction(31, 10), Fraction(41, 10)])
>>> arr % 2 == Fraction(1, 10)
array([ True, False, True, False, True], dtype=bool)
您只需确保不会丢失无限精度对象(这对于多个 numpy/scipy 函数来说并不容易)。
在您的情况下,您甚至可以只对整数进行操作:
>>> 21 % 20 == 1
True
关于python - 稳健的 numpy.float64 相等性测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44077308/