[squeak-dev] #closeTo: on small numbers
Stéphane Rollandin
lecteur at zogotounga.net
Sun Mar 8 10:21:54 UTC 2020
Hello all,
I just got bitten by the fact that
1.2246063538223773e-15 closeTo: 3.552713678800501e-15
retuns false.
Now Float>>closeTo: has special tests for zero, so that when a number is
compared to zero the test is based on an absolute deviation.
But in the above case, none of the numbers are actually zero so the
zero-specific test is bypassed, and the regular check based on relative
deviation fails.
I guess this all works as expected. But I am wondering: would #closeTo:
still be consistent if we implemented this way:
closeTo: num
"are these two numbers close?"
num isNumber ifFalse: [^[self = num] ifError: [false]].
self = 0.0 ifTrue: [^num abs < 0.0001].
num = 0 ifTrue: [^self abs < 0.0001].
(self closeTo: 0.0) ifTrue: [^self abs < 0.0001].
^self = num asFloat
or: [(self - num) abs / (self abs max: num abs) < 0.0001]
There I added the (self closeTo: 0.0) case to have two near-zero numbers
compared as if one of them was indeed zero.
Would nasty side effects be expected?
Stef
More information about the Squeak-dev
mailing list
|