ホームページ > バックエンド開発 > C++ > C#の浮動小数点比較が予期しない結果をもたらすのはなぜですか?

C#の浮動小数点比較が予期しない結果をもたらすのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-31 04:07:36
オリジナル
560 人が閲覧しました

Why Do Floating Point Comparisons in C# Sometimes Yield Unexpected Results?

c# C#などの多くのプログラミング言語では、小数を表すために浮動小数点の数が使用されます。ただし、コンピューター内のフローティングポイント数の表現が限られているため、これらの数値には精度の問題があります。

次の手順を検討してください:

このプログラムはfalseを出力します。これは、0.09

100が0.09
class Program
{
    static void Main(string[] args)
    {
        float f1 = 0.09f * 100f;
        float f2 = 0.09f * 99.999999f;

        Console.WriteLine(f1 > f2);
    }
}
ログイン後にコピー
99.999999を超えると矛盾していると思われます。

精度の問題を理解してください

この精度の理由は、フローティングポイント数がメモリで表現される方法です。これらのデジタルストレージは、テール番号(小数部)、インデックス(ベースのパワー)、およびシンボルの組み合わせです。ただし、テール番号の精度は限られています。 C#では、シングルプレシジョンフローティングポイント番号(FLOAT)の23桁、デュアル - 受典フローティングポイント数(double)には52ビットテール番号があります。エンディング番号を正確に表現できない場合、それは4つの家と5つの家に入り、数字を表すために最も近いものになります。 上記の例では、0.09

100の精度は9.000000190734863ですが、精度が制限されているため、32ビットフロートから9.0で表されます。同様に、0.09 99.999999 4軒の家、5つの5つは9.0です。その結果、これらの2つの値は比較的等しく、プログラムはFALSEを出力します。

この精度を低下させるために、IEEE 754フローティングポイント操作標準では、「エプシロン」の概念を導入します。つまり、最小前方振動ポイントを変更せずに1.0に追加できます。 C#では、この値は約1.4013E-45です。

2つの浮遊点数値の差をエプシロンと比較することにより、浮動小数点の精度範囲内での有効性に対して有効であるかどうかを判断できます。

以上がC#の浮動小数点比較が予期しない結果をもたらすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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