diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-05-26 09:54:10 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-05-26 09:54:10 +0900 |
| commit | 83fc915213b23b798ea1afef55fddc0836207a83 (patch) | |
| tree | 88509b29e278c185308ea676fa465ac4dbe97425 /src | |
| parent | 3c312782368e2854c75c56d2008a5cbd78b70dfa (diff) | |
| download | mruby-83fc915213b23b798ea1afef55fddc0836207a83.tar.gz mruby-83fc915213b23b798ea1afef55fddc0836207a83.zip | |
Add new range check macro FIXABLE_FLOAT(); ref #3652
When MRB_INT64, valid value range of mrb_int is bigger than double,
which only has 53 bits significant precision.
Diffstat (limited to 'src')
| -rw-r--r-- | src/class.c | 2 | ||||
| -rw-r--r-- | src/numeric.c | 10 | ||||
| -rw-r--r-- | src/object.c | 7 |
3 files changed, 11 insertions, 8 deletions
diff --git a/src/class.c b/src/class.c index 4349e7b49..b0d7c8aa0 100644 --- a/src/class.c +++ b/src/class.c @@ -800,7 +800,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) { mrb_float f = mrb_float(ARGV[arg_i]); - if (!FIXABLE(f)) { + if (!FIXABLE_FLOAT(f)) { mrb_raise(mrb, E_RANGE_ERROR, "float too big for int"); } *p = (mrb_int)f; diff --git a/src/numeric.c b/src/numeric.c index da7e71771..2f2a76517 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -392,7 +392,7 @@ flo_shift(mrb_state *mrb, mrb_value x, mrb_int width) val *= 2; } } - if (FIXABLE(val)) { + if (FIXABLE_FLOAT(val)) { return mrb_fixnum_value((mrb_int)val); } return mrb_float_value(mrb, val); @@ -515,7 +515,7 @@ flo_floor(mrb_state *mrb, mrb_value num) { mrb_float f = floor(mrb_float(num)); - if (!FIXABLE(f)) { + if (!FIXABLE_FLOAT(f)) { return mrb_float_value(mrb, f); } return mrb_fixnum_value((mrb_int)f); @@ -540,7 +540,7 @@ flo_ceil(mrb_state *mrb, mrb_value num) { mrb_float f = ceil(mrb_float(num)); - if (!FIXABLE(f)) { + if (!FIXABLE_FLOAT(f)) { return mrb_float_value(mrb, f); } return mrb_fixnum_value((mrb_int)f); @@ -661,7 +661,7 @@ flo_truncate(mrb_state *mrb, mrb_value num) if (f > 0.0) f = floor(f); if (f < 0.0) f = ceil(f); - if (!FIXABLE(f)) { + if (!FIXABLE_FLOAT(f)) { mrb_check_num_exact(mrb, f); return mrb_float_value(mrb, f); } @@ -1099,7 +1099,7 @@ mrb_flo_to_fixnum(mrb_state *mrb, mrb_value x) if (isnan(d)) { mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN"); } - if (FIXABLE(d)) { + if (FIXABLE_FLOAT(d)) { z = (mrb_int)d; } else { diff --git a/src/object.c b/src/object.c index d7f3f5a55..a78e9a443 100644 --- a/src/object.c +++ b/src/object.c @@ -534,8 +534,11 @@ mrb_convert_to_integer(mrb_state *mrb, mrb_value val, int base) switch (mrb_type(val)) { case MRB_TT_FLOAT: if (base != 0) goto arg_error; - if (FIXABLE(mrb_float(val))) { - break; + else { + mrb_float f = mrb_float(val); + if (FIXABLE_FLOAT(f)) { + break; + } } return mrb_flo_to_fixnum(mrb, val); |
