原です。

>正木です。

>以前にも書きましたが、rb_rat_to_f はこのままでは numerator 
>もしくは denominator が Float の範囲外で、その値自身は範囲
>内のときに、正しい値を返しません。

なるほど!以前に問題になっていたようですね。成果を取り込ませて
もらうつもりです。

>それから floor,ceil,round の定義が抜けているようです。

ああ、本当だ。指摘ありがとうございます。

>rb_rat_to_i ですが、これだと
>(-3/2).to_i #=> -2
>(-1.5).to_i #=> -1
>となって整合性がとれません。
>Float と仕様を合わした方が良くありませんか?

そうします。

>私の rational.c では次のようにしています。
>to_f は intel x86 以外でも正しく動くかどうか分かりませんが、
>その点も含めて検討していただけませんか。

研究させてください。

>static VALUE
>rb_rational_round(VALUE self)
>{
>  struct RRational *rrational;
>  VALUE num, den;
>
>  Data_Get_Struct(self,struct RRational,rrational);
>  num = rrational->num;
>  den = rrational->den;
>  num=rb_plus(rb_mul(num,Two),den);
>  den=rb_mul(den,Two);
>  return rb_div(num,den);
>}

round も self の正負で場合分けが必要なんじゃないかな。


#やっぱり Integer を返す sqrt と log2 は、欲しいですね。