[#28509] Rational — Tadayoshi Funaba <tadf@...>

ふなばです。

49 messages 2006/04/05
[#28510] Re: Rational — keiju@... (石塚圭樹) 2006/04/05

けいじゅ@いしつかです.

[#28512] Re: Rational — Tadayoshi Funaba <tadf@...> 2006/04/05

ふなばです。

[#28513] Re: Rational — Shin-ichiro HARA <sinara@...> 2006/04/05

原です。

[#28514] Re: Rational — keiju@... (石塚圭樹) 2006/04/05

けいじゅ@いしつかです.

[#28517] Re: Rational — Yukihiro Matsumoto <matz@...> 2006/04/06

まつもと ゆきひろです

[#28520] Re: Rational — keiju@... (石塚圭樹) 2006/04/06

けいじゅ@いしつかです.

[#28521] Re: Rational — Yukihiro Matsumoto <matz@...> 2006/04/06

まつもと ゆきひろです

[#28525] Re: Rational — keiju@... (石塚圭樹) 2006/04/06

けいじゅ@いしつかです.

[#28527] Re: Rational — Shin-ichiro HARA <sinara@...> 2006/04/06

原です。

[#28536] Re: Rational — Shin-ichiro HARA <sinara@...> 2006/04/10

原です。

[#28537] Re: Rational — keiju@... (石塚圭樹) 2006/04/10

けいじゅ@いしつかです.

[#28589] Float#div and Float#divmod [AGAIN] — Shin-ichiro HARA <sinara@...>

原です。

16 messages 2006/04/23

[ruby-dev:28540] Re: Rational

From: Shin-ichiro HARA <sinara@...>
Date: 2006-04-11 14:32:58 UTC
List: ruby-dev #28540
原です。

>ふなばです。
>
>> すいません、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 にしてもまずくはないかなという
気もしてきました。うーむ。


In This Thread