ホームページ >バックエンド開発 >C++ >Double.Epsilon は浮動小数点数を比較するための適切なツールですか?

Double.Epsilon は浮動小数点数を比較するための適切なツールですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-05 02:58:39750ブラウズ

Is Double.Epsilon the Right Tool for Comparing Floating-Point Numbers?

Double.Epsilon: 数値的等号と不等式の信頼できる精度の尺度

はじめに

「イプシロン」の概念は、数値解析において比較する際に重要な役割を果たします。浮動小数点数。 System.Double クラスで定義されている定数 Double.Epsilon は、ゼロより大きい、表現可能な最小の正の浮動小数点値を表します。

Double.Epsilon は直接比較に使用できますか?

MSDN ドキュメントの記述に反して、Double.Epsilon を直接使用して 2 つの値が等しいかどうかを判断することはできません。浮動小数点数。これは、カスタム アルゴリズムで許容できる差異のしきい値として機能しますが、数値的等価性の正確な尺度は提供されません。実際的な目的では、別のアプローチをお勧めします。 2 つの double 値 x と y が等しいかどうかを比較するには、通常、ほぼ一定 * 1E-15 のイプシロン値が使用されます。このイプシロンは Double データ型の固有の精度制限を考慮しており、有効桁数 15 桁までの精度が可能です。

切り捨てエラーへの対処

ただし、計算値を使用する場合は、切り捨てエラーが発生する可能性を考慮することが重要です。このような場合、累積誤差の可能性に対応するためにイプシロン値を増やす必要がある場合があります。
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;
}

不等式比較の実装

不等式比較 (より大きい、より小さい) 、以下、以上)、同様の原則が適用されます。同じイプシロン値は、潜在的なエラーを考慮して十分に大きい値であることを確認して、慎重に使用できます。

結論

Double.Epsilon は、浮動小数点精度の参照点であるため、直接の等価比較に依存すべきではありません。切り捨て誤差を適切に調整したイプシロンベースのアプローチを採用することで、開発者は double を利用する際に信頼性が高く正確な数値比較を保証できます。
// Greater than
bool gt = x > (y + epsilon);

// Less than
bool lt = x < (y - epsilon);

// Less than or equal to
bool lte = x <= (y + epsilon);

// Greater than or equal to
bool gte = x >= (y - epsilon);

以上がDouble.Epsilon は浮動小数点数を比較するための適切なツールですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。