児玉 です.
Float から Rational への変換. 有理数の近似.

From: "K.Kodama" <kdm / kobe-kosen.ac.jp>
Subject: [ruby-math:00280] Re: Infinity(was Polynomial.rb and floating
 point exception)
Date: Tue, 25 Apr 2000 13:07:57 +0900
Message-ID: <20000425130757N.kdm / kobe-kosen.ac.jp>
> From: EGUCHI Osamu <eguchi / shizuokanet.ne.jp>
> Subject: [ruby-math:00279] Re: Infinity(was Polynomial.rb and floating
>  point exception)
> Date: Mon, 24 Apr 2000 19:59:46 +0900
> Message-ID: <20000424195946V.eguchi / shizuokanet.ne.jp>
> > えぐち@エスアンドイー です。
....
> > かえって、演算がオーバーフローすると黙って Inf に
> > なってしまう方が、見付かりにくい問題の元になりそうですね。
> 
> # ちょっと, 冷汗...
> 標準実数部を Integer, Rational ばかりで考えていたので,
> HyperReal 内の処理での Float のオ−バ−フロ−の問題を扱えていない.
> とりあえず, 安全のために数値は Rationalで.

これでは不便なので, Float::to_r というのを作ってみました.
(hyperreal.rb)
+-Inf,NaN なら +- HyperReal::Infinity, HyperReal::Indefinite
Integer で表現できるなら Integerそうでないなら Rational を返します.
Rationalを返すように決める方が良かったかな?

Rational への変換は 2 の巾をかけて
小数部分を整数部に押し出して,Rational の値に足し込んでいます.
変換してしまうとこれ以降の四則演算では
overflow, underflow, 桁落ち 等が起こらないのは良いのですが,
の効率的には最悪.
変換精度を指定出来ると良いですが...

それと, 計算中に分母と分子が爆発的に大きくなって行きます.
Rational 数のより小さい分母, 分子での近似
Rational::approximation も試作.

------例-----
f=1.0/0.0
printf "f=%s, r=%s\n", f, f.to_ir
f=1.0/3.0
printf "f=%s, r=%s\n", f, f.to_ir
f=0.5
printf "f=%s, r=%s\n", f, f.to_ir
f=Math.sqrt(2.0)
printf "f=%s, r=%s\n", f, f.to_ir
-------結果
f=Infinity, r=Infinity
f=0.3333333333, r=6004799503160661/18014398509481984
f=0.5, r=1/2
f=1.414213562, r=6369051672525773/4503599627370496
-------
-- 
K.Kodama(kodama / kobe-kosen.ac.jp)