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