用于相等和比较运算的 Double.Epsilon
Double.Epsilon 常量保存最小的正浮点数可以表示为双精度数而不舍入为零的数字。它旨在作为浮点比较的指南,但其文档可能会令人困惑。
Double.Epsilon 可以用于直接比较吗?
不能。 Double.Epsilon 定义可能的最小截断误差。这意味着在执行数学运算时,由于四舍五入,浮点数可能相差超过 Double.Epsilon。因此,使用 Double.Epsilon 进行直接比较可能无法准确反映数学相等性。
准确比较的替代方案
考虑以下替代方案:
public static bool ApproximatelyEqual(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 ApproximatelyEqualRelative(double x, double y, double tolerance) { return Math.Abs(x - y) / Math.Max(Math.Abs(x), Math.Abs(y)) <= tolerance; }
其他比较操作的实现
要实现大于 (>) 和小于 (<) 比较,请反转用于的逻辑相等:
大于:
public static bool GreaterThan(double x, double y) { return ApproximatelyEqualRelative(x - y, y, 1E-15) > 0; }
小于比:
public static bool LessThan(double x, double y) { return ApproximatelyEqualRelative(x - y, y, 1E-15) < 0; }
对于大于或等于(>=)和小于或等于(<=)比较,相应修改上述实现:
public static bool GreaterThanOrEqual(double x, double y) { return ApproximatelyEqualRelative(x - y, y, 1E-15) >= 0; } public static bool LessThanOrEqual(double x, double y) { return ApproximatelyEqualRelative(x - y, y, 1E-15) <= 0; }
请记住,这些实现只是近似值,在需要精确比较的情况下应谨慎使用至关重要。
以上是何时以及如何使用 Double.Epsilon 来比较双精度浮点数?的详细内容。更多信息请关注PHP中文网其他相关文章!