mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Float#round fix bug for infinity and nan cases
This commit is contained in:
+15
-1
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user