83 lines
2.4 KiB
Plaintext
83 lines
2.4 KiB
Plaintext
|
/******************************************************/
|
|||
|
/* 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;
|
|||
|
|