Issue #5273 has been updated by Marc-Andre Lafortune.

Status changed from Rejected to Open
Target version changed from 1.9.3 to 1.9.4
ruby -v changed from - to r33186

On Mon, Sep 12, 2011 at 8:30 PM, Yui NARUSE <naruse / airemix.jp> wrote:
> Issue #5273 has been updated by Yui NARUSE.
>
> Status changed from Open to Rejected
>
> r33186

I'm not sure, are you trying to be rude or irritating by rejecting for a second time this issue in this way?

If so, please stop.

If not, would you be kind enough to explain the following:
- What makes you believe r33186/issue #5272 is related with this issue #5273?
- Why do I have to repeat [ruby-core:39296] that issues #5272 and #5273 are not related?
- Why do you think I opened two different issues in the first place (and fixed only one of them)?
- Is there anything in the examples given in the two issues, or in the specs I wrote that makes it possible to confuse both issues?
- Why do you feel it is appropriate to reject this issue by simply referring to one of my commits, without any explanation whatsoever?
- Don't you feel that even if the commit addressed the issue, the issue should have been Closed, not Rejected?

In addition, may I ask that you do not reject this issue a third time? I will set it myself to rejected if a compelling reason is given. Note that "Use BigDecimal" is not such a reason. Nor is `3.0/10**31 == 3.0000000000000003e-31`. Indeed, why stop there, why not have `Float("3.0e-31") == 3.0000000000000003e-31` and invoque the same arguments?

----------------------------------------
Bug #5273: Float#round returns the wrong floats for higher precision
http://redmine.ruby-lang.org/issues/5273

Author: Marc-Andre Lafortune
Status: Open
Priority: Normal
Assignee: 
Category: core
Target version: 1.9.4
ruby -v: r33186


Float#round returns the wrong floats for higher precision.

Rounding can be off:
    2.5e-22.round(22) # => 2.0e-22

It can also return values that have extra decimals:
    2.5e-31.round(31) # => 3.0000000000000003e-31
    2.5e-36.round(36) # => 2.9999999999999998e-36

Both errors can occur at the same time too:
2.5e-39.round(39) # => 2.0000000000000002e-39

I believe these errors occur only for ndigits >= 22. For ndigits > 22, 10**(-ndigits) is not an exact Float (as 5 ** 23 won't fit in the 53 bits of a double's mantissa). For ndigits < 22, there should be enough bits left to avoid rounding errors.

For ndigits >= 22, the algorithm to use should be similar to the one used to convert doubles to string.

Hopefully, this is the last bug for #round with a given precision.


-- 
http://redmine.ruby-lang.org