-----Original Message----- From: Peter Crowther [SMTP:Peter.Crowther@IT-IQ.com] Sent: Tuesday, November 30, 1999 9:25 AM To: 'squeak@cs.uiuc.edu' Subject: RE: Intervals
You're still assuming steps at, or of the order of, 1.
<sigh> Guilty as charged. I also confess to having missed an edge condition. Dare I hope for a velvet rope with which to be hung, m'lud? :-)
'From Squeak2.6 of 11 October 1999 [latest update: #1559] on 30 November 1999 at 11:07:18 am'!
!Interval methodsFor: 'accessing' stamp: 'rpj 11/30/1999 11:04'! includes: aNumber "Determine if aNumber is an element of this interval." ^(self rangeIncludes: aNumber) and: [ self valuesInclude: aNumber ]! !
!Interval methodsFor: 'private' stamp: 'rpj 11/30/1999 11:01'! rangeIncludes: aNumber "Private" ^aNumber between: (self first min: self last) and: (self first max: self last)! !
!Interval methodsFor: 'private' stamp: 'rpj 11/30/1999 11:04'! valuesInclude: aNumber "Private - answer whether or not aNumber is one of the enumerated values in this interval." ^(aNumber - self first \ step = 0) or: [ ((aNumber - self first \ step - step) abs < (step * 1e-10) abs) or: [ (aNumber - self first \ step) abs < (step * 1e-10) abs ] ]! !
I know the addition of a fudge factor may cause problems in some cases, but it does (help) Squeak support Dan's Principle of Least Astonishment. To me it's quite amazing that Squeak says
(1.0 to: 20.0 by: 0.2) includes: 1.2 ==> false
while it's (a bit) less amazing for it to say
(1.0 to: 20.0 by: 0.2) includes: 19.999999999999 ==> true
Of course, all this mucking about with Floats is going to come back to haunt us at some later date. Floats, as I think I've mentioned in the past, are evil...
Bob Jarvis Compuware @ Timken