ホームページ >バックエンド開発 >C++ >「float == double」が常に機能しないのはなぜですか?

「float == double」が常に機能しないのはなぜですか?

DDD
DDDオリジナル
2024-11-01 04:37:28568ブラウズ

Why Doesn't `float == double` Always Work?

Double と Float の比較: 予期しない結果が生じる理由

Double や float などの浮動小数点数は、数値計算において重要な役割を果たします。ただし、これらの型を比較す​​ると、以下のコード スニペットに示すように、不可解な結果が生じる可能性があります。

<code class="python">float f = 1.1
double d = 1.1
if (f == d):  # returns false!</code>

この予期しない動作は、精度と丸めという 2 つの基本的な要素に起因します。

精度:

浮動小数点数の精度は有限であるため、正確に表現できる桁数が制限されます。精度の高い数値にはより多くのメモリが必要ですが、浮動小数点変数では必ずしも実現可能であるとは限りません。

たとえば、10 進数の分数 1/3 (0.33333...) は 32 ビットでは正確に表現できません。フロート。これは 0.3333333333333333 として近似して保存する必要があり、その結果、精度がわずかに失われます。

丸め:

2 進数と 10 進数には固有の違いがあります。 10 進数で簡単に表現できる分数 (例: 1/10 を 0.1) は、多くの場合、2 進数での複雑な表現 (例: 1/10 を 0.0001100110011...) で表現する必要があります。

この不一致により、丸め誤差が生じます。浮動小数点値はメモリ制限内に収まるように切り捨てられます。その結果、コード例の 0.1 の表現は、double に格納されている 0.1 と正確に等しくない可能性があります。

結論:

精度と丸めの問題により、等価 (==) を使用して double と float を比較することは信頼できません。代わりに、より堅牢なアプローチは、それらの絶対差を許容可能なイプシロン値と比較することです。これにより、差が許容範囲内に収まることが保証されます。

<code class="python">if abs(f - d) < epsilon:  # epsilon is a small threshold</code>

このアプローチにより、比較が精度や丸め誤差の影響を受けなくなり、正確で一貫した結果が得られます。

以上が「float == double」が常に機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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