HP Forums
Perform two successive binary operations on same input - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html)
+--- Forum: General Forum (/forum-4.html)
+--- Thread: Perform two successive binary operations on same input (/thread-14555.html)



Perform two successive binary operations on same input - cdmackay - 02-23-2020 01:03 AM

[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>



RE: Perform two successive binary operations on same input - cdmackay - 02-23-2020 01:53 AM

arg! I stupidly forgot that RPL LASTARG will restore both args, which makes the RPL case trivial; ah well.


RE: Perform two successive binary operations on same input - cdmackay - 02-23-2020 01:55 AM

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.


RE: Perform two successive binary operations on same input - cdmackay - 02-23-2020 07:34 AM

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.


RE: Perform two successive binary operations on same input - Csaba Tizedes - 02-23-2020 09:39 AM

(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


RE: Perform two successive binary operations on same input - ttw - 02-23-2020 04:10 PM

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.


RE: Perform two successive binary operations on same input - cdmackay - 02-23-2020 05:23 PM

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!