Hi, Thanks for the answer. The example I provided was for convenience.
I still do not understand why it is wrong to expect 0.1 = (1/10) to be true. Doru > On Nov 9, 2017, at 3:36 PM, Nicolas Cellier > <[email protected]> wrote: > > Nope, not a bug. > > If you use Float, then you have to know that (x -y) isZero and (x = y) are > two different things. > Example; Float infinity > > In your case you want to protect against (x-y) isZero, so just do that. > > 2017-11-09 15:15 GMT+01:00 Tudor Girba <[email protected]>: > Hi, > > I just stumbled across this bug related to the equality between fraction and > float: > https://pharo.fogbugz.com/f/cases/20488/x-y-iff-x-y-0-is-not-preserved-in-Pharo > > In essence, the problem can be seen that by doing this, you get a ZeroDivide: > x := 0.1. > y := (1/10). > x = y ifFalse: [ 1 / (x - y) ] > > The issue seems to come from the Float being turned to a Fraction, rather > than the Fraction being turned into a Float: > > Fraction(Number)>>adaptToFloat: rcvr andCompare: selector > "If I am involved in comparison with a Float, convert rcvr to a > Fraction. This way, no bit is lost and comparison is exact." > > rcvr isFinite > ifFalse: [ > selector == #= ifTrue: [^false]. > selector == #~= ifTrue: [^true]. > rcvr isNaN ifTrue: [^ false]. > (selector = #< or: [selector = #'<=']) > ifTrue: [^ rcvr positive not]. > (selector = #> or: [selector = #'>=']) > ifTrue: [^ rcvr positive]. > ^self error: 'unknow comparison selector']. > > ^ rcvr asTrueFraction perform: selector with: self > > Even if the comment says that the comparison is exact, to me this is a bug > because it seems to fail doing that. What do you think? > > Cheers, > Doru > > > -- > www.tudorgirba.com > www.feenk.com > > "Problem solving should be focused on describing > the problem in a way that makes the solution obvious." > > > > > > -- www.tudorgirba.com www.feenk.com "We are all great at making mistakes."
