ホームページ > バックエンド開発 > C++ > 浮動小数点の比較が不正確になるのはなぜですか?正しい結果を保証するにはどうすればよいですか?

浮動小数点の比較が不正確になるのはなぜですか?正しい結果を保証するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-19 17:26:10
オリジナル
1010 人が閲覧しました

Why Are Floating-Point Comparisons Inaccurate, and How Can I Ensure Correct Results?

浮動小数点比較の混乱

指定されたコード スニペットでは、浮動小数点数間の比較チェックは予想されるほど単純ではありません。 。浮動小数点の比較を扱う場合、浮動小数点の表現と、それによって生じる潜在的な落とし穴を理解することが重要です。

浮動小数点の落とし穴

次の問題コードは浮動小数点数の比較にあります。浮動小数点数は、有限数のビットを使用して大きさと指数の両方を表すバイナリ形式で格納されます。これは、浮動小数点数が特定の値を表す精度に固有の制限があり、丸め誤差が生じることを意味します。

提供されたコードでは、変数 a と b は両方とも浮動小数点数として定義されています。 a と 0.7 を比較する場合、コンパイラは比較のために float を double に昇格します。 a の double 表現が正確に 0.7 に等しくない可能性があるため、この型昇格により精度が失われる可能性があります。さらに、0.5 は正確な 2 の累乗であり、浮動小数点形式で正確に表現できます。

その結果、比較 a < a の double への昇格と 0.7 の不正確な表現により、0.7 は true と評価されます。これは、予期された「0 が正しい」ではなく、「1 が正しい」という予期しない出力を説明しています。

正しい比較を確保する

このような問題を回避するには、次の 2 つがあります。可能なアプローチ:

  • float の代わりに double を使用します: a と b を double (double a = 0.7; double b = 0.5;) として定義すると、比較が double の完全な精度で実行されるようになり、丸め誤差のリスクが軽減されます。
  • 浮動小数点接尾辞を使用します: または、f 接尾辞を浮動小数点リテラルに追加して、コンパイラに浮動小数点リテラルを強制的に次のように扱うこともできます。比較中に浮動します。このアプローチにより、正しい精度を確保しながら float 型を維持できます: if (a

以上が浮動小数点の比較が不正確になるのはなぜですか?正しい結果を保証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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