summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-03-22 16:58:56 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-03-22 16:58:56 +0900
commit5488da6c445f4c72d2f916d7dcbc44c29852cfb6 (patch)
treeccc2aa4183f624f248b198024cfde51477dd2163 /src
parent064030732a18e9c9234ac929816f55a896e25003 (diff)
parent8891cea41c8396012f786be00ee8d470f45241c1 (diff)
downloadmruby-5488da6c445f4c72d2f916d7dcbc44c29852cfb6.tar.gz
mruby-5488da6c445f4c72d2f916d7dcbc44c29852cfb6.zip
Merge pull request #1907 from ksss/float-round
Float#round fix bug for infinity and nan cases
Diffstat (limited to 'src')
-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);
}