Float#round fix bug for infinity and nan cases

This commit is contained in:
ksss
2014-03-21 22:24:33 +09:00
parent 07bd65ae65
commit 8891cea41c
2 changed files with 27 additions and 1 deletions
+15 -1
View File
@@ -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);
}
+12
View File
@@ -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