[#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:20167] Re: Numeric#step

From: Koji Arai <JCA02266@...>
Date: 2003-05-05 15:53:05 UTC
List: ruby-dev #20167
新井です。

In message "[ruby-dev:20165] Re: Numeric#step"
  on 05 May 2003 23:54:31 +0900,
  Minero Aoki <aamine@loveruby.net> wrote:
> 青木です。

> Linux 2.4.20 + glibc 2.2.5 + gcc 2.95.3 / P4 B
> 出ない
> 
>   ~ % ruby -ve '1.1.step(1.5, 0.1) {|n| p n }'
>   ruby 1.8.0 (2003-05-02) [i686-linux]
>   1.1
>   1.2
>   1.3
>   1.4
> 
>   ~ % ruby -ve '1.1.step(1.7, 0.1) {|n| printf("%.20f\n", n) }' 
>   ruby 1.8.0 (2003-05-02) [i686-linux]
>   1.10000000000000008882
>   1.20000000000000017764
>   1.30000000000000004441
>   1.40000000000000013323
>   1.50000000000000000000
>   1.60000000000000008882

例えば、これはうちだと計算結果は同じですが、最後の1.7が出る
とこは違います。比較のため ruby は numeric.c パッチ前の 
2003-05-02 版です。

Linux/Debian 2.4.19 + glibc 2.3.1-17 + gcc 3.2.3

1.1.step(1.7, 0.1) {|n| printf("%.20f\n", n) }

ruby 1.8.0 (2003-05-02) [i586-linux]
1.10000000000000008882
1.20000000000000017764
1.30000000000000004441
1.40000000000000013323
1.50000000000000000000
1.60000000000000008882
1.70000000000000017764

以下を試してみました。

#include <math.h>

#define DBL_EPSILON 2.2204460492503131e-16

main()
{
    const double epsilon = DBL_EPSILON;
    double beg = 1.1;
    double end = 1.5;
    double unit = 0.1;
    double n = (end - beg)/unit;

    printf("epsilon:                  %.20f\n", epsilon);
    printf("n = (end - beg)/unit:     %.20f\n", n = (end - beg)/unit);
    printf("n + n*epsilon:            %.20f\n", n + n*epsilon);
    printf("floor(n + n*epsilon + 1): %.20f\n", n = floor(n + n*epsilon + 1));

    return 0;
}

# gcc 3.2.3

% gcc hoge.c -lm && ./a.out
epsilon:                  0.00000000000000022204
n = (end - beg)/unit:     3.99999999999999911182
n + n*epsilon:            4.00000000000000000000
floor(n + n*epsilon + 1): 5.00000000000000000000

# gcc version 2.95.4 20011002 (Debian prerelease)

$ gcc-2.95 hoge.c -lm && ./a.out
epsilon:                  0.00000000000000022204
n = (end - beg)/unit:     3.99999999999999911182
n + n*epsilon:            4.00000000000000000000
floor(n + n*epsilon + 1): 5.00000000000000000000

--
新井康司 (Koji Arai)

In This Thread