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
 cdmackay Senior Member Posts: 634 Joined: Sep 2018
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 71B 17B/BII/bII+ 28S 42S/DM42 32SII 48GX 50g 35s 30b/WP34S Prime G2
& Casios, Rockwell 18R :)
02-23-2020, 01:53 AM
Post: #2
 cdmackay Senior Member Posts: 634 Joined: Sep 2018
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 71B 17B/BII/bII+ 28S 42S/DM42 32SII 48GX 50g 35s 30b/WP34S Prime G2
& Casios, Rockwell 18R :)
02-23-2020, 01:55 AM (This post was last modified: 02-23-2020 02:02 AM by cdmackay.)
Post: #3
 cdmackay Senior Member Posts: 634 Joined: Sep 2018
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 71B 17B/BII/bII+ 28S 42S/DM42 32SII 48GX 50g 35s 30b/WP34S Prime G2
& Casios, Rockwell 18R :)
02-23-2020, 07:34 AM
Post: #4
 cdmackay Senior Member Posts: 634 Joined: Sep 2018
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 71B 17B/BII/bII+ 28S 42S/DM42 32SII 48GX 50g 35s 30b/WP34S Prime G2
& Casios, Rockwell 18R :)
02-23-2020, 09:39 AM (This post was last modified: 02-23-2020 09:44 AM by Csaba Tizedes.)
Post: #5
 Csaba Tizedes Senior Member Posts: 495 Joined: May 2014
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)

02-23-2020, 04:10 PM
Post: #6
 ttw Member Posts: 244 Joined: Jun 2014
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.
02-23-2020, 05:23 PM
Post: #7
 cdmackay Senior Member Posts: 634 Joined: Sep 2018
RE: Perform two successive binary operations on same input
hah! very good, I agree

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 71B 17B/BII/bII+ 28S 42S/DM42 32SII 48GX 50g 35s 30b/WP34S Prime G2
& Casios, Rockwell 18R :)
 « Next Oldest | Next Newest »

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