summaryrefslogtreecommitdiffhomepage
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
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
-rw-r--r--src/numeric.c16
-rw-r--r--test/t/float.rb12
2 files changed, 27 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);
}
diff --git a/test/t/float.rb b/test/t/float.rb
index c817e01da..ded434320 100644
--- a/test/t/float.rb
+++ b/test/t/float.rb
@@ -130,6 +130,18 @@ assert('Float#round', '15.2.9.3.12') do
assert_equal( 3, g)
assert_float( 3.4, h)
assert_float(3.423, i)
+
+ assert_equal(42.0, 42.0.round(307))
+ assert_equal(1.0e307, 1.0e307.round(2))
+
+ inf = 1.0/0.0
+ assert_raise(FloatDomainError){ inf.round }
+ assert_raise(FloatDomainError){ inf.round(-1) }
+ assert_equal(inf, inf.round(1))
+ nan = 0.0/0.0
+ assert_raise(FloatDomainError){ nan.round }
+ assert_raise(FloatDomainError){ nan.round(-1) }
+ assert_true(nan.round(1).nan?)
end
assert('Float#to_f', '15.2.9.3.13') do