summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-07-25 15:22:43 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-07-25 15:28:41 +0900
commit46ab8fdf078e6f2351d412c04d733ea5d727ef70 (patch)
treecdf26c909aa8610e31ec97945ec4fe30afea0032 /src
parent9fa3d77114cebf57fdab8c4c177a9031df244f99 (diff)
downloadmruby-46ab8fdf078e6f2351d412c04d733ea5d727ef70.tar.gz
mruby-46ab8fdf078e6f2351d412c04d733ea5d727ef70.zip
`(0.0).div(0)` should not be infinity; fix #3753
Diffstat (limited to 'src')
-rw-r--r--src/numeric.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/numeric.c b/src/numeric.c
index 41c4678d3..c7f3002d8 100644
--- a/src/numeric.c
+++ b/src/numeric.c
@@ -187,7 +187,12 @@ flodivmod(mrb_state *mrb, mrb_float x, mrb_float y, mrb_float *divp, mrb_float *
mrb_float mod;
if (y == 0.0) {
- div = INFINITY;
+ if (x == 0.0) {
+ div = NAN;
+ }
+ else {
+ div = INFINITY;
+ }
mod = NAN;
}
else {
@@ -811,8 +816,10 @@ fix_divmod(mrb_state *mrb, mrb_value x)
mrb_int div, mod;
if (mrb_fixnum(y) == 0) {
- return mrb_assoc_new(mrb, mrb_float_value(mrb, INFINITY),
- mrb_float_value(mrb, NAN));
+ return mrb_assoc_new(mrb, ((mrb_fixnum(x) == 0) ?
+ mrb_float_value(mrb, NAN):
+ mrb_float_value(mrb, INFINITY)),
+ mrb_float_value(mrb, NAN));
}
fixdivmod(mrb, mrb_fixnum(x), mrb_fixnum(y), &div, &mod);
return mrb_assoc_new(mrb, mrb_fixnum_value(div), mrb_fixnum_value(mod));
@@ -838,7 +845,7 @@ flo_divmod(mrb_state *mrb, mrb_value x)
mrb_get_args(mrb, "o", &y);
flodivmod(mrb, mrb_float(x), mrb_to_flo(mrb, y), &div, &mod);
- a = mrb_float_value(mrb, (mrb_int)div);
+ a = mrb_float_value(mrb, div);
b = mrb_float_value(mrb, mod);
return mrb_assoc_new(mrb, a, b);
}