dos_compilers/Digital Research PLI-86 v1/ANNUITY.PLI

83 lines
2.4 KiB
Plaintext
Raw Normal View History

2024-06-30 21:01:25 +02:00
/******************************************************/
/* This program computes either the present value(PV),*/
/* the payment(PMT), or the number of periods in an */
/* annuity. */
/******************************************************/
annuity:
procedure options(main);
%replace
clear by '^z',
true by '1'b;
declare
PMT fixed decimal(7,2),
PV fixed decimal(9,2),
IP fixed decimal(6,6),
x float binary,
yi float binary,
i float binary,
n fixed;
declare
ftc entry(float binary(24))
returns(character(17) varying);
put list (clear,'^i^iO R D I N A R Y A N N U I T Y');
put skip(2) list
('^iEnter Known Values, or 0, on Each Iteration');
on error
begin;
put skip list('^iInvalid Data, Re-enter');
goto retry;
end;
retry:
do while (true);
put skip(3) list('^iPresent Value ');
get list(PV);
put list('^iPayment ');
get list(PMT);
put list('^iInterest Rate ');
get list(yi);
i = yi / 1200;
put list('^iPay Periods ');
get list(n);
if PV = 0 | PMT = 0 then
x = 1 - 1/(1+i)**n;
/******************************/
/* compute the present value */
/******************************/
if PV = 0 then
do;
PV = PMT * dec(ftc(x/i),15,6);
put edit('^iPresent Value is ',PV)
(a,p'$$$,$$$,$$$V.99');
end;
/******************************/
/* compute the payment */
/******************************/
if PMT = 0 then
do;
PMT = PV * dec(ftc(i/x),15,8);
put edit('^iPayment is ',PMT)
(a,p'$$,$$$,$$$V.99');
end;
/*****************************/
/* compute number of periods */
/*****************************/
if n = 0 then
do;
IP = ftc(i);
x = char(PV * IP / PMT);
n = ceil ( - log(1-x)/log(1+i) );
put edit('^i',n,' Pay Periods')
(a,p'ZZZ9',a);
end;
end;
end annuity;