From: Koji Arai Date: 2003-05-06T00:53:05+09:00 Subject: [ruby-dev:20167] Re: Numeric#step 新井です。 In message "[ruby-dev:20165] Re: Numeric#step" on 05 May 2003 23:54:31 +0900, Minero Aoki 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 #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)