diff options
Diffstat (limited to 'numeric.c')
-rw-r--r-- | numeric.c | 33 |
1 files changed, 12 insertions, 21 deletions
@@ -1279,10 +1279,7 @@ flo_mod(VALUE x, VALUE y) static VALUE dbl2ival(double d) { - if (FIXABLE(d)) { - return LONG2FIX((long)d); - } - return rb_dbl2big(d); + return rb_dbl2ival(d); } /* @@ -1967,7 +1964,6 @@ static VALUE flo_floor(int argc, VALUE *argv, VALUE num) { double number, f; - long val; int ndigits = 0; if (rb_check_arity(argc, 0, 1)) { @@ -1984,11 +1980,7 @@ flo_floor(int argc, VALUE *argv, VALUE num) return DBL2NUM(f); } f = floor(number); - if (!FIXABLE(f)) { - return rb_dbl2big(f); - } - val = (long)f; - return LONG2FIX(val); + return dbl2ival(f); } /* @@ -2327,16 +2319,11 @@ static VALUE flo_to_i(VALUE num) { double f = RFLOAT_VALUE(num); - long val; if (f > 0.0) f = floor(f); if (f < 0.0) f = ceil(f); - if (!FIXABLE(f)) { - return rb_dbl2big(f); - } - val = (long)f; - return LONG2FIX(val); + return dbl2ival(f); } /* @@ -3020,13 +3007,17 @@ VALUE rb_num2fix(VALUE val) { long v; + VALUE w; - if (FIXNUM_P(val)) return val; - - v = rb_num2long(val); - if (!FIXABLE(v)) + if (FIXNUM_P(val)) { + return val; + } + else if (rb_long2fix_overflow((v = rb_num2long(val)), &w)) { rb_raise(rb_eRangeError, "integer %ld out of range of fixnum", v); - return LONG2FIX(v); + } + else { + return w; + } } #if HAVE_LONG_LONG |