1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Excelにみる計算誤差とIEEE仕様と工夫について

Posted at

エクセルで次の計算式をさせると、正しくない結果を出します。

image.png

エクセル97のような古いバージョンだと、0.1 + 0.1 + 0.1 程度の書き方でも 0.3 じゃない、となっていたと思います。
この 0.3 にならないというのは、パソコンではむしろ当たり前のもので、そもそも 0.1 という数値を 0.1 として保持できない、というCPUの仕様によります。
根本的な対策はあり、decimalというのを利用するようにすることで解決できます。なぜそうしないかというと、計算するのに時間がかかるからです。
とはいっても、今の時代のCPUは速いのに、なぜかdecimalを使わないというのが世界的な謎だったりしますが・・・

さて、現代ではどうかというと、最新のExcelではIEEE仕様に準拠するというのは変わらないはずなのですが、 0.1 + 0.1 + 0.1 は 0.3 と等しい、となっています。
対策を講じたんだな、もしかしたらdecimal型にした?とも思ったのですが、念のため次のように
0.3 - 0.1 - 0.1 - 0.1 = 0
とすると、残念ながら・・・という結果でした。
計算の仕様としてはIEEE仕様に準拠したのでしょうが、なにかロジック的な工夫で誤差が表面化しないようにしたのかもしれません。

ちなみに、私もこの内部処理を1から作ったことがあるので、ごまかし方を1つ。
B列で、計算中は誤差が生じたまま計算をするのですが、計算結果が出たら、計算結果を丸める、というものです。
この例でIF文を使っているのはまさにその為です。
IF文は計算中なので、誤差があるままです。なので 0 ではない、となります。
ですが、例えば計算式を
= 0.3 - 0.1 - 0.1 - 0.1
とすると、 0 になります。
これは、エクセルの実際の方法までは知りませんが、私は小数第15桁で丸める、とすることでほどよく、人間がOK!となる結果だったため、計算結果を丸めるようにしました。
当時、このことを伝えて、一応decimalで2分木を演算するオプションも用意したのですが、(割り算を分数として内部表記して、計算し、計算結果の分数を小数にする、というオプションも。これだと 1 / 3 * 3 が 1 になる!)結局使われませんでした・・・

double型の特有の問題なのですが、double型の保持状態を10進数で表現する、というのを作ったこともありました。
なかなか奥が深いです・・・

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?