[#42503] floatの値がずれる — Sato Hiroshi <hirocy.f01@...>

hirocyと申します.

33 messages 2006/07/04
[#42504] Re: floatの値がずれる — rubikitch <rubikitch@...> 2006/07/04

From: Sato Hiroshi <hirocy.f01@plala.to>

[#42505] Re: floatの値がずれる — Sato Hiroshi <hirocy.f01@...> 2006/07/04

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

[#42569] JVN、スクリプト言語「Ruby」の2件の脆弱性情報を公表 — Takahiro Kambe <taca@...>

こんばんは。

19 messages 2006/07/11
[#42570] Re: JVN、スクリプト言語「Ruby」の2件の脆弱性情報を公表 — Yukihiro Matsumoto <matz@...> 2006/07/11

まつもと ゆきひろです

[#42572] Re: JVN、スクリプト言語「Ruby」の2件の脆弱性情報を公表 — Takahiro Kambe <taca@...> 2006/07/11

In message <1152619872.835566.21152.nullmailer@x31.priv.netlab.jp>

[#42575] Re: JVN、スクリプト言語「Ruby」の2件の脆弱性情報を公表 — Yukihiro Matsumoto <matz@...> 2006/07/11

まつもと ゆきひろです

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

From: Sato Hiroshi <hirocy.f01@...>
Date: 2006-07-04 10:20:18 UTC
List: ruby-list #42505
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

In This Thread