%%HP: T(3)A(D)F(.);
DIR
  WORK
    DIR
      WIPE
        \<< 'WIPE'
DUP RCL CLVAR SWAP
STO
        \>>
    END
  X\177dX
    \<<
"Press left-shifted
menu key for HELP"
CLLCD 1 DISP 1
FREEZE { { "INTRO"
{
      \<< IN
      \>> } } { " + "
{
      \<< ADD
      \>>
      \<< IN.A
      \>> } } { " - "
{
      \<< SUBT
      \>>
      \<< IN.S
      \>> } } { " * "
{
      \<< MUL
      \>>
      \<< IN.M
      \>> } } { " / "
{
      \<< DIV
      \>>
      \<< IN.D
      \>> } } { " ^ "
{
      \<< PWR
      \>>
      \<< IN.P
      \>> } } { "\|^\|v"
{
      \<< SWP2
      \>>
      \<< IN.SW
      \>> } } {
"f(x)" {
      \<< RANDM
      \>>
      \<< IN.R
      \>> } } { "\-> %"
{
      \<< P.UNC
      \>>
      \<< IN.%
      \>> } } {
"SIGFIG" {
      \<< SIGFIG
      \>>
      \<< IN.SI
      \>> } } } MENU
    \>>
  IN
    \<<
"
  UNCERTAINTY
     CALCULATION
            PROGRAM

      for the HP 48SX
[\|v]"
CLLCD 1 DISP 0 WAIT
"Written for the public
domain by

 John A. Kyle

       UBC 1991
[\|v]              v 1.1"
CLLCD 1 DISP 0 WAIT
" Absolute     Random
  error       error
functions    function
---------    --------
+ - * / ^      f(x)

[\|v]"
CLLCD 1 DISP 0 WAIT
"The absolute functions
calculate total error
whereas the random
function calculates a
less pessimistic error
with a 90% confidence
[\|v]          level"
CLLCD 1 DISP 0 WAIT
"utilizing:

 Z=f(x,..)
                   1/2
dZ=[(\.df/\.dx)^2*dx^2+..]

[\|v]"
CLLCD 1 DISP 0 WAIT
"NOTE:

   Use 0 for dX when
 X has no uncertainty
 associated with it,
 etc."
CLLCD 1 DISP 0 WAIT
6 DROPN
    \>>
  IN.A
    \<<
"Enter like so..

(X\177dX) + (Y\177dY)
                4:   X
        \->       3:  dX
                2:   Y
                1:  dY"
CLLCD 1 DISP 7
FREEZE
    \>>
  IN.S
    \<<
"Enter like so..

(X\177dX) - (Y\177dY)
                4:   X
        \->       3:  dX
                2:   Y
                1:  dY"
CLLCD 1 DISP 7
FREEZE
    \>>
  IN.M
    \<<
"Enter like so..

(X\177dX) * (Y\177dY)
                4:   X
        \->       3:  dX
                2:   Y
                1:  dY"
CLLCD 1 DISP 7
FREEZE
    \>>
  IN.D
    \<<
"Enter like so..

(X\177dX) / (Y\177dY)
                4:   X
        \->       3:  dX
                2:   Y
                1:  dY"
CLLCD 1 DISP 7
FREEZE
    \>>
  IN.P
    \<<
"Enter like so..

         x 
   (Y\177dY)          
                3:   Y
       \->        2:  dY
                1:   x"
CLLCD 1 DISP 7
FREEZE
    \>>
  IN.R
    \<<
"
 Use EQUATION WRITER
to enter symbolic
expression..

then press f(x) key
and follow prompts."
CLLCD 1 DISP 7
FREEZE
    \>>
  IN.SW
    \<<
"Rotates levels 1&2 
with 3&4..

4:   X          4:   Y
3:  dX   \->      3:  dY
2:   Y          2:   X
1:  dY          1:  dX"
CLLCD 1 DISP 7
FREEZE
    \>>
  IN.%
    \<<
"
  Utility to convert 
  from absolute to 
  % uncertainty

ie. X\177dX  \->  X\177dX%"
CLLCD 1 DISP 7
FREEZE
    \>>
  IN.SI
    \<<
"
   Utility to display
 X\177dX with the correct
 significant figures
 as determined by the
 uncertainty.

"
CLLCD 1 DISP 7
FREEZE
    \>>
  PRESERVE
    \<< RCLF \-> f
      \<< EVAL f STOF
      \>>
    \>>
  CST { { "INTRO" {
    \<< IN
    \>> } } { " + " {
    \<< ADD
    \>>
    \<< IN.A
    \>> } } { " - " {
    \<< SUBT
    \>>
    \<< IN.S
    \>> } } { " * " {
    \<< MUL
    \>>
    \<< IN.M
    \>> } } { " / " {
    \<< DIV
    \>>
    \<< IN.D
    \>> } } { " ^ " {
    \<< PWR
    \>>
    \<< IN.P
    \>> } } { "\|^\|v" {
    \<< SWP2
    \>>
    \<< IN.SW
    \>> } } { "f(x)"
{
    \<< RANDM
    \>>
    \<< IN.R
    \>> } } { "\-> %" {
    \<< P.UNC
    \>>
    \<< IN.%
    \>> } } {
"SIGFIG" {
    \<< SIGFIG
    \>>
    \<< IN.SI
    \>> } } }
  SUBT
    \<<
      IFERR \-> x dx
y dy
        \<< x y - 'Z'
\->TAG dx dy + 'dZ'
\->TAG SIGFIG
        \>>
      THEN IN.S
      END
    \>>
  MUL
    \<<
      IFERR \-> x dx
y dy
        \<< x y * 'Z'
\->TAG dx y * x dy *
+ 'dZ' \->TAG SIGFIG
        \>>
      THEN IN.M
      END
    \>>
  DIV
    \<<
      IFERR \-> x dx
y dy
        \<< x y / 'Z'
\->TAG dx y * x dy *
+ y 2 ^ / 'dZ' \->TAG
SIGFIG
        \>>
      THEN IN.D
      END
    \>>
  PWR
    \<<
      IFERR \-> y dy
x
        \<< y x ^ "Z"
\->TAG dy x * y x 1 -
^ * "dZ" \->TAG
SIGFIG
        \>>
      THEN IN.P
      END
    \>>
  P.UNC
    \<<
      IFERR DUP2
DTAG SWAP DTAG \-> dz
z
        \<< "  " 2
FIX z \->STR " \177 "
" % " dz z / 100 *
ABS \->STR STD + + +
+ CLLCD 2 DISP
"Percent Uncertainty"
1 DISP 1 FREEZE
        \>>
      THEN
"
 Requires entry 
like so..

 Z\177dZ
       \->    2:       Z
            1:      dZ"
CLLCD 1 DISP 7
FREEZE
      END
    \>>
  SIGFIG
    \<<
      IFERR DUP2
DTAG SWAP DTAG \-> dx
x
        \<<
          IF x TYPE
0 == x 0 \=/ AND dx
TYPE 0 == dx 0 \=/
AND AND
          THEN "( "
x XPON DUP dx XPON
- FIX x DUP SIGN
SWAP MANT * SWAP
ALOG dx SWAP / "\177"
SWAP " )E" + + + +
STD x XPON +
" To correct SIG.FIG's
"
SWAP + CLLCD 1 DISP
1 FREEZE
          END
        \>>
      THEN
"
 Requires entry
like so..

  Z\177dZ
         \->    2:     Z
              1:    dZ"
CLLCD 1 DISP 7
FREEZE
      END
    \>>
  RANDM
    \<<
      IFERR DUP
        \<< -2 SF -3
CF
          IF TYPE 9
==
          THEN DUP
{ } 0 { } \-> equ
dequ finlst ans
varlst
            \<<
"stop"
              WHILE
dequ "stop" SAME
NOT
              REPEAT
CASE dequ TYPE 9 ==
  THEN dequ OBJ\->
DROP2
  END dequ TYPE 6
==
  THEN varlst 1 3
CF
    IF varlst SIZE
    THEN
      DO GETI
        IF dequ
SAME
        THEN 3 SF
        END
      UNTIL -64 FS?
      END
    END
    IF 3 FC?
    THEN dequ
'varlst' STO+
    END DROP2
  END
END 'dequ' STO
              END 3
CF varlst 1
              DO
GETI \-> i
\<<
" Enter values for.."
": " i ":
:d" i ":"
+ + + + { { 1 0 } V
} + INPUT OBJ\-> equ
i \.d * SQ 'ans' STO+
DTAG i SWAP
'finlst' STO+
'finlst' STO+
\>>
              UNTIL
-64 FS?
              END
DROP2 equ finlst |
"Z" \->TAG ans finlst
| \v/ "dZ" \->TAG
SIGFIG
            \>>
          ELSE IN.R
          END
        \>> PRESERVE
      THEN IN.R
      END
    \>>
  SWP2
    \<<
      IFERR 4 ROLL
4 ROLL
      THEN DROP
IN.SW
      END
    \>>
  ADD
    \<<
      IFERR \-> x dx
y dy
        \<< x y + 'Z'
\->TAG dx dy + 'dZ'
\->TAG SIGFIG
        \>>
      THEN IN.A
      END
    \>>
END
