summaryrefslogtreecommitdiffhomepage
path: root/src/numeric.c
diff options
context:
space:
mode:
authorksss <[email protected]>2014-03-21 22:24:33 +0900
committerksss <[email protected]>2014-03-21 22:24:33 +0900
commit8891cea41c8396012f786be00ee8d470f45241c1 (patch)
tree0e78e71f6c0cb2fa6972ebee339e133a3e8f20e8 /src/numeric.c
parent07bd65ae65ba1092191f5a702ce3c15aaca2ab5f (diff)
downloadmruby-8891cea41c8396012f786be00ee8d470f45241c1.tar.gz
mruby-8891cea41c8396012f786be00ee8d470f45241c1.zip
Float#round fix bug for infinity and nan cases
Diffstat (limited to 'src/numeric.c')
-rw-r--r--src/numeric.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/numeric.c b/src/numeric.c
index 6adfff344..b2507fb0b 100644
--- a/src/numeric.c
+++ b/src/numeric.c
@@ -594,6 +594,16 @@ flo_round(mrb_state *mrb, mrb_value num)
mrb_get_args(mrb, "|i", &ndigits);
number = mrb_float(num);
+
+ if (isinf(number)) {
+ if (0 < ndigits) return num;
+ else mrb_raise(mrb, E_FLOATDOMAIN_ERROR, number < 0 ? "-Infinity" : "Infinity");
+ }
+ if (isnan(number)) {
+ if (0 < ndigits) return num;
+ else mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN");
+ }
+
f = 1.0;
i = abs(ndigits);
while (--i >= 0)
@@ -621,7 +631,11 @@ flo_round(mrb_state *mrb, mrb_value num)
if (ndigits < 0) number *= f;
else number /= f;
}
- if (ndigits > 0) return mrb_float_value(mrb, number);
+
+ if (ndigits > 0) {
+ if (isinf(number) || isnan(number)) return num;
+ return mrb_float_value(mrb, number);
+ }
return mrb_fixnum_value((mrb_int)number);
}