Bug #6120

Float and BigDecimal bug in remainder in corner cases

Added by Marc-Andre Lafortune over 3 years ago. Updated almost 3 years ago.

Assignee:Marc-Andre Lafortune
ruby -v:r34927 Backport:



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:
1) foo.remainder(bar) == foo.remainder(-bar)
2) foo.remainder(bar) == foo when bar.abs > foo.abs

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.

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?


#1 Updated by Yui NARUSE over 3 years ago

Ruby's math should portably follow SuS.
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.

#2 Updated by Shyouhei Urabe over 3 years ago

  • Status changed from Open to Assigned

#3 Updated by Yusuke Endoh almost 3 years ago

  • Target version changed from 2.0.0 to next minor

Should it be assigned to mrkn?

Yusuke Endoh mame@tsg.ne.jp

#4 Updated by Marc-Andre Lafortune almost 3 years ago

Didn't get around fixing it for 2.0.0. Will fix and then assign to mrkn for BigDecimal.

Also available in: Atom PDF