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(y)) ||
(rb_num_positive_int_p(x) && (rb_num_positive_int_p(x) &&
rb_num_negative_int_p(y)))) { 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 rb_funcall(z, '-', 1, y);
} }
return z; return z;

View file

@ -384,6 +384,18 @@ class TestNumeric < Test::Unit::TestCase
end; end;
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 def test_comparison_comparable
bug12864 = '[ruby-core:77713] [Bug #12864]' bug12864 = '[ruby-core:77713] [Bug #12864]'