使用 Double.Epsilon 确定浮点数的相等性
MSDN 文档建议使用大于 Double.Epsilon 常量的值来建立确定两个浮点数是否相等时可接受的绝对差值。然而,这个建议引起了一些混乱。
Double.Epsilon 在比较中有实际用途吗?
MSDN 的措辞导致了对 Double 实际用途的误解。埃普西隆。如提供的答案中所述,Double.Epsilon 表示最小的可表示非非正规浮点值,不为 0。它仅表示截断误差的最小大小,而不是可接受的比较余量。
计算适合相等比较的 Epsilon
对于相等比较,更实用的方法是使用 epsilon基于所比较的值的大小。例如:
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; }
此方法使用两个数字的绝对值中较大的一个乘以一个小常数 (1E-15) 来确定可接受的比较余量。
考虑大于和小于比较
对于大于或小于等比较,原理相同适用。 epsilon 应根据比较数字的大小来计算,以考虑潜在的截断错误。
相等和不等式比较的最佳实现
总之,Double .Epsilon 不能直接用作浮点比较的可接受的相等、大于、小于、小于或等于或大于或等于比较的余量数字。相反,应该计算特定于上下文的 epsilon 以确保准确的比较。
以上是我应该如何比较浮点数的相等和不相等?的详细内容。更多信息请关注PHP中文网其他相关文章!