Ruby の浮動小数点リテラルの精度を直した
http://www.rubyist.net/~matz/20070803.html#p04
コメント欄ではshiroさんが、「How to Read Floating Point Numbers Accurately (1990)」 by William D. Clingerという論文を紹介していた。
せっかくもらった情報なんで、Rubyでもちゃんと実装したいんだが、 私がやっても(算数的素養の無さから)グダグダに してしまいそうなんで、だれか手をあげてくれるとうれしいなあ。他力本願モード。
と Matz さんが書いていたので、論文を読みながらいろいろと試行錯誤してみたが、現状のコードを元に必要な精度を出すのは無理という結論に。
そこで調べてみると、ベル研の David M. Gay という人がすでに実装してることがわかった。
その実装を Ruby 本体に取り込むパッチを書いて送ったら、1.9に取り込んでもらえた。
パッチ前
$ uname -mrs Darwin 8.10.1 i386 $ ./ruby -v ruby 1.9.0 (2007-08-21 patchlevel 0) [i686-darwin8.10.1] $ ./ruby -e 'printf("%21.0f\n",36893488147419107329.0)' 36893488147419103232
パッチ後
$ ./ruby -v ruby 1.9.0 (2007-08-22 patchlevel 0) [i686-darwin8.10.1] $ ./ruby -e 'printf("%21.0f\n",36893488147419107329.0)' 36893488147419111424