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

时间:2015-10-08 19:21:26

标签: python floating-point

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

epsilon = 0.000001
abs(a - b)<epsilon

4 个答案:

答案 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