diff options
Diffstat (limited to 'mrbgems/mruby-rational/src')
| -rw-r--r-- | mrbgems/mruby-rational/src/rational.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/mrbgems/mruby-rational/src/rational.c b/mrbgems/mruby-rational/src/rational.c index 265cd081f..7ace64dab 100644 --- a/mrbgems/mruby-rational/src/rational.c +++ b/mrbgems/mruby-rational/src/rational.c @@ -136,6 +136,9 @@ rational_new_i(mrb_state *mrb, mrb_int n, mrb_int d) { mrb_int a; + if (d == 0) { + mrb_raise(mrb, E_ZERODIV_ERROR, "divided by 0 in rational"); + } a = i_gcd(n, d); if ((n == MRB_INT_MIN || d == MRB_INT_MIN) && a == -1) { mrb_raise(mrb, E_RANGE_ERROR, "integer overflow in rational"); @@ -161,8 +164,8 @@ rational_new_i(mrb_state *mrb, mrb_int n, mrb_int d) static void float_decode_internal(mrb_state *mrb, mrb_float f, mrb_float *rf, int *n) { - f = frexp_rat(f, n); - f = ldexp_rat(f, RAT_MANT_DIG); + f = (mrb_float)frexp_rat(f, n); + f = (mrb_float)ldexp_rat(f, RAT_MANT_DIG); *n -= RAT_MANT_DIG; *rf = f; } @@ -189,7 +192,7 @@ rational_new_f(mrb_state *mrb, mrb_float f0) else { n = -n; } - return rational_new_i(mrb, f, ((mrb_int)1)<<n); + return rational_new_i(mrb, (mrb_int)f, ((mrb_int)1)<<n); #else mrb_int pow = 1; if (n < 0) { @@ -207,7 +210,7 @@ rational_new_f(mrb_state *mrb, mrb_float f0) while (n--) { pow *= FLT_RADIX; } - return rational_new(mrb, f*pow, 1); + return rational_new(mrb, (mrb_int)f*pow, 1); } #endif } |
