【プログラミング】丸め誤差とか言う呪い

ある日プログラムを書いていると不思議な現象にあいました。
例えば、エクセルファイルをプログラムで読み込もうとしたとき、「230」という値が、プログラムで数値として読み込むと「299.999999999996」という、、 え?

”この現象は10進数を2進数にコンピュータが直すときに発生してしまいます。”

あちゃー、コンピュータでは、このようなことが多くあります。しかも小数点や数字の桁が大きくなるに連れ丸め誤差になることが頻繁に発生してしますのです。
では、なぜこの様になってしまうのでしょうか。
コンピュータにこのような計算をさせてみましょう。


0.3-0.2
>> 0.09999999999999998
正解は「0.1」になるはずですが、0.1にはなりません。
う~ん実はコンピュータって馬鹿なんすね。

実はこの誤差は、単精浮動小数点という32bitで数字を表現するもので、32bitでは表現しきれなかったために生じてしまうものなのです。
そのため、0.2は2進数ではとんでもない無限小数になってしまうのです。
このことから、エクセルファイルを開くプログラムが「230」を単精浮動小数点で読み込み、丸め誤差が生じてしまったのではないかと考えます。

ですので私は、この問題の応急措置として、API開発のJSON(コンピュータ同士のやりとりなどにつかう形式)のやりとりにおいて、精密さを求め直前まで計算しない値については、文字列(人間のわかる型にとどめて)に置き換えています。
そうすると、文字列は欠落してしまうことがないのでこの問題が発生しません。

Windowsなどの電卓や、計算ソフトウェアなどでは、このようなことを想定し、処理を行なっています。 このような問題を解決するために、64bit の倍精度の浮動小数点というものや、逆に表す桁が少ないものもあります。
そう考えると、実はコンピュータの内部には、色々な数値の型があり人間の脳はこれを1つの数値で扱っていることがすごいなって思います。

そういえば、量子コンピュータはどうなるのでしょうか、気になりますね。

===参考文献===