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

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

Mary-Kate Olsen
リリース: 2024-12-17 01:21:25
オリジナル
371 人が閲覧しました

Why Does Floating-Point Comparison in C Sometimes Produce Unexpected Results?

浮動小数点比較の異常

浮動小数点比較の概念は、特に float データ型を扱う場合に誤解を招く可能性があります。次の例を考えてみましょう。

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");
}
ログイン後にコピー

初期条件が false であるため、直感的には、このコードは「0 が正しい」と出力すると思われるかもしれません。しかし、驚くべきことに、実際の出力は「1 が正しい」です。

説明

説明は浮動小数点数の内部表現にあります。 C では、比較中に float は double に昇格され、double は float よりも正確です。その結果、float の 0.7 は double の 0.7 とまったく同じではありません。 0.7 (float として) が double に昇格すると、0.7 (double として) よりわずかに小さくなります。

一方、0.5 (float として) は double での正確な表現となります。精度。したがって、条件 b

解決策

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

  1. float を double に変更します: a と b を次のように宣言しますdouble の場合、比較中にそれらが昇格されないことを確認すると、期待どおりの動作が得られます。
  2. リテラルに f 接尾辞を追加: リテラルに接尾辞 f を追加することで、明示的に指定します。浮動小数点として扱う必要があるということです。これにより、比較中に 2 倍への昇格が防止されます。

これらの解決策のいずれかを実装することで、「0 が正しい」という目的の出力を得ることができます。

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

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