自然な言語を目指して

技術・日常をぐだぐだと

WEBプログラマーの僕が研究でつまづいたこと

WEBプログラマーの僕が研究でつまづいたこと

今回は普段WEB開発ばかりしている僕が研究のプログラムでつまづいたことを書いていきます。

簡単な事だったのですが、理解するのに複雑なプログラムの実装だったため、デバッグしていたら1,2時間はかかってしまいました。

実はプログラムって…

浮動小数の等値比較に誤差があるんです。

簡単に言うと、プログラム的には 0.1 + 0.3 == 0.4はTrueにはならないのです。

どういうことかというと、

print 0.1 + 0.2 == 0.3

このプログラムの実行結果はFalseになるわけです。

これは浮動小数点数には誤差があるためなんですね。

解決策としては

Pythonならば

print round(0.1 + 0.2,10) == 0.3

roundの第二引数では小数の何桁目で誤差を丸めるかを行っています。

ちなみに17桁目で誤差が出るようです。

Rubyならば

print (0.1+0.2).round(10) == 0.3

どっちもroundメソッドで丸めこめば良いのですねー。

感想

本当はプログラマーなら誰しもが知る常識問題らしいのですが、Web系のプログラムばかり書いていたので、浮動小数の比較あまり使ったことがなかったんですね(言い訳)。

使ったとしても、大なりイコールとかなんです。0.2 <= i みたいな。

参考URL

http://inudaiskii.blogspot.jp/2013/08/python_12.html

https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/