Because by definition, a floating point value is of the form

+/- 2^e * m

for some 0 <= m < M, and e in some range of values (some positive, some negative). There are other special cases that don't matter here, such as NaN, INF, denormals, etc.

So now set up the equality you want. Since it's positive we can skip the sign. Hence,

2^e * m = 1/10

Or, rather,

10 * 2^e * m = 1

The Fundamental Theorem of Arithmetic shows this is impossible.

Andres.

On 11/9/17 6:48 , Tudor Girba wrote:
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."









.


Reply via email to