1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Fix integer/float remainder with infinity argument of opposite sign

Previously, the result was incorrect:

4.remainder(-Float::INFINITY)
Before: => NaN
After: => 4

4.2.remainder(-Float::INFINITY)
Before: => NaN
After: => 4.2

Fixes [Bug #6120]
This commit is contained in:
Jeremy Evans 2021-03-10 13:15:50 -08:00
parent 701001e36e
commit aaab3b1de9
Notes: git 2021-03-13 00:35:50 +09:00
2 changed files with 20 additions and 3 deletions

View file

@ -656,6 +656,11 @@ num_remainder(VALUE x, VALUE y)
rb_num_positive_int_p(y)) ||
(rb_num_positive_int_p(x) &&
rb_num_negative_int_p(y)))) {
if (RB_TYPE_P(y, T_FLOAT)) {
if (isinf(RFLOAT_VALUE(y))) {
return x;
}
}
return rb_funcall(z, '-', 1, y);
}
return z;
@ -1151,11 +1156,11 @@ flodivmod(double x, double y, double *divp, double *modp)
div = x;
else {
div = (x - mod) / y;
if (modp && divp) div = round(div);
if (modp && divp) div = round(div);
}
if (y*mod < 0) {
mod += y;
div -= 1.0;
mod += y;
div -= 1.0;
}
if (modp) *modp = mod;
if (divp) *divp = div;

View file

@ -384,6 +384,18 @@ class TestNumeric < Test::Unit::TestCase
end;
end
def test_remainder_infinity
assert_equal(4, 4.remainder(Float::INFINITY))
assert_equal(4, 4.remainder(-Float::INFINITY))
assert_equal(-4, -4.remainder(Float::INFINITY))
assert_equal(-4, -4.remainder(-Float::INFINITY))
assert_equal(4.2, 4.2.remainder(Float::INFINITY))
assert_equal(4.2, 4.2.remainder(-Float::INFINITY))
assert_equal(-4.2, -4.2.remainder(Float::INFINITY))
assert_equal(-4.2, -4.2.remainder(-Float::INFINITY))
end
def test_comparison_comparable
bug12864 = '[ruby-core:77713] [Bug #12864]'