2024年2月12日月曜日

Excelのセルに「=1.3-1.2=0.1」と入力すると「TRUE」と正しく計算されます。一方「=1.2-1.1=0.1」と入力すると「FALSE」と正しく計算されません。何故でしょうか?

https://codejp.quora.com/Excel%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AB-1-3-1-2-0-1-%E3%81%A8%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B%E3%81%A8-TRUE-%E3%81%A8%E6%AD%A3%E3%81%97%E3%81%8F%E8%A8%88%E7%AE%97%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99-%E4%B8%80%E6%96%B9-1-2-1-1-0-1-%E3%81%A8%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B%E3%81%A8-FALSE-%E3%81%A8%E6%AD%A3%E3%81%97%E3%81%8F%E8%A8%88%E7%AE%97%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93-%E4%BD%95%E6%95%85%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B


並べ替え
 · 
フォロー

Excelだけでなくコンピュータの計算は基本的に2進数が採用されています。

2進法で考えると、10進数の0.1は無限小数なんですね。でも計算するときは有限の桁数ですからどこかで切り捨てます。だから2進法で表現した0.1は、真の(10進法の)0.1ではないんです。

「=1.3-1.2=0.1」の場合は、誤差が計算に使われている小数点以下の桁数に出てこないので「TRUE」となり、「=1.2-1.1=0.1」の場合は誤差出てきてしまって「FALSE」となります。特にTRUE、FALSEを返す式は「全く同じかどうかの判定」をするので誤差の影響が出やすいです。

私が長く勤めていた資産運用の業界では、小数点以下8桁くらいまでの精度で十分でしたが、それ以上の精度を求める場合はこのような演算誤差を考慮して計算式を組む必要があります。

 · 
フォロー

浮動小数点演算で発生する誤差のためです。

Excelで表示されるのは小数点以下15桁までになっていますが、もう少し桁数の多いPython(小数点以下17桁)で同じ計算をさせてみたところ…

と言う答えになりました。本来ならどっちでも0.1になるはずだけど、違う数字ですよね。これが浮動小数点演算の誤差です。このために比較するとFALSEになるわけです。

0 コメント:

コメントを投稿