小林@仕事中断モードです。

----- Original Message -----
送信者 : Shigeo Kobayashi <shigeo / tinyforest.gr.jp>
件名 : [ruby-list:20373] Re: divmod()


>
> 丸める方向を、ゼロ方向にするか、floor()方向にするかの問題ですが
> Ruby本には単に「商と剰余」とあるし、a==d*b+rが成立すると考える
> のは間違いではないと思うのですが?
>
で、nemeric.c を以下のような感じにすることを提案したいのですが?

# 後はruby-math ?

static VALUE
num_divmod(x, y)
    VALUE x, y;
{
    VALUE div, mod;
    static ID remainder=0;
    if(!remainder) remainder = rb_intern("remainder");
    div = rb_funcall(x, '/', 1, y);
    if (TYPE(div) == T_FLOAT) {
    double d = floor(RFLOAT(div)->value);

    if(d<0.0 && RFLOAT(div)->value > d) {
     div = rb_float_new(d+1.0);
    } else if (RFLOAT(div)->value > d) {
     div = rb_float_new(d);
    }
    }
    mod = rb_funcall(x, remainder, 1, y);
    return rb_assoc_new(div, mod);
}

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