-----Original Message----- From: David N. Smith (IBM) [SMTP:dnsmith@watson.ibm.com] Sent: Monday, November 29, 1999 6:42 PM To: squeak@cs.uiuc.edu Subject: RE: Intervals
At 13:14 -0500 11/29/99, Jarvis, Robert P. wrote:
The attached change set combines Andrew's changes with Dan's suggestions
and
runs correctly for the test cases identified, as well as for negative numbers, i.e.
Hummmm... I've been looking at the code and I wonder if it will always work with floating point values? Stepping through the interval involves adding the step value at each increment, but asking if a value is in the interval involves modulo arithmetic. The problem comes when the step value cannot be exactly represented in binary (0.7 for example).
I can't believe it will always work identically, but I've not been able to come up with a test case that fails. (I implemented a version if #includes: that is simply:
includesP: aValue ^ self asArray includes: aValue
and used it for comparison. This IS a precise and accurate solution, though it might run out of memory at inconvenient times and otherwise misbehave when the interval has lots of elements.
Using the changes I just (re)posted I find that
(1.0 to: 20.0 by: 0.2) includes: 1.2
answers false, where it should answer true. Herewith is the changed change set which adds a fudge factor to dodge around the problems with Float step values.
'From Squeak2.6 of 11 October 1999 [latest update: #1559] on 30 November 1999 at 8:58:03 am'!
!Interval methodsFor: 'accessing' stamp: 'rpj 11/30/1999 08:55'! includes: aNumber "Determine if aNumber is an element of this interval. Include a fudge factor to account for Float step values." ^(self rangeIncludes: aNumber) and: [ aNumber - self first \ step = 0 or: [ (aNumber - self first \ step - step) abs < 0.000000000000001 ] ]! !
!Interval methodsFor: 'accessing' stamp: 'rpj 11/29/1999 11:39'! rangeIncludes: aNumber ^aNumber between: (self first min: self last) and: (self first max: self last)! !
Bob Jarvis Compuware @ Timken
squeak-dev@lists.squeakfoundation.org