【问题标题】:Incremented floats do not equal each other [duplicate]递增的浮点数彼此不相等[重复]
【发布时间】:2012-07-23 08:43:28
【问题描述】:

可能重复:
Why can't decimal numbers be represented exactly in binary?
Program not entering if statement

所以我试图运行一个有两个变量的程序,当一个变量等于另一个时,它执行一个函数。在这种情况下,打印垃圾邮件。但是,由于某种原因,当我运行这个程序时,即使我知道它们是相等的,我也没有得到任何输出。

g=0.0
b=3.0

while g < 30.0:
    if g==b:
        print "Hi"
    g+=.1
    print g, b

【问题讨论】:

标签: python if-statement floating-point comparison


【解决方案1】:

为了扩展 Karoly Horvath 的评论,您可以做些什么来测试近似相等是选择一个相对于最小增量非常非常小的值(我们称之为 epsilon)。假设 epsilon 是 1.0 * 10^-6,比您的增量小五个数量级。 (它可能应该基于浮点表示的平均舍入误差,但这会有所不同,这只是一个示例)。

然后您要做的是检查 g 和 b 的差异是否小于 epsilon - 如果它们足够接近以至于它们实际上相等,则实际上和实际之间的差异是舍入误差,您使用 epsilon 进行近似。

检查

abs(g - b) < epsilon

您将进行几乎但不完全相等的检查,这对于大多数用途来说应该足够了。

【讨论】:

    【解决方案2】:

    这样做的一个好方法是使用整数值进行计数(例如,将 i 从 0 循环到 300 乘 1)并仅在使用浮点值时缩放计数器(例如,设置 f = i * .1) .执行此操作时,循环计数器始终是精确的,因此您可以准确获得所需的迭代次数,并且只有一个浮点舍入,不会在每次迭代中累加。

    循环计数器最常见的是整数类型,因此很容易看出加法是准确的(直到溢出)。但是,循环计数器也可以是浮点类型,前提是您确定它的值和操作是准确的。 (常见的 32 位浮点格式精确表示从 -224 到 +224 的整数。除此之外,它没有精确表示整数的精度。它不能精确地表示 0.1,因此您不能以 0.1 为增量进行计数。但您可以以 0.5、0.25、0.375 或其他 2 的中等幂的小倍数为增量进行计数,这些都是精确表示的。)

    【讨论】:

      【解决方案3】:

      您假设将 0.1 添加到 0.0 的次数将产生 3.0。这些是浮点数,它们不准确。舍入误差使得该值永远不会完全等于 3.0。您几乎不应该使用== 来测试浮点数。

      【讨论】:

      • 如果你真的需要精确的十进制数学,你可以使用Decimal 模块。但是为什么你会超出操作提供的数据
      • g加上0.1三十次后的实际值为3.0000000000000013
      • 这是一个可行的替代方案:g = round(g+0.1, 1) ?
      • +1 表示“几乎从不”使用== 而不是“从不”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      相关资源
      最近更新 更多