ホームページ >バックエンド開発 >C++ >「float」値と「double」値を比較すると、同一に見える場合でも「false」が返される場合があるのはなぜですか?

「float」値と「double」値を比較すると、同一に見える場合でも「false」が返される場合があるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-01 18:19:30763ブラウズ

Why does comparing `float` and `double` values sometimes return `false` even when they appear identical?

Double および Float データ型を比較す​​ると予期しない結果が発生する

倍精度浮動小数点数 (double) と単精度浮動小数点数を比較する場合数値 (浮動小数点数) の場合、予期しない結果が発生する可能性があります。具体的には、float 変数 f と double 変数 d の間の等価性チェック (f == d) は、両方の値が同一に見えても false を返すことがあります。

この動作は、float 変数に関連する 2 つの基本的な要因に起因します。ポイント数: 精度と丸め。

精度と丸め誤差

  • 精度: 浮動小数点数は限られた桁数を格納します、それによって表現できる値の精度が決まります。 10 進数の 1/3 などの特定の数値は、無限小数表現を持ち、精度を落とさずに正確に保存することはできません。
  • 丸め: 浮動小数点値が 2 進数に変換される場合、特定の 10 進数値を正確に表現できない場合があります。たとえば、10 進数の 0.1 は、2 進数では無限の数字のシーケンスとして表現されます。その結果、浮動小数点数はその有限内に収まるように丸められます。

等価性チェックの意味

浮動小数点数に固有の精度と丸め -ポイント番号は、特に互いに非常に近い値を比較する場合に、丸め誤差を引き起こす可能性があります。これらのエラーが蓄積すると、等価比較が失敗します。このため、浮動小数点数の直接の等価性チェックは信頼性が低く、偽陰性が発生しやすくなります。

解決策: Epsilon と比較

等価性チェックを使用する代わりに、より信頼性の高い浮動小数点数を比較する方法は、浮動小数点数間の絶対差を取得し、それがイプシロン (ε) として知られる小さな値を下回っているかどうかを確認することです。これにより、丸め誤差を考慮し、その差がアプリケーションにとって重要かどうかを判断できます。

if (abs(x - y) < epsilon)

以上が「float」値と「double」値を比較すると、同一に見える場合でも「false」が返される場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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