1  REM ****  HP BASIC PROGRAM LIBRARY  ********************************
2  REM
3  REM      GIRRPV:  INVESTMENT RETURN (CASH FLOW)
4  REM
5  REM      36513 REV A
6  REM
7  REM **** CONTRIBUTED PROGRAM  **************************************
50  DIM A$[10],Z$[10]
60  T9=100
100  REM  NAME -- IRRPV
110  REM  FUNCTION -- COMPUTES INTERNAL RATE OF RETURN AND
111  REM              PRESENT VALUE
120  REM  SPONSOR -- PROF. VAN HORNE
130  REM  PROGRAMMERS --
140  REM    D. NIEBUHR (MAY, 1969)
150  REM    W. SHARPE (JAN, 1971)
160  REM  INPUTS -- CASH FLOWS
170  REM  DATA -- CASH FLOWS (OPTIONAL)
180  REM  FILES -- NONE
190  REM -----------------------------------------------
200  REM F(1) THROUGH F(N) ARE CASH FLOWS FOR PERIOD 1 THROUGH N
210  DIM F[100]
220  REM ------------------------------------------------
250  REM -- DETERMINE INPUT SOURCE
260  PRINT "PLEASE INDICATE INPUT SOURCE --"
261  PRINT "  T  (FOR TERMINAL)"
262  PRINT "  D  (FOR DATA STATEMENTS)"
265  PRINT "SOURCE";
266  INPUT S$
267  IF S$="T" THEN 300
268  PRINT "HAVE YOU ENTERED THE DATA STATEMENTS";
269  DIM V$[15]
270  INPUT V$
271  IF V$[1,1]="Y" THEN 300
280  REM ------------------------------------------------
281  PRINT "FOR EACH INVESTMENT, ENTER THE FOLLOWING INFORMATION--"
282  PRINT "  THE NUMBER OF PERIODS"
283  PRINT "  CASH FLOW FOR FIRST PERIOD"
284  PRINT "  CASH FLOW FOR SECOND PERIOD"
285  PRINT "  'YES' IF ALL THE REST OF THE FLOWS ARE THE SAME, 'NO' IF NOT"
286  PRINT "  IF THE REMAINING FLOWS ARE DIFFERENT FROM THE SECOND --"
287  PRINT "     FLOW FOR THIRD PERIOD, FLOW FOR FOURTH PERIOD, ETC."
288  PRINT "USE + VALUES FOR CASH INFLOWS, - VALUES FOR OUTFLOWS"
289  PRINT "ENTER DATA STATEMENTS BEGINNING AT LINE 9000"
290  PRINT "ADDITIONAL INVESTMENTS MAY BE INCLUDED BY ADDING MORE"
291  PRINT "DATA STATEMENTS."
292  PRINT "WHEN DATA STATEMENTS HAVE BEEN ENTERED, RE-RUN THE PROGRAM."
293  STOP 
300  REM -- GET INFORMATION
310  PRINT "NUMBER OF PERIODS AFTER PERIOD ZERO";
320  GOSUB 8000
321  LET N=Z9+1
330  PRINT "+ REPRESENTS A NET INFLOW, - REPRESENTS A NET OUTFLOW"
340  PRINT "INITIAL CASH FLOW IN PERIOD ZERO";
350  GOSUB 8000
351  LET F[1]=Z9
360  PRINT "CASH FLOW IN FIRST PERIOD";
370  GOSUB 8000
371  LET F[2]=Z9
380  IF N <= 2 THEN 490
390  PRINT "ARE ALL THE REST OF THE FLOWS THE SAME";
400  GOSUB 8100
401  LET A$=Z$
405  IF A$="YES" THEN 450
415  FOR I=3 TO N
420  PRINT "PERIOD ";I-1;" FLOW";
425  GOSUB 8000
426  LET F[I]=Z9
430  NEXT I
435  GOTO 490
450  REM -- ALL FLOWS THE SAME
460  FOR I=3 TO N
465  LET F[I]=F[2]
470  NEXT I
490  REM -- ALL FLOWS INPUT
500  REM -------------------------------------------------
510  REM -- SELECT NEXT TASK
520  PRINT 
530  PRINT "WHAT NEXT (IRR,PV,NEW OR STOP)";
540  INPUT A$
550  IF A$ <> "IRR" THEN 560
555  GOSUB 800
556  GOTO 520
560  IF A$ <> "PV" THEN 570
565  GOSUB 900
566  GOTO 520
570  IF A$ <> "STOP" THEN 575
571  STOP 
575  IF A$ <> "NEW" THEN 580
576  REM -- NEXT PROBLEM
577  GOTO 300
580  PRINT "I DON'T UNDERSTAND -- TRY AGAIN "
581  GOTO 520
590  REM ----------------------------------------------------
800  REM ---------------------------------------------
810  REM -- CALCULATE INTERNAL RATE OF RETURN
815  IF F[1]<0 THEN 830
820  PRINT "THE INTERNAL RATE OF RETURN CANNOT BE CALCULATED"
821  PRINT "UNLESS THE INITIAL CASH FLOW IS AN OUTFLOW (-)"
822  PRINT "SORRY"
823  PRINT 
824  RETURN 
830  REM
832  LET R=.95
834  LET M=0
836  LET F1=1
838  LET M=M+1
840  LET S1=F[1]
842  IF M>20 THEN 880
844  LET S2=0
846  FOR I=2 TO N
848  LET S2=S2+(I-1)*F1*F[I]
850  LET F1=F1*R
852  LET S1=S1+(F1*F[I])
856  NEXT I
860  LET D=S1/S2
862  LET R=R-D
864  IF ABS(D)>.0005 THEN 836
870  LET R=100*((1/R)-1)
872  LET R=.01*INT(100*R+.5)
874  PRINT "THE INTERNAL RATE OF RETURN IS ";R;" PERCENT"
876  PRINT 
878  RETURN 
880  REM -- ROUTINE HAS NOT FOUND SOLUTION
882  PRINT "NO INTERNAL RATE OF RETURN FOUND USING STANDARD "
884  PRINT "PROCEDURES. YOU MIGHT FIND IT WITH TRIAL-AND-ERROR"
886  PRINT "COMPUTATIONS OF PRESENT VALUES. IF YOU WANT TO TRY,"
887  PRINT "START WITH A DISCOUNT RATE OF ";
888  PRINT 100*((1/R)-1);" PERCENT"
890  PRINT 
892  RETURN 
900  REM -------------------------------------------------
910  REM -- CALCULATE PRESENT VALUE OF FLOWS
920  PRINT 
930  PRINT "DISCOUNT RATE (IN PERCENT)";
931  INPUT K
935  LET K=.01*K
940  LET P=0
945  LET K1=1
950  FOR I=1 TO N
955  LET P=P+F[I]/K1
960  LET K1=K1*(1+K)
970  NEXT I
975  PRINT "NET PRESENT VALUE IS ";P
985  PRINT 
990  RETURN 
8000  REM ----------------------------------------------------
8001  REM -- SUBROUTINE TO PUT NEXT VALUE IN Z9
8010  LET Z9=1
8020  GOSUB 8200
8030  RETURN 
8100  REM -- SUBROUTINE TO PUT NEXT VALUE IN Z$
8110  LET Z9=0
8120  GOSUB 8200
8130  RETURN 
8200  REM -- SUBROUTINE TO GET NEXT VALUE
8210  IF S$="T" THEN 8230
8212  REM -- READ NEXT DATA STATEMENT
8213  IF Z9=1 THEN 8220
8214  READ Z$
8215  PRINT "?";Z$
8216  RETURN 
8220  REM -- READ NUMERIC DATA
8221  READ Z9
8222  PRINT "?";Z9
8223  RETURN 
8230  REM -- INPUT VALUE
8232  IF Z9=1 THEN 8240
8234  INPUT Z$
8236  RETURN 
8240  REM -- INPUT NUMERIC DATA
8242  INPUT Z9
8246  RETURN 
9999  END 
