round関数その8:RubyとPythonのround関数は奇妙じゃないんですか?
さて、今回はRubyとPythonの題名をつけてしまいましたけど、それらの言語だけに限らないような話題です*1。早速ですが、FreeBSD環境を用意してください(おそらくSPARC Solaris環境やMac OS X環境でも同じ結果だろうと思いますが、僕は確認していません)。
$ ruby -e 'x=0.49999999999999994; printf("%.19f\n%.19f\n", x, x.round());' 0.4999999999999999445 1.0000000000000000000 $ python -c 'x=0.49999999999999994; print "%.19f\n%.19f" % (x, round(x))' 0.4999999999999999445 1.0000000000000000000
どう見ても0.5未満の数を四捨五入して1になっています。環境は以下の通りです。
$ uname -mrs FreeBSD 6.1-RELEASE-p10 i386 $ ruby --version ruby 1.8.5 (2006-08-25) [i386-freebsd6] $ python -V Python 2.4.3
これは何度か話題にしているIntel系CPUの浮動小数レジスタが80bitある件と関係していますので、Intel Linuxで本現象が発生する環境は稀だろうと思います。
続きを読む