当比较两个是否在Python中浮动时,我看到代码总是像这样比较一个小值epsilon,想知道选择正确的epsilon值的最佳实践是什么?它背后的场景是什么?感谢。
epsilon = 0.000001
abs(a - b)<epsilon
答案 0 :(得分:4)
为此目的,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
答案 1 :(得分:3)
答案非常复杂,因为您需要知道如何保存单精度浮点数或双精度浮点数(Wikipedia),根据经验,您可以使用this Table on Wikipedia作为选择epsilon的参考。但是如果您不确切知道它是float32还是float64(或者对于Linux / Mac还有float96和float128),可能会有一些例外情况。
但我想最佳做法是使用一些预定义的函数,如numpy_assert_array_almost_equal(需要numpy)。
我想每个人都会以不同的方式处理它,只要你能相信你的结果,每种方法都有其优点和缺点。并且始终记住,浮点数可能会因错误的算术运算而完全失控。即计算大值的微小差异。最后,epsilon的值取决于你需要的精度,并且应该在那里进行测试。
答案 2 :(得分:2)
如果您正在寻找最好的epsilon,为了获得最佳比较,您可以使用python的sys epsilon using:
<div th:include="fragments/bodyHeader" th:remove="tag">
<img th:src="@{/resources/images/banner-graphic.png}" src="../../../resources/images/banner-graphic.png" />
<div class="navbar" style="width: 601px;">
NAVIGATION
<div>
</div>
但是如果您希望根据您的a和b动态设置此epsilon,我建议您选择:
>>> import sys
>>> sys.float_info.epsilon
2.220446049250313e-16
或
abs(f1-f2) < tol*max(abs(f1),abs(f2))
答案 3 :(得分:2)
选择正确的epsilon值的最佳做法是什么?
这取决于应用程序的要求。
如果它正计划用于重新进入我所在的航天器的地球轨道,我会选择一个非常小的值,如epsilon = (a+b) * 1e-15
。
如果它预测美国联邦赤字(其本质上具有很大的不确定性),那么一个更大的epsilon可能是合适的:epsilon = (a+b) * 0.002
。