小林@仕事サボりモードです

----- Original Message -----
送信者 : Yasushi Abe <yasushi / stbbs.net>
件名 : [ruby-list:20369] divmod()


> 阿部です。
>
> 私の勘違いだといいのですが、divmodの挙動が?です。
>
> def f(a)
>   x,y = a.divmod(10)
>   return x*10+y
> end
>
> というメソッドf()は、0以外の整数であればa==f(a)が成り立つと思うのですが、
> aがマイナスの場合、これが成立しません。
>
> ドキュメントには特に記述がなかったので、rubyのソースを読んでみたんです
> けど、divmod()で%の演算を呼び出しているところまでで挫折してしまいまし
> た(^^;

えっと、numeric.cのnum_divmod(x, y)ですね。
問題は、floor()を使った後が変なようです。
「if (TYPE(div) == T_FLOAT) {」の中を以下のように修正すれば
いいような気がします。

    if (TYPE(div) == T_FLOAT) {
 double d = floor(RFLOAT(div)->value);

 if(d<0.0 && RFLOAT(div)->value > d) { /* Added */
     div = rb_float_new(d+1.0);                /* Added */
 } else if (RFLOAT(div)->value > d) {     /* Changed */
     div = rb_float_new(d);
 }
    }

後は、どなたか....

# divmod の最初の返り値は整数だった(BigFloatはどうしよう)!

小林 茂雄
E-Mail: shigeo / tinyforest.gr.jp
WWW: http://www.tinyforest.gr.jp