diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-11-16 01:52:39 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-11-16 01:52:39 +0000 |
commit | 3a083985a471ca3d8429146f9f18dead6747c203 (patch) | |
tree | 90f05d31fb7a12e953dab7ff32e8554605c504d3 /bignum.c | |
parent | a3b92a5d926cc9ec5d7f730e54eaa1aabe783a1f (diff) |
avoid division by zero
* cvt(): use signbit() instead of 1/d < 0
* w_float(): ditto
* ruby_float_step_size(): unit==0 check shall be prior to divisions
* arith_seq_float_step_size(): ditto
* rb_big_divide(): same as r65642
* fix_divide(): ditto
* rb_big_fdiv_double(): ditto
* fix_fdiv_double(): ditto
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65751 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'bignum.c')
-rw-r--r-- | bignum.c | 11 |
1 files changed, 8 insertions, 3 deletions
@@ -6041,12 +6041,15 @@ rb_big_divide(VALUE x, VALUE y, ID op) } else if (RB_FLOAT_TYPE_P(y)) { if (op == '/') { - return DBL2NUM(rb_big2dbl(x) / RFLOAT_VALUE(y)); + double dx = rb_big2dbl(x); + return rb_flo_div_flo(DBL2NUM(dx), y); } else { + VALUE v; double dy = RFLOAT_VALUE(y); if (dy == 0.0) rb_num_zerodiv(); - return rb_dbl2big(rb_big2dbl(x) / dy); + v = rb_big_divide(x, y, '/'); + return rb_dbl2big(RFLOAT_VALUE(v)); } } else { @@ -6179,6 +6182,7 @@ double rb_big_fdiv_double(VALUE x, VALUE y) { double dx, dy; + VALUE v; dx = big2dbl(x); if (FIXNUM_P(y)) { @@ -6199,7 +6203,8 @@ rb_big_fdiv_double(VALUE x, VALUE y) else { return NUM2DBL(rb_num_coerce_bin(x, y, rb_intern("fdiv"))); } - return dx / dy; + v = rb_flo_div_flo(DBL2NUM(dx), DBL2NUM(dy)); + return NUM2DBL(v); } VALUE |