首页 >后端开发 >C++ >我应该使用 Double.Epsilon 进行浮点比较吗?

我应该使用 Double.Epsilon 进行浮点比较吗?

Linda Hamilton
Linda Hamilton原创
2025-01-05 04:58:42495浏览

Should I Use Double.Epsilon for Floating-Point Comparisons?

浮点比较中的 Double.Epsilon

问题:

MSDN 文档Double.Epsilon 声明不应使用它来确定浮点数之间的相等性。然而,一些资源建议使用它进行比较。是否可以使用 Double.Epsilon 进行相等和其他比较,例如大于和小于?

答案:

Epsilon 值表示最小的可表示非- 除 0 以外的非正规浮点值。虽然在比较中它似乎是 epsilon 的自然候选者,但它不够精确目的。

Double.Epsilon 反映了最小的可表示截断误差,但它根据所比较的数字的大小而变化很大。例如,对于两个接近 1 的数字,Double.Epsilon 可能是 0.0000000000000002220446,而对于两个接近 1,000,000,000,000,000 的数字,它可能是 222,044,604,925,093,800。这意味着依赖 Double.Epsilon 进行相等或其他比较不会提供一致的结果。

相等的替代 Epsilon 估计:

比较浮动的一种推荐方法 -相等的点值是使用常量 * 1E-15 的 epsilon。这近似表明 Double 类型可以精确地表示 15 位数字的值。例如:

public static bool AboutEqual(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return Math.Abs(x - y) <= epsilon;
}

比较运算符:

虽然Double.Epsilon不能直接用于比较,但AboutEqual方法可以适配大于、小于、小于或等于、大于或等于:

  • 大于:x > y && !AboutEqual(x, y)
  • 小于:x
  • 小于或等于:AboutEqual(x, y) || x
  • 大于或等于:AboutEqual(x, y) || x> y

其他注意事项:

需要注意的是,截断错误可能会累积,尤其是在处理计算值时。因此,您可能需要相应地调整 epsilon 值以达到合适的精度。

以上是我应该使用 Double.Epsilon 进行浮点比较吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn