2006年7月 5日

[ruby-list:42520] Re: float の値がずれる

斎藤と申します。皆さんBigDecimal嫌いなのかな :-(

On Tue, 4 Jul 2006 21:58:45 +0900
Shin-ichiro HARA <sinara@xxxxx> wrote:

> 拡張ライブラリ[RAA:rational]を使って
>
> require "rational"

> class Float
> def +(o)
> (rationalize + o.rationalize).to_f
> end
> end
> x = [0.0]
> 100.times { x << (x[-1] + 0.001) }
> p x

もちろんいろいろな考えがあるとは思うのですが、「小数は有理数である」
という思考の段階を一段踏まなければならないというのは(とりあえず
自分に取っては)直観に反するような気もします。やはりここはBigDecimalの
出番ではないでしょうか。

さらに実装の都合上、どうがんばってもRationalの方が(下では10倍以上)
遅いです。 Floatの誤差の問題でRationalの利用を推奨する理由はあまりない
ように思うのですが…。逆にメリットがあるなら、教えていただけると幸いです。

$ time ruby -rrational -e 'class Float; def +(o);
(rationalize + o.rationalize).to_f; end; end
x = [0.0]; 10000.times { x << (x[-1] + 0.001) }'

real 0m1.586s
user 0m1.528s
sys 0m0.024s
$ time ruby -rbigdecimal -e 'x = [BigDecimal("0")];
10000.times { x << (x[-1] + BigDecimal("0.001")) }'

real 0m0.127s
user 0m0.085s
sys 0m0.016s

--
斎藤ただし

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




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