According to IEEE 754, the base of Pharo Float, *finite* values shall behave like old plain arithmetic.
On 2017-11-09 15:36, Nicolas Cellier 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 <tudor@tudorgirba.com <mailto:tudor@tudorgirba.com>>: �� �� ^ *rcvr asTrueFraction perform: selector with: self*
�� �� 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
�� �� <https://pharo.fogbugz.com/f/cases/20488/x-y-iff-x-y-0-is-no >t-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'].
�� �� 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 <http://www.tudorgirba.com>
�� �� www.feenk.com <http://www.feenk.com>
�� �� "Problem solving should be focused on describing
�� �� the problem in a way that makes the solution obvious."