When i do:
Vector[2,4,6] == Vector[1,2,3]*2
#=> true
It returns true as expected.
However,
Vector[1.1,2.2,3.3] == Vector[1,2,3]*1.1
#=> false
Returns false which shouldn’t be the case.
Any ideas whats going on?
this is using 1.8.7 and the vector class from ‘matrix’.
regards,
tom.
On Sun, Sep 18, 2011 at 3:26 AM, thomas Mulvaney
[email protected] wrote:
Vector[1.1,2.2,3.3] == Vector[1,2,3]*1.1
#=> false
Returns false which shouldn’t be the case.
Any ideas whats going on?
Floating point numbers.
=> Vector[1,2,3]*1.1
Vector[1.1, 2.2, 3.3000000000000003]
Basically, whenever you’re comparing equality of floats, you should
stop and think what you’re doing.
(Less basic:
http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html
)
On Sep 17, 2011, at 10:26 PM, thomas Mulvaney wrote:
Vector[2,4,6] == Vector[1,2,3]*2
#=> true
It returns true as expected.
[…]
Vector[1.1,2.2,3.3] == Vector[1,2,3]*1.1
#=> false
Any ideas whats going on?
Integer literals have exact representations while floats do not.
Decimal floating point numbers in general can not be represented exactly
in binary so there is a conversion from the string “1.1”, for example,
to the binary floating point number that is “closest” to 1.1:
“%0.60f” % 1.1 #=>
“1.100000000000000088817841970012523233890533447265625000000000”
Of course this means that multiple of 1.1 aren’t exactly what you might
expect:
“%0.60f” % (1.1 * 3) #=>
“3.300000000000000266453525910037569701671600341796875000000000”
Here is the obligatory reference for this topic:
http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html
Gary W.