Subject: Re: Scalar class?

正木です。

|[ruby-math:00737] Re: Scalar class?
|From: Masahiro TANAKA <masa / ir.isas.ac.jp>
|
|  0.0.step2( 11.7, 0.9 )
|
|と書くと、10.8 までしか行きません。EPSILONを入れたのはこのためです。
|小数点一桁くらいなら、字面どおりに行ってほしいと思ったので。

確かに
13*0.9 > 11.7
となりますね。
こういう例があるのなら step2 は却下です。

前 mail で書いた
(0.0).step1(0.9999999999999997, 1.0/103){|x| p x}
が、1.0 まで出力するのは Float の枠内でも間違いなので、step2 に手を
入れて次のようにしてみました。
(掛け算の誤差は最下位の bit にしか出ないと仮定しています。内部計算は
80 bit register で行うのでこの仮定は成り立つはずなのですが。)

class Float
  EPSILON=2**-52 # これはもう少し大きめに取って置くべきかも知れません。
  def step3(max,step)
    i = 0
    x = self
    while x <= max
      yield x
      i += 1
      x = self+i*step
    end
    yield x if (x-max)/max.abs <= EPSILON
  end
end

ご検討ください。

これでも
(0.0).step3(0.9999999999999998, 1.0/103){|x| p x}
は 1.0 まで出力しますから step1 に対する merit は極く些細なことです。
まずい例が見付かれば即撤回します。