Fraction equality and Float infinity problem
nicolas cellier
ncellier at ifrance.com
Tue Mar 28 10:44:10 UTC 2006
Large Fraction asFloat do overflow and answer Float infinity.
((11 raisedTo: 400) / 2) asFloat = Float infinity. "is true"
So far, nothing wrong, except i prefer exception, but that was another
discussion.
But then they also equal Float infinity, and that sound strange to me:
((11 raisedTo: 400) / 2) = Float inifinity. "is true"
What is bad in this behavior ? It is that you don't have equality transitivity
property any more, and that is a flaw:
((11 raisedTo: 400) / 2) = Float inifinity. "is true"
((13 raisedTo: 400) / 2) = Float inifinity. "is true"
((11 raisedTo: 400) / 2) = ((13 raisedTo: 400) / 2). "is false"
Then you can expect very weird bugs again in Sets. Add these 3 objects to a
Set. Since transitivity is broken, the size of the set will vary according to
the order you will add objects to it, the hash code algorithm and the set
capacity. Something very nasty.
Sure, few people use Large Fractions, and knowing this, they'd rather not, but
this is not the right argument.
Also, the hash correction i'am proposing is likely to make things worse.
So we have to fix this one. Any idea but testing for infinity in
adaptToFraction:andSend: / adaptToFloat:andSend: ?
This is another reason why i really prefer arithmetic exceptions: handle such
case. But i cannot move to arithmetic exception alone.
More information about the Squeak-dev
mailing list
|