Oh, just something I forgot to mention:

ScaledDecimal should behave the way you expect.

1.3s1 = (13/10).
-> true.

1.3s2*1.3s2 = 1.69s2.
-> true
1.3 * 1.3 = 1.69.
-> false

Nicolas

2009/7/7 Nicolas Cellier <[email protected]>:
> Hi Hernan,
> This is the new Behavior of Float comparison and it is desired.
>
> 1) 1.3 is represented in machine as
> (1.3 significandAsInteger printStringRadix: 2) , '.0e' , (1.3 exponent
> - Float precision + 1) printString.
> -> '2r10100110011001100110011001100110011001100110011001101.0e-52'
>
> Or if you prefer:
> (1.3 asTrueFraction numerator printStringBase: 2) , '/' , (1.3
> asTrueFraction denominator printStringBase: 2).
> -> 
> '10100110011001100110011001100110011001100110011001101/10000000000000000000000000000000000000000000000000000'
>
> As you can see, this is quite different from 13/10.
>
> However, you can test (13/10) asFloat = 1.3 and that happens to be
> true, but that won't always be true.
>
> 2) comparing Float with strict equality is a dangerous game. Floating
> point operation are inherently inexact and thus asserting an exact
> equality is considered a bad practice.
>
> 3) basing comparisons and equality tests on inexact arithmetic rather
> than on exact arithmetic leads to weird behaviours. See
> http://bugs.squeak.org/view.php?id=3374
>
>
> So i do not consider this fragment of code alone as a bug but as a feature.
> There might be some code depending on the old behaviour that can
> eventually break.
> If you have such an example in true application, I'm interested.
> I think we'd better fix such code to not rely on exact equality...
>
> Cheers.
>
> Nicolas
>
>
>
> 2009/7/7 Hernan Wilkinson <[email protected]>:
>> I added this new issue that happens on the latest image.
>> I'm posting it here because I think it is an important bug because it
>> affects the number model.
>> The problem is related with all fractions who's denominator is not power of
>> two. (130/100 = 1.3 or 1/5 = 0.2, etc)
>> (See
>>
>> Float>>adaptToFraction: rcvr andCompare: selector where it does
>>    ....
>>    "Try to avoid asTrueFraction because it can cost"
>>     selector == #= ifTrue: [
>>       rcvr denominator isPowerOfTwo ifFalse: [^false]].
>>
>>    ...)
>>
>>
>> Hernan.
>>
>>
>>
>> _______________________________________________
>> Pharo-project mailing list
>> [email protected]
>> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>>
>

_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

Reply via email to