Lin*_* Ma 8 python floating-point
当比较两个是否在Python中浮动时,我看到代码总是这样比较一个小值epsilon,想知道选择正确的epsilon值的最佳实践是什么?它背后的场景是什么?谢谢.
epsilon = 0.000001
abs(a - b)<epsilon
Run Code Online (Sandbox Code Playgroud)
为此有一个断言函数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)
如果您正在寻找有史以来最好的 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)
答案非常复杂,因为您需要知道如何保存单精度或双精度浮点数(维基百科),根据经验,您可以使用维基百科上的此表作为选择 epsilon 的参考。但可能会有一些例外,特别是如果您不确切知道它是 float32 还是 float64(或者对于 Linux/Mac,还有 float96 和 float128)。
但我想最佳实践是使用一些预定义的函数,例如numpy_assert_array_almost_equal(需要 numpy)。
我想每个人的处理方式都不同,只要你可以相信你的结果,每种方法都有其优点和缺点。并且永远记住,错误的算术运算可能会导致浮点数完全失控。即计算大值的小差异的地方。最后,epsilon 的值取决于您需要的精度以及应该在那里进行测试的精度。
| 归档时间: |
|
| 查看次数: |
16226 次 |
| 最近记录: |