From: rubikitch Date: 2005-11-08T23:18:42+09:00 Subject: [ruby-list:41516] Re: Float と有効精度 /Re: 数を減らしてくループ From: Masaaki Sakano Subject: [ruby-list:41514] Float と有効精度 /Re: 数を減らしてくループ Date: Tue, 8 Nov 2005 23:01:15 +0900 るびきちです。 > > > とすべきというのが,誤差の蓄積を避けて精度を確保するための定石 > > > とされてますね. > > 自分のあまりの無知さが恥ずかしい限りです。 > > 恐縮することは全然ないと個人的には思います。 > ruby-list でも、何度も出てきた話題、つまり引っ掛かりやすい点ですし。 > > 誤差が蓄積するような仕様は、C や Fortran のような実行速度命の > 言語なら理解できます(し、そうあるべきだとも思います)が、Ruby ほどの > 高級言語では、この点の思考コストは相当なものがある、と個人的には > 考えます。 同意です。 気になったのでソースを覗いてみたら、誤差を考慮した実装になっていますね。 なので、Float#stepは問題なく使えると思います。 static VALUE num_step(argc, argv, from) int argc; VALUE *argv; VALUE from; { // 略 else if (TYPE(from) == T_FLOAT || TYPE(to) == T_FLOAT || TYPE(step) == T_FLOAT) { const double epsilon = DBL_EPSILON; double beg = NUM2DBL(from); double end = NUM2DBL(to); double unit = NUM2DBL(step); double n = (end - beg)/unit; double err = (fabs(beg) + fabs(end) + fabs(end-beg)) / fabs(unit) * epsilon; long i; if (err>0.5) err=0.5; n = floor(n + err) + 1; for (i=0; i