Post Reply 
(32S) Floor Function
06-03-2017, 07:47 AM (This post was last modified: 06-15-2017 01:25 PM by Gene.)
Post: #1
(32S) Floor Function
For real input the programme returns Floor of input without disturbing the stack.

Improvements most welcome.

Code:

0.    LBL “F”
1.    X>=0?
2.    GTO O
3.    STO F
4.    FP
5.    STO G
6.    ABS
7.    X≠0?
8.    RCL/ G
9.    RCL+ F
10.    LBL O
11.    IP
12.    RTN
Find all posts by this user
Quote this message in a reply
06-29-2017, 04:02 PM
Post: #2
RE: (32S) Floor Function
I'm not familiar with the 32S, but on the 42S I just solved this myself using the code in the picture (it's labeled "80" because I made it part of a KEYG/MENU structure). It did take me a while though, I'm only just getting used to RPN and its quirks.

   
Find all posts by this user
Quote this message in a reply
06-30-2017, 07:05 AM
Post: #3
RE: (32S) Floor Function
Doesn't work for -0.999999999999 (-1 + 1e-12), or in general for
-9.9999999999x Eyyy, x=5..9, yyy>=-1
(both the 32S and 42S versions, BTW)

The easiest way without stack preservation is

Code:
>LBL "FLOOR"
  RCL ST X  (or ENTER X<>Y)
  1
  MOD
  -
  END

I don't have a 32S so I don't know what commands are available there.
For the 41/42S, one version with stack preservation is as follows:

Code:
>LBL"FLOOR"
 IP
 X<>Y
 X<> ST L
 X<Y?
 DSE ST Y        always skips
>LBL 00
 X<> ST L
 X<>Y
 END

Cheers, Werner

41CV†,42S,48GX,49G,DM42,DM41X,17BII,15CE,DM15L,12C,16CE
Find all posts by this user
Quote this message in a reply
06-30-2017, 07:23 AM
Post: #4
RE: (32S) Floor Function
(06-30-2017 07:05 AM)Werner Wrote:  Doesn't work for -0.999999999999 (-1 + 1e-12), or in general for
Are you sure? I just tried, the 42S code works fine on Free42 and on the DM42.
Find all posts by this user
Quote this message in a reply
06-30-2017, 08:51 AM
Post: #5
RE: (32S) Floor Function
I'm sure ;-)
Free42 and DM42 work with 34 digits, so there, take (-1 + 1e-34)

Werner

41CV†,42S,48GX,49G,DM42,DM41X,17BII,15CE,DM15L,12C,16CE
Find all posts by this user
Quote this message in a reply
06-30-2017, 11:31 AM (This post was last modified: 06-30-2017 11:31 AM by c785.)
Post: #6
RE: (32S) Floor Function
OK, you're right. "IP" after "+" isn't a good idea, so replace the sequence
Code:
+
IP
with
Code:
X<>Y
IP
+
and everything should be OK. Now even -1+10^-34 gives the right result on the DM42.
Find all posts by this user
Quote this message in a reply
06-30-2017, 02:58 PM
Post: #7
RE: (32S) Floor Function
OK, I think I got the idea now. How about this:

Code:
> LBL "FLOOR"
  IP
  RCL- ST L
  X>0?
  DSE ST L
  CLX
  X<> ST L
  RTN
Find all posts by this user
Quote this message in a reply
07-01-2017, 10:16 AM
Post: #8
RE: (32S) Floor Function
LastX is not correct ;-) In my version above, it is.
Werner

41CV†,42S,48GX,49G,DM42,DM41X,17BII,15CE,DM15L,12C,16CE
Find all posts by this user
Quote this message in a reply
07-02-2017, 09:29 AM
Post: #9
RE: (32S) Floor Function
You're right once again. The only thing I'd do differently is the "nop" command -- a label there is quite misleading and can lead to trouble when the code is part of a larger program, so I prefer "X<>X" in its place.

In any case, RPN is great. What I could have done with RPL in about five minutes now took me several days to grasp. But I did learn a thing or two.
Find all posts by this user
Quote this message in a reply
07-02-2017, 10:18 AM
Post: #10
RE: (32S) Floor Function
X<> ST X is two bytes, and I have a label there for the CEIL function to jump to ;-)

Code:
 { 38-Byte Prgm }
>LBL"CEIL"
 INT
 X<>Y
 X<> L
 X>Y?
 ISG Y        always skips
 X<=Y?        nop
 GTO 00
>LBL"FLOOR"
 INT
 X<>Y
 X<> L
 X<Y?
 DSE Y        always skips
>LBL 00        not a nop
 X<> L
 X<>Y
 END

Cheers, Werner

41CV†,42S,48GX,49G,DM42,DM41X,17BII,15CE,DM15L,12C,16CE
Find all posts by this user
Quote this message in a reply
Post Reply 




User(s) browsing this thread: 3 Guest(s)