問題:
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中文網其他相關文章!