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 サイトの他の関連記事を参照してください。