\ loan.4th
\ Loan calculator -- calculates monthly payment to pay off a loan with
\ a fixed interest rate for a fixed number of years.
\ This program is useful for calculating payments for fixed interest
\ mortgage loans (not including taxes and insurance). User can adjust
\ the loan amount, number of years, and interest rate to calculate
\ "what if?" scenarios.
\ Copyright (c) 2002 Krishna Myneni
\ May be distributed in accordance with the GNU General Public License
\ ---------------------------------------
variable interest_rate 6500 interest_rate ! \ annual rate of 6.5%
variable months 180 months !
variable amount 100000 amount !
\ ---------------------------------------
include lib/anscore.4th
include lib/mixed.4th
include lib/enter.4th
variable principal
variable interest
variable balance
: month_interest ( -- n | calculate monthly interest on balance )
balance @ u>d interest_rate @ 1200000 m*/ d>u ;
\ Calculate number of months required to payoff loan with monthly payment of n
: months_payoff ( n -- m )
amount @ balance !
dup month_interest <= if drop -1 exit then \ will never payoff
0
begin
month_interest balance +! \ accrue interest
over negate balance +! \ apply payment
1+ \ next month
\ dup 4 .r 2 spaces balance @ 6 .r cr
balance @ 0 <= \ are we paid off?
until
1- swap drop ;
4 array last_monthlys
: ?converged ( payment nmonths -- flag | have values been seen before )
2dup last_monthlys 2@ d= -rot
last_monthlys 2 cells + 2@ d= or ;
: update_last ( payment nmonths -- )
last_monthlys 2 cells + 2@ last_monthlys 2!
last_monthlys 2 cells + 2! ;
: monthly_payment ( -- n | determine the monthly payment )
amount @ months @ / dup 40 * 100 / + ( order of mag estimate )
begin
dup months_payoff
dup -1 =
while
drop dup 10 / +
repeat
\ ( -- payment nmonths )
0 0 update_last 0 0 update_last
begin
months @ - dup
while
0> if 1+ else 1- then
dup months_payoff
2dup ?converged if drop exit then
2dup update_last
repeat
drop ;
: loan ( -- )
." Enter whole numbers only (no decimal):" cr cr
." Amount of loan: " enter amount !
." Number of years: " enter 12 * months !
." Yearly interest rate (% x 1000): " enter interest_rate !
cr
monthly_payment
." Your monthly payment is about " .
." (excluding taxes and insurance)." cr
;
loan
|