1  REM  ****  HP BASIC PROGRAM LIBRARY  *******************************
2  REM
3  REM        ALERA:   PROPAGATION OF ERROR
4  REM
5  REM        36603 REV  B   10/73
6  REM
7  REM  ****  CONTRIBUTED PROGRAM  ************************************
1000  REM  PROGRAM ERROR
1010  REM
1020  DIM A$[3],B$[44],V[37],Z[37],M[37],N[3]
1030  REM
1040  LET B$="ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789+-*/^= "
1050  REM
1100  PRINT " ","ALGEBRAIC ERROR ANALYSIS"
1110  PRINT 
1120  PRINT "INSTRUCTIONS, (YES OR NO)";
1130  INPUT A$[1,3]
1140  PRINT 
1150  IF A$[1,1]="N" THEN 1500
1200  REM
1210  PRINT 
1220  PRINT "   THIS PROGRAM COMPUTES THE RESULTANT PRECISION OF A ";
1225  PRINT "QUANTITY."
1230  PRINT "IT IS RESTRICTED TO A SERIES OF BINARY OPERATIONS OF THE ";
1235  PRINT "FORM:  VOV"
1240  PRINT "WHERE 'V' IS ANY ALPHABETIC CHARACTER, '#', OR A SINGLE";
1245  PRINT " DIGIT INTEGER."
1247  PRINT "THE ABSOLUTE PRECISION OF THE INTEGERS IS ZERO."
1250  PRINT 
1260  PRINT "'O' IS ONE OF THE FOLLOWING OPERATORS"
1270  PRINT "    +   ADD"
1280  PRINT "    -   SUBTRACT"
1290  PRINT "    *   MULTIPLY"
1300  PRINT "    /   DIVIDE"
1310  PRINT "    ^   EXPONENTIATE"
1320  PRINT "    =   STORE"
1330  PRINT 
1340  PRINT "IN ALL CASES EXCEPT '=', THE RESULT IS RETURNED IN '#',"
1350  PRINT "THIS MAY BE USED IN SUBSEQUENT OPERATIONS."
1360  PRINT 
1380  PRINT "TYPING A SINGLE VARIABLE ALLOWS ENTERING ITS VALUE DIRECTLY"
1390  PRINT "OTHERWISE, THE PROGRAM WILL ASK FOR ALL VALUES NEEDED"
1395  PRINT 
1400  PRINT "THERE ARE TWO COMMANDS:"
1410  PRINT "  RESTORE,  CLEARS ALL VARIABLES"
1420  PRINT "  LIST,     LISTS ALL NON-EMPTY VARIABLES"
1500  REM    INITIALIZATION
1510  REM
1520  PRINT 
1530  PRINT "INITIALIZED"
1540  PRINT 
1550  FOR I=1 TO 37
1560  LET V[I]=Z[I]=M[I]=0
1570  NEXT I
1600  FOR I=0 TO 9
1610  LET J=I+28
1620  LET M[J]=1
1630  LET V[J]=I
1640  NEXT I
1700  PRINT 
2000  REM    INPUT AND SYNTAX
2020  INPUT A$[1,3]
2030  IF A$[1,3]="RES" THEN 1520
2040  IF A$[1,3]="LIS" THEN 4520
2050  REM
2100  FOR J=38 TO 44
2110  IF A$[2,2]=B$[J,J] THEN 2200
2120  NEXT J
2130  PRINT "  INVALID OPERATOR"
2140  GOTO 2020
2200  LET K=J-37
2210  REM
2300  FOR I=1 TO 3 STEP 2
2310  FOR J=1 TO 37
2320  IF A$[I,I]=B$[J,J] THEN 2400
2330  NEXT J
2340  PRINT "  INVALID VARIABLE,";I
2350  GOTO 2020
2360  REM
2400  IF (M[J]=1 OR (I=1 AND K=6)) AND K#7 THEN 2500
2410  PRINT "    ENTER:  ";B$[J,J];", D";B$[J,J];"  ";
2420  INPUT V[J],Z[J]
2430  LET M[J]=1
2440  IF K=7 THEN 2020
2450  REM
2500  LET N[I]=J
2510  IF K#6 OR J<28 OR I=3 THEN 2600
2520  PRINT "  NO INTEGER STORE"
2530  GOTO 2020
2600  NEXT I
2610  REM
3000  REM    EVALUATION
3010  REM
3020  LET N1=N[1]
3030  LET N2=N[3]
3040  LET V1=V[N1]
3050  LET V2=V[N2]
3060  GOTO K OF 3110,3210,3310,3410,3510,3610
3070  REM
3100  REM   ADD
3110  LET V[27]=V1+V2
3120  LET Z[27]=SQR(Z[N1]^2+Z[N2]^2)
3130  GOTO 4020
3200  REM   SUBTRACT
3210  LET V[27]=V1-V2
3220  GOTO 3120
3300  REM   MULTIPLY
3310  LET V[27]=V1*V2
3320  LET Z[27]=ABS(V[27]*SQR((Z[N1]/V1)^2+(Z[N2]/V2)^2))
3330  GOTO 4020
3400  REM   DIVIDE
3410  LET V[27]=V1/V2
3420  GOTO 3320
3500  REM   EXPONENTIATION
3510  LET V[27]=V1^V2
3520  LET Z[27]=ABS(V2*Z[N1]*V1^(V2-1))
3530  GOTO 4020
3600  REM   STORE
3610  LET V[N1]=V[N2]
3620  LET Z[N1]=Z[N2]
3630  LET M[N1]=1
3640  PRINT "    STORED"
3650  GOTO 2020
4000  REM     PRINT
4010  REM
4020  PRINT 
4030  PRINT "   # = ";V[27];TAB(25);"D# = ";Z[27];TAB(50);"D#/# = ";
4040  PRINT ABS(Z[27]/V[27])
4050  PRINT 
4060  LET M[27]=1
4070  GOTO 2020
4080  REM
4500  REM     LIST
4510  REM
4520  PRINT 
4530  FOR I=1 TO 27
4540  IF M[I]=0 THEN 4560
4550  PRINT B$[I,I];" = ";V[I];TAB(20);"D";B$[I,I];" = ";Z[I]
4560  NEXT I
4570  PRINT 
4580  GOTO 2020
9999  END 
