Post Reply 
Perform two successive binary operations on same input
02-23-2020, 01:03 AM (This post was last modified: 02-23-2020 07:41 AM by cdmackay.)
Post: #1
Perform two successive binary operations on same input
[this is perhaps a little simplistic to be of interest, but…]

I often want to perform two successive binary operations (i.e. operations with two operands/arguments) on the same input, leaving the two results in the two lower stack levels.

An example might be finding the quotient and remainder (DIV/MOD) of two integers, on calculators that don't have a combined operation such as e.g 41/SandMath QREM, 50g IDIV2, Prime iquorem(). That often requires the first operation to be a binary operation followed by one or more unary operations, e.g. ÷ IP, followed by the second binary operation, e.g. MOD.

My clumsy efforts are as follows; I've not yet considered using STO/RCL methods, which might be useful if stack preserving was a requirement.

This is for interactive use; of course a program could be simpler.

I'd be interested in hearing of quicker/easier/more elegant methods.

RPN (stack not preserved)
Code:
Y ENTER ENTER X ENTER
R↓ x<>y R↓
<first binary operation>
<successive unary operations>
ENTER R↓ R↓                    # dup first result to Z
<second binary operation>

if the RPN example has just a single first binary operation, with no successive unary operations, it's much simpler:

RPN (stack not preserved)
Code:
Y ENTER ENTER X
<first binary operation>
x<>y
LASTX
<second binary operation>


RPL (uses stack levels 1–4)
Code:
Y X DUP2
<first binary operation>
<successive unary operations>
3 ROLLD                        # move first result to level 3; alt: ROT ROT
<second binary operation>

if the RPL example has just a single first binary operation, with no successive unary operations, it's much simpler:

RPL (uses stack levels 1–4)
Code:
Y X
<first binary operation>
LASTARG
<second binary operation>

Cambridge, UK
41CL/DM41X 12/15C/16C DM15/16 17B/II/II+ 28S 42S/DM42 32SII 48GX 50g 35s WP34S PrimeG2 WP43S/pilot/C47
Casio, Rockwell 18R
Find all posts by this user
Quote this message in a reply
02-23-2020, 01:53 AM
Post: #2
RE: Perform two successive binary operations on same input
arg! I stupidly forgot that RPL LASTARG will restore both args, which makes the RPL case trivial; ah well.

Cambridge, UK
41CL/DM41X 12/15C/16C DM15/16 17B/II/II+ 28S 42S/DM42 32SII 48GX 50g 35s WP34S PrimeG2 WP43S/pilot/C47
Casio, Rockwell 18R
Find all posts by this user
Quote this message in a reply
02-23-2020, 01:55 AM (This post was last modified: 02-23-2020 02:02 AM by cdmackay.)
Post: #3
RE: Perform two successive binary operations on same input
Although, LASTARG will only work if there's just one operation.

e.g. in my example, on many calcs the quotient requires two operations: ÷ IP, and so LASTARG won't restore the original Y X.

The RPL example in the first post will allow successive unary operations after the first binary operation.

Cambridge, UK
41CL/DM41X 12/15C/16C DM15/16 17B/II/II+ 28S 42S/DM42 32SII 48GX 50g 35s WP34S PrimeG2 WP43S/pilot/C47
Casio, Rockwell 18R
Find all posts by this user
Quote this message in a reply
02-23-2020, 07:34 AM
Post: #4
RE: Perform two successive binary operations on same input
and there's a similar use of LASTX that can be used to simplify the RPN case, again if there's only the one binary operation. I'll edit that in too.

Cambridge, UK
41CL/DM41X 12/15C/16C DM15/16 17B/II/II+ 28S 42S/DM42 32SII 48GX 50g 35s WP34S PrimeG2 WP43S/pilot/C47
Casio, Rockwell 18R
Find all posts by this user
Quote this message in a reply
02-23-2020, 09:39 AM (This post was last modified: 02-23-2020 09:44 AM by Csaba Tizedes.)
Post: #5
RE: Perform two successive binary operations on same input
(02-23-2020 01:03 AM)cdmackay Wrote:  I often want to perform two successive binary operations...
My clumsy efforts are as follows; I've not yet considered using STO/RCL methods, which might be useful if stack preserving was a requirement.

Sure! Check the attachment, there is my opinion about "Tricky-Genius-Programming-Style" - just as a practical engineer point of view...

So, with STO and RCL, with one flag and with lots of labels:

LBL A and LBL B: the two binary operation
LBL S: store the stack status
LBL T: store previous result
LBL R: restore the stack status

variable R: previous result
flag 0: set, if the stack X is the previous result

for the first running clear the flag 0

Code:

LBL A / LBL B
  XEQ S
  //do the binary operation on Y and X here; result in X
  SF 0 //it was an operation and the result is in X
  XEQ R //recover the stack
RTN

LBL S //store stack status
  FS0? //there is a result in X?
  XEQ T
  STO X
  x<>y
  STO Y
  x<>y
RTN

LBL T
  STO R
  Rdown
  CF0
RTN

LBL R //stack recovery
  RCL Y
  x<>y
  RCL X
  x<>y
RTN

Csaba

https://www.hpmuseum.org/forum/attachment.php?aid=8104


Attached File(s) Thumbnail(s)
   
Find all posts by this user
Quote this message in a reply
02-23-2020, 04:10 PM
Post: #6
RE: Perform two successive binary operations on same input
On the hp50g, I've done this several way depending on the desired operations. Sometimes I do things like (assuming two operands on the stack):
MAX LASTARG MIN
In other cases:
DUP2 "ops leaving single result" UNROT

I often need things like IDIV2 but that's so slow that IQUOT (or even / FLOOR) and MOD with LASTART or DUP2 are much faster.
Find all posts by this user
Quote this message in a reply
02-23-2020, 05:23 PM
Post: #7
RE: Perform two successive binary operations on same input
hah! very good, I agree Wink

thanks for all the suggestions, will study. forgot about UNROT too.

I've been mostly doing this interactive, so hadn't even thought about performance e.g. IDIV2, good point thanks!

Cambridge, UK
41CL/DM41X 12/15C/16C DM15/16 17B/II/II+ 28S 42S/DM42 32SII 48GX 50g 35s WP34S PrimeG2 WP43S/pilot/C47
Casio, Rockwell 18R
Find all posts by this user
Quote this message in a reply
Post Reply 




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