#/*********************************************************** # sum.rb -- 情報落ち #***********************************************************/ def sum1( n, a) # 通常の方法 s = 0 for i in 0...n; s += a[i]; end return s end def sum2( n, a) # 情報落ち対策 r = 0; s = 0; # s は和, r は積み残し for i in 0...n r += a[i]; # 積み残し + 加えたい値 t = s; # 前回までの和 s += r; # 和を更新 t -= s; # 実際に積まれた値の符号を変えたもの r += t; # 積み残し end return s end a = [] printf("1 + 0.0001 + ... + 0.0001 = 2\n") a[0] = 1 for i in 1..10000; a[i] = 0.0001; end printf("方法1: %.6f\n", sum1(10001, a)) printf("方法2: %.6f\n", sum2(10001, a))