HP Forums
[41,42] Perfect functions - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Software Libraries (/forum-10.html)
+--- Forum: HP-41C Software Library (/forum-11.html)
+--- Thread: [41,42] Perfect functions (/thread-14988.html)



[41,42] Perfect functions - Werner - 05-13-2020 01:07 PM

A 'perfect' function is one that mimicks the built-in functions:
  • save X in LastX
  • take the n arguments from the stack, compute the result in X
  • roll down the stack and replicate reg T n-1 times

Here, I present a few routines that pass these requirements.

1. Parallel Resistance:
In: X Y
Out: X*Y/(X+Y)
Code:
01 LBL"PAR"
02 STO L
03 X<>Y
04 ST+ Y
05 X<>Y
06 X!=0?
07 ST/ Y
08 X<> L
09 *
10 END

For the 42S, that can be shortened to:

Code:
00 { 17-Byte Prgm }
01▸LBL "PAR"
02 RCL+ ST Y
03 X≠0?
04 STO÷ ST Y
05 X<> ST L
06 ×
07 END

2. CEIL and FLOOR
Code:
01*LBL"CEIL"
02 INT
03 X<>Y
04 X<> L
05 X>Y?
06 ISG Y
07 X<=Y?
08 GTO 00
09*LBL"FLOOR"
10 INT
11 X<>Y
12 X<> L
13 X<Y?
14 DSE Y
15*LBL 00
16 X<> L
17 X<>Y
18 END

3. combine two percentages
1+r%/100 = (1+x%/100)*(1+y%/100) -> r%=x% +y% + x%*y%/100
In: x% y%
Out: r%
Code:
01*LBL"%*"
02 %
03 ST+ Y
04 X<> L
05 +
06 END

4. SINC
Sinc(x) = Sin(x)/x, or 1 if x=0
Code:
01 LBL"SINC"
02 SIN
03 X<> L
04 X!=0?
05 ST/ L
06 X<> L
07 X=0?
08 SIGN
09 END

Do you have more?

Cheers, Werner


RE: [41,42] Perfect functions - rprosperi - 05-13-2020 03:32 PM

Here's the first program I put into any new RPN machine I play with:

%T - Return the percent that X is of Y

Code:
01 LBL "%T"
02 1/X
03 %
04 1/X
05 RTN

Derived with Joe Horn one late Friday night at a PPC meeting, around 1982-3? Cliff Stern may have been involved too. We celebrated by going to get 'breakfast' at Denny's at around 2am when the meeting ended, a long tradition after PPC meetings at the time.

Edit: Forgot to say thanks Werner, for a handy new tool for the toolbox! Smile


RE: [41,42] Perfect functions - Werner - 05-13-2020 04:32 PM

While short and concise, it is not a perfect function, Bob!
Werner


RE: [41,42] Perfect functions - rprosperi - 05-13-2020 10:31 PM

Oops. LastX is broken.... And to think I've been happy with it all these years for preserving the stack. Dang. On the other hand, while nice, I never thought of it as perfect.

No simple way I can see to fix that. I'll have to live with it, imperfect as it is.

Thanks.


RE: [41,42] Perfect functions - Sylvain Cote - 05-13-2020 11:02 PM

(05-13-2020 04:32 PM)Werner Wrote:  While short and concise, it is not a perfect function, Bob!
I do not know if you want to keep P2 in the stack or not, so I assume not

(05-13-2020 10:31 PM)rprosperi Wrote:  No simple way I can see to fix that.
Not that hard either. Wink

Code:
STK :  L  X  Y  Z  T
IN  :  l P1 P2  z  t
OUT : P1  R  t  t  t

Formula: R = (P1 / P2) × 100%

Code:
01 LBL "%T"
02 STO Z 
03 1/X
04 %
05 1/X
06 *
07 RUP
08 STO Y
09 X<> Z
10 X<> L
11 END



RE: [41,42] Perfect functions - rprosperi - 05-13-2020 11:49 PM

Close, but no cigar...

This saves X into L, but you've lost the original Z. Sad


RE: [41,42] Perfect functions - Sylvain Cote - 05-14-2020 05:30 AM

(05-13-2020 11:49 PM)rprosperi Wrote:  Close, but no cigar...
This saves X into L, but you've lost the original Z. Sad
You're tough ... Wink

2nd version
Code:
STK :  L  X  Y  Z  T
IN  :  l P1 P2  z  t
OUT : P1  R  z  t  t

Formula: R = (P1 / P2) × 100%

Code:
FOCAL___  >  _L_  _X_  _Y_  _Z_  _T_
LBL "%T"  >    l   12   60    z    t
/         >   12    5    z    t    t
Last X    >   12   12    5    z    t
X<>Y      >   12    5   12    z    t
1/X       >    5   .2   12    z    t
X<>Y      >    5   12   .2    z    t
Code:
STO L     >   12   12   .2    z    t
RDN       >   12   .2    z    t   12
100       >   12  100   .2    z    t
ST* Y     >   12  100   20    z    t
RDN       >   12   20    z    t  100
RCL Z     >   12    t   20    z    t
RDN       >   12   20    z    t    t
END       >   12   20    z    t    t



RE: [41,42] Perfect functions - Werner - 05-14-2020 06:20 AM

In analogy to % and %CH, %T should also leave Y intact.
This comes close:

Code:
>LBL"%T"
 X<>Y
 ST+ Y
 X<>Y
 %CH
 %
 X<> L
 END
but LASTX may suffer from roundoff.
So that leaves

Code:
>LBL"%T"
 ABS
 CLX
 100
 X<>Y
 ST/ Y
 X<>Y
 X<> L
 ST* L
 X<> L
 END
In this case, I'd go for the imperfect, elegant solution though ;-)

Cheers, Werner
PS. Added SINC to the original post


RE: [41,42] Perfect functions - rprosperi - 05-14-2020 12:36 PM

(05-13-2020 11:02 PM)Sylvain Cote Wrote:  I do not know if you want to keep P2 in the stack or not, so I assume not

I missed this comment the first time, sorry. As Werner noted, keeping P2 (Y) is required to mimic the other % functions, but also because often you are still operating on the total, which is likely why HP chose to keep Y in the other % functions.

I need to check out the stackrobatics in the last one, but I'll keep the short one too.

Thank you both! Smile