[#20227] dyna_vars problem? — Tanaka Akira <akr@...17n.org>

しばらく前から、稀に Ruby が core を吐くという問題を追いかけているので

15 messages 2003/05/19
[#20234] Re: dyna_vars problem? — matz@... (Yukihiro Matsumoto) 2003/05/19

まつもと ゆきひろです

[#20236] Re: dyna_vars problem? — Tanaka Akira <akr@...17n.org> 2003/05/19

In article <1053363181.529491.30320.nullmailer@picachu.netlab.jp>,

[ruby-dev:20178] Re: Numeric#step

From: matz@... (Yukihiro Matsumoto)
Date: 2003-05-07 07:32:18 UTC
List: ruby-dev #20178
まつもと ゆきひろです

In message "[ruby-dev:20177] Re: Numeric#step"
    on 03/05/07, Masahiro TANAKA <masa@ir.isas.ac.jp> writes:
|
|At Wed, 7 May 2003 00:02:54 +0900,
|Tanaka Akira wrote:
|> なんとなく、
|> 
|> % ruby -ve '1.1.step(1.4, 0.1) {|n| printf("%.20f\n", n) }'
|> ruby 1.8.0 (2003-05-06) [i686-linux]
|> 1.10000000000000008882
|> 1.20000000000000017764
|> 1.30000000000000004441
|> % 
|
|誤差の出し方を以下のようにすべきのような気がしてきました。
|
|	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<n; i++) {
|	    rb_yield(rb_float_new(i*unit+beg));
|	}

ああ、これで問題解決しました。やっぱり、ない頭で試行錯誤して
も無駄ですねえ。

In This Thread

Prev Next