ahdinw01@ULKYVX.BITNET (05/31/90)
Strike 1: (Burn my previous ROUN/RN post) [WHAT you never got it? Oh well all the better...] First post: Here is a newer and more improved version of Robert Yoder's original number rounder program. The number rounder can be modified easily in various ways to yield different types of rounding. One alternative (improvement depending on how you look at it) is to look at the fractional part of the mantissa of the number. Thus Given : 3.99999999E50 Yields: 4.E50 whereas the old version would leave such numbers unchanged. I realize this may not be desired by some since numbers like 19999.254 will be rounded to 20000. If you fall into this category, then omit 'n' this post. Other changes include: m 1 + 'm' STO to 1 'm' STO+ and ARRY-> -> sl to ARRY-> DUP LIST-> << IF sl SIZE 1 SAME IF 2 == THEN * END THEN sl 1 GET DUP ELSE sl DUP LIST-> DROP * END For those of us with 48's, the program is better implemented with a large CASE statement, otherwise you will have to revert back to the original IF THEN ELSE... structure. Second Post: Well, I found one obvious problem(besides typos) with the ROUN version I posted earlier; namely that negative number returned positive results. This is because I too hastily took a line of code from my original implementation of ROUN and plopped it into Yoder's. I still can't decide on what implementation of ROUN is really the most desirable. I like Yoder's version of ROUN but I want it to correct calculator round off ONLY. Therefore, I don't want ROUN to round off 4.0183E-18 just because its small since it might be the actual result of a calculation. If I'm thinking the wrong logic here then somebody please set me straight. Also, when I get a chance to type in (or build myself the cable) I will post my original version of ROUN. My version is slightly slower but I will post it anyways since it approaches the problem quite differently. Who knows, there might even be some optimizations I missed. I am posting ROUN as I currently have it in my calculator so that the checksums will match. The previous post had typos and a wrong checksum. Barring anymore more typos, here is RN. (or ROUN as posted by Yoder) ============================================================================ RN: Bytes #EA69h, 506.5 << DUP -> TYPE t << CASE t NOT THEN DUP SIGN SWAP DUP DUP IF THEN XPON SWAP MANT END ; MANT doesn't like 0 ROT SWAP DUP IP SWAP FP 0 -> m << WHILE DUP FP m 10 < AND REPEAT IF DUP FP .00009 <= ;this constant can be adjusted THEN FLOOR ELSE IF DUP FP .9999 >= ;this constant can be adjusted THEN CEIL END END 10 * 1 'm' STO+ END m ALOG / + * 10 ROT ^ * >> END IF t 1 == THEN C->R SWAP RN SWAP RN IF DUP THEN R->C ELSE DROP END END IF t 3 == t 4 == OR THEN OBJ-> DUP OBJ-> IF 2 == THEN * END -> d s << 1 s START RN s ROLL NEXT d ->ARRY >> END IF t 5 == THEN OBJ-> -> s << 1 s START RN s ROLL NEXT s ->LIST >> END END >> >> ============================================================================ Aaron Dinwiddie ==> Agima <== ahdinw01@ulkyvx ============================================================================