Note that this started a long time ago and comes up episodically http://forum.world.st/Fraction-equality-and-Float- infinity-problem-td48323.html http://forum.world.st/BUG-Equality-should-be-transitive-tc1404335.html https://lists.gforge.inria.fr/pipermail/pharo-project/2009-July/010496.html
A bit like a "marronnier" (in French, a subject that is treated periodically by newspapers and magazines) 2017-11-09 15:55 GMT+01:00 Nicolas Cellier < [email protected]>: > > > 2017-11-09 15:48 GMT+01:00 Tudor Girba <[email protected]>: > >> 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 >> >> > Because there are infinitely many different Fraction that would be "equal" > to 0.1 then. > The first effect is that you have > > a = b > a = c > b < c > > You are breaking the fact that you can sort these Numbers (are they > Magnitude anymore?) > You are breaking the fact that you can mix these Numbers as Dictionary > keys (sometimes the dictionary would have 2 elements, sometimes 3, > unpredictably). > > >> > 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." >> >> >> >> >> >> >> >> >> >> >
