Skip to content

Instantly share code, notes, and snippets.

@mbj
Created December 1, 2013 19:25
Show Gist options
  • Save mbj/7739680 to your computer and use it in GitHub Desktop.
Save mbj/7739680 to your computer and use it in GitHub Desktop.
Negative zero vs positive zero inconsistency in various rubies.
mbj@mbj ~/devel/mutant (master*) % chruby jruby
mbj@mbj ~/devel/mutant (master*) % irb test.rb
test.rb(main):001:0> RUBY_ENGINE
=> "jruby"
test.rb(main):002:0> RUBY_VERSION
=> "1.9.3"
test.rb(main):003:0> 0.0 == -0.0
=> true
test.rb(main):004:0> -0.0 == 0.0
=> true
test.rb(main):005:0> 0.0.eql?(-0.0)
=> true
test.rb(main):006:0> -0.0.eql?(0.0)
=> true
test.rb(main):007:0> 0.0.equal?(-0.0)
=> false
test.rb(main):008:0> -0.0.equal?(0.0)
=> false
test.rb(main):009:0> [0.0].include?(-0.0)
=> true
test.rb(main):010:0> [-0.0].include?(0.0)
=> true
test.rb(main):011:0> [0.0] - [-0.0]
=> []
test.rb(main):012:0> [-0.0] - [0.0]
=> []
test.rb(main):013:0> require 'set'
=> true
test.rb(main):014:0> Set.new([0.0]) - Set.new([-0.0])
=> #<Set: {}>
test.rb(main):015:0> Set.new([-0.0]) - Set.new([0.0])
=> #<Set: {}>
test.rb(main):016:0>
test.rb(main):017:0*
test.rb(main):017:0>
mbj@mbj ~/devel/mutant (master*) % chruby ruby
mbj@mbj ~/devel/mutant (master*) % irb test.rb
test.rb(main):001:0> RUBY_ENGINE
=> "ruby"
test.rb(main):002:0> RUBY_VERSION
=> "2.0.0"
test.rb(main):003:0> 0.0 == -0.0
=> true
test.rb(main):004:0> -0.0 == 0.0
=> true
test.rb(main):005:0> 0.0.eql?(-0.0)
=> true
test.rb(main):006:0> -0.0.eql?(0.0)
=> true
test.rb(main):007:0> 0.0.equal?(-0.0)
=> false
test.rb(main):008:0> -0.0.equal?(0.0)
=> false
test.rb(main):009:0> [0.0].include?(-0.0)
=> true
test.rb(main):010:0> [-0.0].include?(0.0)
=> true
test.rb(main):011:0> [0.0] - [-0.0]
=> [0.0]
test.rb(main):012:0> [-0.0] - [0.0]
=> [-0.0]
test.rb(main):013:0> require 'set'
=> true
test.rb(main):014:0> Set.new([0.0]) - Set.new([-0.0])
=> #<Set: {0.0}>
test.rb(main):015:0> Set.new([-0.0]) - Set.new([0.0])
=> #<Set: {-0.0}>
test.rb(main):016:0>
test.rb(main):017:0*
test.rb(main):017:0>
mbj@mbj ~/devel/mutant (master*) % chruby rubinius
mbj@mbj ~/devel/mutant (master*) % irb test.rb
test.rb(main):001:0> RUBY_ENGINE
=> "rbx"
test.rb(main):002:0> RUBY_VERSION
=> "2.1.0"
test.rb(main):003:0> 0.0 == -0.0
=> true
test.rb(main):004:0> -0.0 == 0.0
=> true
test.rb(main):005:0> 0.0.eql?(-0.0)
=> true
test.rb(main):006:0> -0.0.eql?(0.0)
=> true
test.rb(main):007:0> 0.0.equal?(-0.0)
=> false
test.rb(main):008:0> -0.0.equal?(0.0)
=> false
test.rb(main):009:0> [0.0].include?(-0.0)
=> true
test.rb(main):010:0> [-0.0].include?(0.0)
=> true
test.rb(main):011:0> [0.0] - [-0.0]
=> [0.0]
test.rb(main):012:0> [-0.0] - [0.0]
=> [-0.0]
test.rb(main):013:0> require 'set'
=> true
test.rb(main):014:0> Set.new([0.0]) - Set.new([-0.0])
=> #<Set: {0.0}>
test.rb(main):015:0> Set.new([-0.0]) - Set.new([0.0])
=> #<Set: {-0.0}>
test.rb(main):016:0>
test.rb(main):017:0*
test.rb(main):017:0>
mbj@mbj ~/devel/mutant (master*) %
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment