ホームページ >バックエンド開発 >C++ >C で float を比較すると予期しない結果が生じる場合があるのはなぜですか?

C で float を比較すると予期しない結果が生じる場合があるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-19 04:18:09517ブラウズ

Why Does Comparing Floats in C   Sometimes Produce Unexpected Results?

C での浮動小数点比較を理解する

C で浮動小数点値を比較するときは、浮動小数点値の潜在的な不正確さに注意することが重要です。精度が限られています。提供されているコード スニペットでは、浮動小数点 a および b を定数 0.7 および 0.5 とそれぞれ比較すると、予期しない出力「1 が正しい」が観察されます。

予期しない出力の原因:

この問題は次の理由で発生します。理由:

  • 暗黙的な型変換: float を double と比較する場合 (例: if (a < 0.7))、または float を double であるリテラル定数と比較する場合(例: if (a
  • 浮動小数点の精度の制限: 浮動小数点は倍精度浮動小数点数よりも精度が低いため、正確に表現できる小数点以下の桁数が少なくなります。その結果、float としての 0.7 は double としての 0.7 とまったく同じではない可能性があります。
  • 定数の正確な表現: 2 の累乗である 0.5 のような定数は、次のように正確に表現できます。浮動小数点と倍精度浮動小数点数。したがって、b< b がわずかに不正確な浮動小数点数であっても、0.5 は false のままです。

解決策:

期待される出力を取得するには、次のいずれかを実行できます:

  • Double を使用: 変数 a と b を double に変更します(double a = 0.7; double b = 0.5;).
  • 浮動小数点リテラルを使用する: 定数を浮動小数点リテラルに変更します (if (a < 0.7f) および if (b < 0.5f))。これにより、比較全体で強制的に float が使用されます。

期待される出力を含むコード:

int main()
{
    double a = 0.7;
    double b = 0.5;
    if (a < 0.7)
    {
        if (b < 0.5)
            printf("2 are right");
        else
            printf("1 is right");
    }
    else
        printf("0 are right");
}

この修正されたコードでは、a と b の比較は次のようになります。それぞれの double により正確な精度が保証され、「0 は正しい」という期待される出力が得られます。

以上がC で float を比較すると予期しない結果が生じる場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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