2006年7月 5日

[ruby-list:42516] Re: Float/String#to_r /Re: floatの値がずれる

原です。

>坂野 正明です。

>Float#to_r は、昔、僕が投稿しました。
> [ruby-list:35966]
> http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/35966
>でも、当時は 1.6 対応だったので、Ruby 1.8 対応にしたものを、

>以下に添付します。String#to_r も含んでいます。

現在、ruby-devで拡張ライブラリrational:

http://blade.nagaokaut.ac.jp/~sinara/ruby/rational/

を、標準添付あるいは組み込みにしようと、調整を行っています。

ruby-devをrationalで検索すると、佃煮にするぐらいヒットします
が、例えば[ruby-dev:28509]あたりで始まるスレッドで少し様子が
わかると思います。

#ruby-1.8.5 に導入を目指していたんですが、間に合わないかな。

ところで、rational.so(このライブラリを仮にこう呼ぶ)では、
String#to_r、Float#to_r、(新)Rational#to_f などが実装されて
います。

String#to_rは坂野さんの[ruby-list:42510]と殆ど同じですが、
Float#to_rは違います。rational.soのFloat#to_rは、小数の内部
表現を有理数で表したもので、例えば、0.01.to_rは、
5764607523034235/576460752303423488のようになります。

さらにFloat#rationalizeというのも用意していて、例えば
r = 0.01.rationalizeというのは、r.to_f == 0.01 となるような
有理数rのうちで、もっとも分子分母の小さくなるもの(1/100)です。
実装(おおむね[ruby-dev:28566])はやや複雑ですが、精度をいっぱ
いにるので、to_r_sakano(坂野さんのto_r)より若干正確になりま
す。

100000000000000.1.to_r_sakano #=> 100000000000000/1
100000000000000.1.rationalize #=> 1000000000000001/10

もっともポリシーが違うので比較するのも何ですが。

というわけでrational.soに対するご意見をうかがえれば有り難い
です。


投稿者 xml-rpc : 2006年7月 5日 12:29
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/42444
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。