2017-11-09 15:44 GMT+01:00 Raffaello Giulietti <
[email protected]>:
> According to IEEE 754, the base of Pharo Float, *finite* values shall
> behave like old plain arithmetic.
>
>
> This is out of context.
There is no such thing as Fraction type covered by IEEE 754 standard.
Anyway relying upon Float equality should allways be subject to extreme
caution and examination
For example, what do you expect with plain old arithmetic in mind:
a := 0.1.
b := 0.3 - 0.2.
a = b
This will lead to (a - b) reciprocal = 3.602879701896397e16
If it is in a Graphics context, I'm not sure that it's the expected scale...
>
> 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 <[email protected] <mailto:
>> [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
>> <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'].
>>
>> ^ *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 <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."
>>
>>
>>
>>
>>
>>
>>
>
>