浮点比较中的 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方法可以适配大于、小于、小于或等于、大于或等于:
其他注意事项:
需要注意的是,截断错误可能会累积,尤其是在处理计算值时。因此,您可能需要相应地调整 epsilon 值以达到合适的精度。
以上是我应该使用 Double.Epsilon 进行浮点比较吗?的详细内容。更多信息请关注PHP中文网其他相关文章!