PSM

Pプログラミング S初心者の Mメモ書き

0.3 != 3*0.1問題


pythonで以下のように書くと

>>> 0.3 == 3 * 0.1
False

とかえってきます.

いや0.3が0.3じゃないってどういうことやねんと思っていろいろ調べてみると

>>> 0.1 + 0.1 + 0.1
0.30000000000000004

なるほど.
つまりpythonの0.1や0.3が,人間の思っているようなぴったり(0.00000000000000001の狂いもなく)0.1や0.3ではなく,ちょっとずれているというのが原因らしいですね.
そういえば、二進数の浮動小数点として扱うために近似しているという話を聞いたことがあるのでwikiセンセに聞いてみました.

(1*1/3の結果について)
しかし、実際にはコンピュータや電卓では 0.9999999999999999 のような結果となり、場合によっては 0.99999999923475 のような値になることもある。「実数型」などという概念は、それ自体が誤謬であるとも言える。
後者の値はバグの存在を示しているわけではなく、二進法の浮動小数点数による近似の結果生じるのである。ある種の任意精度演算系や、何らかの数式処理システムでそういった演算に対応している場合は、1 や 0.9999999999999999... という結果が得られるものもある。
Wikipedia:コンピュータの数値表現

はい,そういうことらしいですね.
99.9999%,つまりほとんど100%のことをシックス・ナインなどと言ったりするようですが,コンピュータは6桁どころではない十分に小さな誤差で整数を表現しているとのことです・

ちなみに

>>> 1 == 2 * 0.5
True

だったりします.
つまり1は0.5を2倍した数であるために,上で出てきたような”ほんのちょっとのズレ”もちょうど2倍されて等しくなるということですか.
なるほど.

それでは.