hnwの日記

round関数その8:RubyとPythonのround関数は奇妙じゃないんですか?

さて、今回はRubyPythonの題名をつけてしまいましたけど、それらの言語だけに限らないような話題です*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で本現象が発生する環境は稀だろうと思います。

*1:今回の環境のPHPでも同じ挙動ですし、実はこの環境のlibmも同じ挙動です

続きを読む