質問:
System.Double.Epsilon の MSDN ドキュメントには次のように書かれています。それは、平等を判断するための差異のマージンとして使用されるべきではないということです。 Double.Epsilon は浮動小数点比較にどのように使用すべきですか?
回答:
MSDN の記述は誤解を招きます。 Double.Epsilon は、表現可能な最小のゼロ以外の浮動小数点値を表します。したがって、スタック オーバーフロー スレッド「float と double の比較に最も効果的な方法は何ですか?」で提供されている例のイプシロンとして使用できます。
等価性については、適切なイプシロンを Math として推定できます。 Max(Math.Abs(x), Math.Abs(y)) * 1E-15、ここで、x と y は比較される double 値です。ただし、切り捨て誤差が累積する可能性があるため、計算値を比較する場合には、より大きなイプシロンが必要になる可能性があることに注意することが重要です。
等価性を実装するには、より大きい、より小さい、以下、およびより大きい、またはと等しい場合は、次のコードを使用できます:
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 中国語 Web サイトの他の関連記事を参照してください。