tbg@apollo.UUCP (04/07/87)
Anybody have a definition of a word that will
sort 4 integers on the stack? I need one and I'm
very surprised that none of the books I've got
has one. Of course I could write one myself but
I thought it would be a fun use of comp.lang.forth.
Actually what I need is something that will check
four words on the stack to see if at least three
of them are approximately equal, and return the
average of the approximately equal ones and a flag
indicating whether there were at least 3 approximately
equal values found (or garbage and a flag indicating
that there were not 3 values approximately equal).
Speed is important. The value used to test for
"approximately equal" could be either a variable or
passed as an argument, whichever is faster. I think
an easy way to check for 3 approximately equal values
would be to sort the 4 values first, so that's why
I need a sort routine. Maybe I have the basis of
a Dr. Dobb's article here, if it hasn't all been
written about before.
/tomdrw@cullvax.UUCP (04/08/87)
tbg@apollo.uucp (Tom Gross) writes: > Actually what I need is something that will check > four words on the stack to see if at least three > of them are approximately equal, and return the > average of the approximately equal ones and a flag > indicating whether there were at least 3 approximately > equal values found (or garbage and a flag indicating > that there were not 3 values approximately equal). Don't bother to sort the values. That will take a theoretical minimum of 5 comparisons, whereas testing all pairs for approximate equality will only take 6. (Assuming that approximate equality testing is not much slower than greater/less testing.) Test all 6 pairs (straight-line code) for approximate equality, and keep count of the number of pairs that pass. If at least 3 pairs pass, then you have a good case. But... If the 4 numbers are A, B, C, and D, it could be that the following sets of pairs test approximately equal: Case 1: AB BC AC (so D's the odd man out) Case 2: AB BC CD (because A and D are just a little too far apart) Determining the average value can be tricky, because you aren't guaranteed that there is a uniquely defined set of values all of which are approximately equal to each other, and none of which are approximately equal to anything outside the set. E.g., in case 2 above, which numbers do you average? And why is your text indented 5 spaces? It's a waste! Dale -- Dale Worley Cullinet Software UUCP: ...!seismo!harvard!mit-eddie!cullvax!drw ARPA: cullvax!drw@eddie.mit.edu Un*x (a generic name for a class of OS's) != Unix (AT&T's brand of such)