The Museum of HP Calculators

HP Forum Archive 20

 RPN FLOOR and CEILMessage #1 Posted by Werner on 27 Sept 2011, 5:37 a.m. easy, short, no tests, valid for positive and negative arguments 1.using only FRC CEIL(x) = x - FRC(FRC(x) - 1) FLOOR(x) = x - FRC(FRC(x) + 1) (written 41C style, but easily portable) *LBL"CEIL" ENTER FRC 1 - FRC - RTN *LBL"FLOOR" ENTER FRC 1 + FRC - RTN 2.using MOD: (1 byte shorter for FLOOR..) *LBL"CEIL" RCL X (or ENTER ENTER) -1 MOD - RTN *LBL"FLOOR" RCL X 1 MOD - RTN Cheers, Werner

 Re: RPN FLOOR and CEILMessage #2 Posted by Dieter on 27 Sept 2011, 8:28 a.m.,in response to message #1 by Werner Yes, as mentioned earlier, MOD can provide an elegant solution here. I especially like the idea with this double FRC since it can be used on virtually all RPN machines, but there is one caveat: There is a numeric pitfall for arguments close to zero. For values so small that numerically 1 ± x = 1 the method will simply return x. For instance, x = 1E-10 will return the correct result (1) on a 12-digit machine, but a 10-digit machine will return 1E-10. Otherwise your idea works well. Dieter

 Re: RPN FLOOR and CEILMessage #3 Posted by Werner on 27 Sept 2011, 9:28 a.m.,in response to message #2 by Dieter *smack on the head* You're absolutely right of course. Back to square one. Werner

 Re: RPN FLOOR and CEILMessage #4 Posted by Dieter on 28 Sept 2011, 7:58 a.m.,in response to message #3 by Werner The FRC method is fine for the programming contest since for r =< 5000 there will be no fractional part less than frac(sqrt(4901)) = 0,00714. ;-) For the record, here's another way to implement a CEIL resp. FLOOR function. It requires the same 7 bytes as yours, works for any argument and uses just two stack registers. However, SIGN is required. Or any other function that turns 0 < x < 1 into something between 1 and (less than) 2. INT LastX FRC X>0? ; use X>0? for CEIL or X<0? for FLOOR SIGN INT + BTW - the test before the SIGN function is not required because of the special way the HP-41 evaluates this function. ;-) Dieter

 Re: RPN FLOOR and CEILMessage #5 Posted by Werner on 28 Sept 2011, 8:18 a.m.,in response to message #4 by Dieter yes, that's what I used in my 41C program (found in another part of the forum - and lacking the second INT which is not needed for positive args.) Some more CEIL stuff: perfect function (i.e. LASTX contains X, no stack level used) *LBL"CEIL" INT RUP X<> L X>Y? ISG Y LBL 00 (NOP) X<> L RDN END and if we're not so picky: *LBL"CEIL" ENTER INT X

Go back to the main exhibit hall