2006年7月 4日

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

hirocyです.るびきちさん,ありがとうございます.

On Tue, 4 Jul 2006 18:51:38 +0900,
rubikitch wrote:
>> floatをどんどん加算していくと,ときどき期待する値からずれることがあり
>> ます.
>> # rubyの問題ではないかもしれませんが...
>

> これはruby以前の問題で、浮動小数点数の仕様(丸め誤差)です。
> 10進数で1/3が無限小数になるように、2進数で0.001は無限小数になるのです。

ああ,やはりそういうレベルでのお話でしたか.失礼いたしました.
恥のかきついでに,もうちょっとつっこませてください.

> 1回の演算ごとに丸め誤差が生じるので浮動小数点数演算の回数を減らす。
> または、固定小数点数ライブラリ(BigDecimal)を使ってみましょう。

なるほど.前者をふまえて(?)このようにしてみました.

x = [0.0]
100.times { x << (x[-1] * 10**3).floor * 10**(-3) + 0.001 }
p x

浮動小数点数での演算の前に,一旦intにしてきれいに(?)すると,
うまくいきました.

でもどうも泥臭いので,浮動小数点数をきれいにするエレガントな
方法(メソッド)はないでしょうか?
ずっと加算し続けて丸め誤差がたまってしまった浮動小数点数を,
まだ誤差の少ない状態に戻す方法です.代入し直すようなイメージで.
つまり,
x = 0.001 + 0.001
を,
x = 0.002
と等価にする方法なのですが.

--
// hirocy

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




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