Project

General

Profile

Actions

Bug #6120

closed

Float and BigDecimal bug in remainder in corner cases

Added by marcandre (Marc-Andre Lafortune) about 12 years ago. Updated about 3 years ago.

Status:
Closed
Target version:
-
[ruby-core:43109]
Tags:

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:

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

Actions #2

Updated by shyouhei (Shyouhei Urabe) about 12 years ago

  • Status changed from Open to Assigned

Updated by mame (Yusuke Endoh) about 11 years ago

  • Target version changed from 2.0.0 to 2.6

Should it be assigned to mrkn?

--
Yusuke Endoh

Updated by marcandre (Marc-Andre Lafortune) about 11 years ago

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

Actions #5

Updated by naruse (Yui NARUSE) about 6 years ago

  • Target version deleted (2.6)

Updated by jeremyevans0 (Jeremy Evans) about 3 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

Actions #7

Updated by jeremyevans (Jeremy Evans) about 3 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]

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0