在Python中比较两个浮点数是否相等

2024-04-24 12:30:32 发布

您现在位置:Python中文网/ 问答频道 /正文

在比较Python中的两个浮点值时,我看到代码总是这样比较一个小值epsilon,我想知道选择正确epsilon值的最佳实践是什么?后面是什么场景?谢谢。

epsilon = 0.000001
abs(a - b)<epsilon

Tags: 代码场景abs浮点epsilon小值
3条回答

为此,numpy中有一个assert函数,默认使用七个十进制精度。

from numpy.testing import assert_almost_equal

a = 0.000000001
b = 0.0000000001

>>> assert_almost_equal(a, b)
# Nothing returned.

b = 1
>>> assert_almost_equal(a, b)
AssertionError: 
Arrays are not almost equal to 7 decimals
 ACTUAL: 1e-09
 DESIRED: 1

如果您正在寻找有史以来最好的epsilon,要获得最好的比较,可以使用python的sys epsilonusing

>>> import sys
>>> sys.float_info.epsilon
2.220446049250313e-16

但如果你更希望根据你的a和b动态地得到这个epsilon,我建议你:

abs(f1-f2) < tol*max(abs(f1),abs(f2))

或者

abs(a-b) <= max( rel_tol * max(abs(a), abs(b)), abs_tol )

答案相当复杂,因为您需要知道如何保存单精度或双精度浮点(Wikipedia),根据经验法则,您可以使用this Table on Wikipedia作为选择epsilon的参考。但是可能会有一些例外,特别是如果您不完全知道它是float32还是float64(或者对于Linux/Mac,还有float96和float128)。

但我想最好的做法是使用一些预定义的函数,比如numpy_assert_array_almost_equal(需要numpy)。

我想每个人的处理方式都有所不同,只要你能相信你的结果,每种方法都有其利弊。而且要记住,float可能会因为错误的算术运算而完全混乱。i、 e.计算大值的微小差异。最后,epsilon的值取决于你需要什么样的精度,并且应该在那里进行测试。

相关问题 更多 >