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

浮動小数点の比較で予期しない結果が生じるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-25 02:20:09315ブラウズ

Why Does My Floating-Point Comparison Produce Unexpected Results?

浮動小数点比較の不一致

提供されたコード スニペットでは、

int main()
{
    float a = 0.7;
    float 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");
}

「0」の期待される出力は次のとおりです。正しい」が得られません。代わりに、「1 が正しい」と表示されます。この不一致は、浮動小数点数に固有の不精度が原因で発生します。

浮動小数点オペランドとの比較を実行すると、浮動小数点オペランドは自動的に倍精度値に昇格されます。浮動小数点数は倍精度浮動小数点より精度が低いため、意図した値を正確に表現できない場合があります。この場合、a (float) が 0.7 (double) と比較されると、a は内部で double に変換され、精度が失われます。この結果、a は 0.7 よりわずかに小さくなり、a

この問題を解決するには、次のいずれかを実行できます:

  • float を double に変更します:
double a = 0.7;
double b = 0.5;
  • 「f」を含む浮動リテラルを使用するsuffix:
float a = 0.7f;
float b = 0.5f;

どちらのアプローチでも、オペランドが浮動小数点数として維持され、double への昇格時の精度の低下が回避されます。

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

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