-------- Original Message --------

Subject: Why this?

Date: Sat, 13 Aug 2011 22:20:04 +0300

From: Николай [email protected]

To: [email protected]

Hallow, can anybody explain me that?

a = (10**2 + 5**2) #=> 125

b = Math.hypot(10, 5)**2 #=> 125.0

a == b #=>false

a.to_f == b #=> false

125.0 == 125 #=> true

125.0.to_f == 125 #=> true

On Sat, Aug 13, 2011 at 9:28 PM, Николай [email protected] wrote:

Hallow, can anybody explain me that?

a = (10**2 + 5**2) #=> 125

b = Math.hypot(10, 5)**2 #=> 125.0

a == b #=>false

http://ruby-doc.org/core/classes/Fixnum.html#M001090

They are not numerically equal.

b is not exactly 125.0, I’m not into details about ruby’s float

implementation, but the result simply isn’t 100% accurate. Try a.to_f ==

b.round

a.to_f == b #=> false

Same as above.

125.0 == 125 #=> true

http://www.ruby-doc.org/core/classes/Float.html#M000127

The 125.0 declaration is accurate, so numerical equality is true. As the

documentation says, this is not an eql? check (i.e. does not have to be

same

type).

125.0.to_f == 125 #=> true

Same as above.

For me, Math.hypot(10, 5)**2 is 125.00000000000001.

Float numbers are simply not accurate; you should perform “fuzzy”

comparisons - checking whether the difference between two floats is

smaller than a hard-coded really small number.

def fuzzy_eq a, b, eps = 1e-6

(a-b).abs < eps

end

– Matma R.

On Sat, Aug 13, 2011 at 12:28 PM, Николай [email protected] wrote:

Hallow, can anybody explain me that?

a = (10**2 + 5**2) #=> 125

b = Math.hypot(10, 5)**2 #=> 125.0

a == b #=>false

a.to_f == b #=> false

125.0 == 125 #=> true

125.0.to_f == 125 #=> true

The second result is the version of “inspect” bundled with your ruby

installation misleading you.

Ruby 1.9.2p180, via RubyInstaller, Win7 32-bit gives me:

irb(main):001:0> a=(10**2 + 5**2)

=> 125

irb(main):002:0> b=Math.hypot(10,5)**2

=> 125.00000000000001

IronRuby 1.1 gives me behavior that looks like what you see, but a

quick test shows that that “125.0” inspect value is skin deep:

irb(main):001:0> b=Math.hypot(10,5)**2

=> 125.0

irb(main):002:0> b<=>125.0

=> 1

irb(main):003:0> b==125.00000000000001

=> true

More generally, you are generally in deep trouble when you count on

floating point calculations producing exact results.

“Николай” [email protected] wrote in post #1016537:

Hallow, can anybody explain me that?

a = (10**2 + 5**2) #=> 125

b = Math.hypot(10, 5)**2 #=> 125.0

a == b #=>false

Try looking at (a-b)

For the long story see

http://docs.sun.com/source/806-3568/ncg_goldberg.html