[#68478] Looking for MRI projects for Ruby Google Summer of Code 2015 — Tony Arcieri <bascule@...>

Hi ruby-core,

10 messages 2015/03/10

[ruby-core:68552] [Ruby trunk - Bug #10979] Hash fails to distinguish 0.0 & -0.0

From: nobu@...
Date: 2015-03-18 02:19:15 UTC
List: ruby-core #68552
Issue #10979 has been updated by Nobuyoshi Nakada.

Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED

Seems a bug because of FLONUM since 2.0.0. 

----------------------------------------
Bug #10979: Hash fails to distinguish 0.0 & -0.0
https://bugs.ruby-lang.org/issues/10979#change-51871

* Author: Alex Vondrak
* Status: Open
* Priority: Normal
* Assignee: 
* ruby -v: ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin13]
* Backport: 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED
----------------------------------------
According to the docs ( http://ruby-doc.org/core-2.2.1/Hash.html ):

> Two objects refer to the same hash key when their hash value is identical and the two objects are eql? to each other.

However, that does not appear to be the case for 0.0 and -0.0:

~~~
$ irb
2.2.0 :001 > (0.0).hash
 => -204267982040607835 
2.2.0 :002 > (-0.0).hash
 => -204267982040607835 
2.2.0 :003 > (0.0).eql?(-0.0)
 => true 
2.2.0 :004 > (-0.0).eql?(0.0)
 => true 
2.2.0 :005 > { 0.0 => :positive }.has_key?(-0.0)
 => false 
2.2.0 :006 > { -0.0 => :negative }.has_key?(0.0)
 => false 
2.2.0 :007 > { 0.0 => :positive }[-0.0]
 => nil 
2.2.0 :008 > { -0.0 => :negative }[0.0]
 => nil 
2.2.0 :009 > { 0.0 => :positive }.keys.map(&:hash)
 => [-204267982040607835] 
2.2.0 :010 > { -0.0 => :negative }.keys.map(&:hash)
 => [-204267982040607835]
~~~

I realize that floating point numbers are weird, and that 0.0 & -0.0 aren't literally the same machine representation. However, they *are* #eql? to each other have the same hash codes. I figure either the docs are misleading or there's a bug in the Hash primitives.

This also has carry-over effects to Array differences, for example:

~~~
$ irb
2.2.0 :001 > [0.0] - [-0.0]
 => [0.0] 
2.2.0 :002 > [-0.0] - [0.0]
 => [-0.0]
2.2.0 :003 > [0.0, -0.0] - [-0.0]
 => [0.0]
~~~

This was the initial behavior I observed in Ruby 2.1.3 that led me to file this bug. I tried Ruby 2.2.0 and the same behavior still seems to persist.



-- 
https://bugs.ruby-lang.org/

In This Thread

Prev Next