原です。 >ふなばです。 > >> すいません、rationalize というのを知らないのですが、 >> これは何を求める関数なのでしょう? > > (rational 0.3d0) => 5404319552844595/18014398509481984 > (rationalize 0.3d0) => 3/10 数学的には連分数展開なので、こんな感じで実装できるみたいです。 def rationalize(x, e = Float::EPSILON) if x < 0 -rationalize(-x, e) else rational_within(x - e, x + e) end end def rational_within(x, y) xq, yq = x.floor, y.floor if xq == x || x == y Rational(xq) elsif xq < yq Rational(xq + 1) else xq + 1/rational_within(1/(y - yq), 1/(x - xq)) end end 止まらないことがあるかな。 これをもうすこし安全にしてCで実装したとしても結構単純 なので、それを Float#to_r にしてもまずくはないかなという 気もしてきました。うーむ。