[comp.sys.handhelds] a better ->Qpi

efinley%ug.utah.edu@cs.utah.edu (Elliott Finley) (03/15/90)

When I tried using the built in '->Qpi' function of the hp48sx,
I was a little disappointed.  For a simple example of what I mean, try
entering '1/3*pi', change it to a number, then execute '->Qpi'.  It
gives you a big fraction that is supposed to be a "best guess".

Here are three programs that I use that will correctly factor pi out
of a fraction.  They'll also work on a 28 with one change (see below).

Most of the code in the R-QC program was taken from an article that
appeared on the net a while back, I can't remember who posted it so I
can't give credit where credit is due.  (Thanks, whoever it was)

%%HP: T(3)A(D)F(.); @ R->Q (this works the same as the built in '->Q')@
\<< EVAL \->NUM R\->QC \-> RN RD
\<< "'" RN ABS \->STR + "/" + RD
\->STR + "'" + OBJ\-> RN SIGN *
\>> \>>


%%HP: T(3)A(D)F(.); @ R->QP (this is the replacement for the built in '->Qpi')@
\<< EVAL \->NUM DUP 
\pi \->NUM / \-> R P
\<< R R\->QC P R\->QC \-> RN RD PN PD
\<< IF PD RD < THEN
PN \pi * PD / ELSE
"'" RN ABS \->STR + "/" + RD \->STR + "'" + OBJ\-> RN SIGN *
END \>> \>> \>>

To use the above program on a 28 just change the OBJ-> to STR->

%%HP: T(3)A(D)F(.); @ R->QC (this program is called from the other two)@
\<< .000000000005 1 0
\-> X P A B
\<< X WHILE
'ABS(FLOOR(X*A+.5)-X*A)\>=P*A'
EVAL REPEAT
INV DUP IP ABS A * B +
A 'B' STO 'A' STO FP END
DROP 'FLOOR(X*A+.5)' EVAL A
\>> \>>



             Elliot