ホームページ > バックエンド開発 > C++ > C#のフローティングポイント算術は、一見等しい値を比較するときに予期しない結果を生成するのはなぜですか?

C#のフローティングポイント算術は、一見等しい値を比較するときに予期しない結果を生成するのはなぜですか?

Patricia Arquette
リリース: 2025-01-31 04:12:11
オリジナル
863 人が閲覧しました

Why Does Floating-Point Arithmetic in C# Produce Unexpected Results When Comparing Seemingly Equal Values?

c#フローティングポイント算術:精度と比較落とし穴

C#のフローティングポイント算術は、便利ですが、その有限表現のために固有の不正確さに苦しんでいます。 これは、一見等しい値を比較するときに予期しない結果につながる可能性があります。 この例を考えてみましょう:

出力は直感に反します。 なぜ? C#の32ビットフロートの精度は限られているためです(約23の有意ビット)。
<code class="language-csharp">class Program
{
    static void Main(string[] args)
    {
        float f1 = 0.09f * 100f;
        float f2 = 0.09f * 99.999999f;

        Console.WriteLine(f1 > f2); // Outputs "false"
    }
}</code>
ログイン後にコピー
を含む計算では、丸めエラーが導入されます。

0.09fは近くに表示されますが、丸い浮遊点表現はわずかに異なり、比較f1f2f1 > f2falseこれは、重大な制限を強調しています。浮動小数点数の直接的な平等または不平等の比較は信頼できません。 人間の観察に気付いていない微小な違いは、比較を引き起こす可能性があります。

これらの問題を回避するには、直接的な平等チェックを避けてください。代わりに、許容範囲ベースの比較を使用してください:

この関数は、2つのフロート間の絶対的な差が事前定義された

未満であるかどうかをチェックします。 適切な

を選択することは、コンテキストと予想される精度のレベルに依存します。 より高い精度を得るには、
<code class="language-csharp">bool AreApproximatelyEqual(float a, float b, float tolerance)
{
    return Math.Abs(a - b) < tolerance;
}</code>
ログイン後にコピー
の代わりに

を使用することを検討してください。 ただし、より正確ではあるものの、toleranceでも同様の制限があります。tolerance

以上がC#のフローティングポイント算術は、一見等しい値を比較するときに予期しない結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート