问题:
System.Double.Epsilon 的 MSDN 文档指出不应将其用作确定平等的差异幅度。如何使用 Double.Epsilon 进行浮点比较?
答案:
MSDN 的声明具有误导性。 Double.Epsilon 表示可表示的最小非零浮点值。因此,它可以用作 Stack Overflow 主题“What is the most effective way for float and double Comparison?”中提供的示例中的 epsilon
为了相等,可以将合适的 epsilon 估计为 Math. Max(Math.Abs(x), Math.Abs(y)) * 1E-15,其中 x 和 y 是要比较的双精度值。但是,请务必注意,截断错误可能会累积,因此在比较计算值时可能需要更大的 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; } public static bool GreaterThan(double x, double y) { double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15; return x > y + epsilon; } public static bool LessThan(double x, double y) { double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15; return x < y - epsilon; } public static bool LessThanOrEqualTo(double x, double y) { double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15; return x <= y + epsilon; } public static bool GreaterThanOrEqualTo(double x, double y) { double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15; return x >= y - epsilon; }
以上是如何使用 Double.Epsilon 进行精确的浮点比较?的详细内容。更多信息请关注PHP中文网其他相关文章!