summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-rational/src
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems/mruby-rational/src')
-rw-r--r--mrbgems/mruby-rational/src/rational.c11
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
}