diff --git a/ChangeLog b/ChangeLog index 0c63fce6c0..51b6ffd9d5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu May 1 23:59:59 2008 Nobuyoshi Nakada + + * bignum.c (rb_big_divide), numeric.c (fix_divide): check for result + domain. [ruby-dev:34559] + Thu May 1 23:43:21 2008 Nobuyoshi Nakada * range.c (range_step): check if step can be converted to an integer. diff --git a/bignum.c b/bignum.c index f38e0774ee..cf375a5288 100644 --- a/bignum.c +++ b/bignum.c @@ -1821,7 +1821,7 @@ rb_big_divide(VALUE x, VALUE y, ID op) return DOUBLE2NUM(div); } else { - return LONG2NUM((long)div); + return rb_dbl2big(div); } } diff --git a/numeric.c b/numeric.c index 67ef22ac97..0ae4bb0827 100644 --- a/numeric.c +++ b/numeric.c @@ -2249,7 +2249,7 @@ fix_fdiv(VALUE x, VALUE y) } static VALUE -fix_divide(VALUE x, VALUE y, int flo) +fix_divide(VALUE x, VALUE y, ID op) { if (FIXNUM_P(y)) { long div; @@ -2262,15 +2262,17 @@ fix_divide(VALUE x, VALUE y, int flo) x = rb_int2big(FIX2LONG(x)); return rb_big_div(x, y); case T_FLOAT: - if (flo) { - return DOUBLE2NUM((double)FIX2LONG(x) / RFLOAT_VALUE(y)); - } - else { - long div = (double)FIX2LONG(x) / RFLOAT_VALUE(y); - return LONG2NUM(div); + { + double div = (double)FIX2LONG(x) / RFLOAT_VALUE(y); + if (op == '/') { + return DOUBLE2NUM(div); + } + else { + return rb_dbl2big(div); + } } default: - return rb_num_coerce_bin(x, y, flo ? '/' : rb_intern("div")); + return rb_num_coerce_bin(x, y, op); } } @@ -2286,7 +2288,7 @@ fix_divide(VALUE x, VALUE y, int flo) static VALUE fix_div(VALUE x, VALUE y) { - return fix_divide(x, y, Qtrue); + return fix_divide(x, y, '/'); } /* @@ -2299,7 +2301,7 @@ fix_div(VALUE x, VALUE y) static VALUE fix_idiv(VALUE x, VALUE y) { - return fix_divide(x, y, Qfalse); + return fix_divide(x, y, rb_intern("div")); } /*