【问题标题】:Comparing floating point values比较浮点值
【发布时间】:2015-05-11 16:32:10
【问题描述】:

我刚看了一篇关于浮点值比较的说明

不应使用 == 或 != 比较浮点值 运营商。 大多数浮点值没有精确的二进制表示,并且有 精度有限。

如果是这样,比较两个浮点值的最佳方法是什么?

【问题讨论】:

标签: c# .net floating-point comparison


【解决方案1】:

以下扩展方法可能有助于实现 Kevin 的建议:

public static bool IsEqualTo(this double a, double b, double margin)
{
    return Math.Abs(a - b) < margin;
}

public static bool IsEqualTo(this double a, double b)
{
    return Math.Abs(a - b) < double.Epsilon;
}

所以现在你可以这样做了:

if(x1.IsEqualTo(x2)) ...
if(x1.IsEqualTo(x2, 0.01)) ...

如果需要,只需将IsEqualTo 更改为更合适的名称,或将默认边距更改为比double.Epsilon 更好的名称。

【讨论】:

    【解决方案2】:

    一般来说,浮点数应该使用类似的结构来比较

    if( abs((x1 - x2) < 0.001) )
    

    您引用警告的原因是您可能有两种计算方法,如果您没有舍入误差,它们可能相等,但舍入误差会使它们略有不同。

    【讨论】:

    • 改用abs(x1 - x2) &lt; 0.001 * x1
    • @Alexandre:为什么?如果您能给我们一些解释,将会很有帮助。
    • @user411768:这是因为“一般”。通常,您比较相对精度,而不是绝对精度。如果 x1 和 x2 大约为 10^-6,但 x1 是 x2 的五倍怎么办?您肯定不希望上述构造告诉您 x1 == x2。在某些情况下,绝对精度是正确的。题目很难。
    【解决方案3】:

    “最佳方法”取决于您为什么要比较数字的情况。一般来说,如果你想检查两个浮点数是否相等,那你就做错了。

    浮点数应该用于表示实际值,在这个词的两个意义上。这个物体和另一个物体的长度一样吗?好吧,它们可能看起来一样长,但如果你有足够好的测量设备,你总能找到不同之处。同样,两个浮点数永远不会相等,除非它们测量的是相同的东西,并且以完全相同的方式处理。除此之外,这只是系统某处的舍入误差。

    您可能想要检查它们是否接近(接近某个阈值),正如其他答案所建议的那样,但不相等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多