正木です。

前にも書きましたが、現在の Rational#to_f は(round,ceil,floor も)
必ずしも正しい値を返しません:

Rational(3**650,2**1000).to_f #=> Infinity
Rational(2**1000,3**650).to_f #=> 0.0
Rational(2**2000,3**1000).to_f #=> NaN
Rational(5**100,3**100).round #=> 15306467074865063002112

次のようにすれば良さそうですが、検討してみてください。

class Rational
  def floor
    @numerator.div(@denominator)
  end

  def ceil
    -(-self).floor
  end

  def round
    (self+1/2).floor
  end

  def to_f
    return -(-self).to_f if self<0 
    return floor.to_f+(self-floor).to_f if self>1
    return 1/(1/self).to_f if @denominator.to_f.infinite?
    @numerator.to_f/@denominator.to_f
  end
end

(3**650/2**1000).to_f #=> 1255509212.596597
(2**1000/3**650).to_f #=> 7.964895756772961e-10
(2**2000/3**1000).to_f #=> 8.6843358037744105e+124
(5**100/3**100).round #=> 15306467074865063414445

ついでに質問がひとつ:
Rational(-3,2).to_i #=> -2
(-1.5).to_i #=> -1
となりますが、Ruby で採用している to_i の仕様はどちらですか?

それから ruby 1.7.3 (2002-10-07) [i686-linux] で
-3**2 #=> 9
となります。(最新版で修正済みなら無視して下さい。)