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

Lin*_* Ma 8 python floating-point

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

epsilon = 0.000001
abs(a - b)<epsilon
Run Code Online (Sandbox Code Playgroud)

Ale*_*der 6

为此有一个断言函数numpy,它默认使用七位十进制精度。

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
Run Code Online (Sandbox Code Playgroud)

  • 这是非常主观的,完全取决于你正在做什么。像这样的问题本身就是一个编程问题,在我看来并不适合 SO。 (2认同)

use*_*321 5

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

>>> import sys
>>> sys.float_info.epsilon
2.220446049250313e-16
Run Code Online (Sandbox Code Playgroud)

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

abs(f1-f2) < tol*max(abs(f1),abs(f2))
Run Code Online (Sandbox Code Playgroud)

或者

abs(a-b) <= max( rel_tol * max(abs(a), abs(b)), abs_tol )
Run Code Online (Sandbox Code Playgroud)


MSe*_*ert 4

答案非常复杂,因为您需要知道如何保存单精度或双精度浮点数(维基百科),根据经验,您可以使用维基百科上的此表作为选择 epsilon 的参考。但可能会有一些例外,特别是如果您不确切知道它是 float32 还是 float64(或者对于 Linux/Mac,还有 float96 和 float128)。

但我想最佳实践是使用一些预定义的函数,例如numpy_assert_array_almost_equal(需要 numpy)。

我想每个人的处理方式都不同,只要你可以相信你的结果,每种方法都有其优点和缺点。并且永远记住,错误的算术运算可能会导致浮点数完全失控。即计算大值的小差异的地方。最后,epsilon 的值取决于需要的精度以及应该在那里进行测试的精度。