用於相等和比較運算的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; }<的等式比較時,您可以根據比較值的大小使用較小的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中文網其他相關文章!