Bug #6120
closedFloat and BigDecimal bug in remainder in corner cases
Description
Currently:
4.2.remainder(+Float::INFINITY) # => 4.2, ok
4.2.remainder(-Float::INFINITY) # => NaN, should be 4.2
# (same with all signs reversed)
Reasons the remainder should be 4.2 and not NaN:
- foo.remainder(bar) == foo.remainder(-bar)
- foo.remainder(bar) == foo when bar.abs > foo.abs
Similarly:
require 'bigdecimal'
bd = BigDecimal.new("4.2")
bd.remainder(BigDecimal.new("+Infinity")) # => NaN, should be bd
bd.remainder(BigDecimal.new("-Infinity")) # => NaN, should be bd
# (same with all signs reverse)
Reasons: same as float.
Finally:
bd = BigDecimal.new("4.2")
bd.modulo(BigDecimal.new("0")) # => ZeroDivisionError, probably ok?
bd.remainder(BigDecimal.new("0")) # => NaN, should be probably raise a ZeroDivisionError?
Like in #6044, this could be decided either way, as long as there is consistency. Anyone prefer NaN to raising a ZeroDivisionError?
Updated by naruse (Yui NARUSE) about 13 years ago
Ruby's math should portably follow SuS. [ruby-core:28206]
You can fix it for Float/Math if it is obviously wrong and the right implementation is clear.
BigDecimal is little another world and it is up to mrkn.
Updated by shyouhei (Shyouhei Urabe) about 13 years ago
- Status changed from Open to Assigned
Updated by mame (Yusuke Endoh) about 12 years ago
- Target version changed from 2.0.0 to 2.6
Should it be assigned to mrkn?
--
Yusuke Endoh mame@tsg.ne.jp
Updated by marcandre (Marc-Andre Lafortune) about 12 years ago
Didn't get around fixing it for 2.0.0. Will fix and then assign to mrkn for BigDecimal.
Updated by jeremyevans0 (Jeremy Evans) about 4 years ago
I've submitted a pull request to fix this issue for Integer/Float: https://github.com/ruby/ruby/pull/4257
I've submitted an issue to the bigdecimal repository to fix the issue in BigDecimal: https://github.com/ruby/bigdecimal/issues/187
Updated by jeremyevans (Jeremy Evans) about 4 years ago
- Status changed from Assigned to Closed
Applied in changeset git|aaab3b1de943c3317e115d623ffc7908b4c96578.
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]