/* ** amortize.c Demonstration C program to calculate loan payments ** on standard fixed rate loans ** ** 6-16-07, http://willus.com ** */ #include #include #include int main(void) { char buf[64]; double annual_rate_percent; double years; double months; double loan_amount; double principal; double monthly_rate_percent; double monthly_rate; double monthly_increase; double monthly_payment; int i,imod; printf("Fixed mortgage payment calculator from http://willus.com.\n\n"); printf("Enter annual rate (%%, def=7.00): "); fgets(buf,30,stdin); if (buf[0]=='\n') annual_rate_percent = 7.00; else annual_rate_percent = atof(buf); printf("Enter loan amount ($, def=150000): "); fgets(buf,30,stdin); if (buf[0]=='\n') loan_amount = 150000.; else loan_amount = atof(buf); printf("Enter number of years (def=30): "); fgets(buf,30,stdin); if (buf[0]=='\n') years = 30; else years = atof(buf); months = years * 12.; /* ** Note that the monthly rate is not, as you might expect, ** ** 100 * ( ( ( 1 + annual_rate_percent / 100. ) ^ ( 1 / 12. ) ) - 1. ) ** ** ... which would, when compounded monthly, result in exactly the ** annual rate after one year. Instead, the convention is simply ** to use the annual rate divided by 12, which is pretty close to ** the same value. E.g. for an annual rate of 12.00 %, the monthly ** rate calculated by the formula above would be about 0.949 %, ** whereas the simpler "divide by 12" formula yields exactly 1.000 %. */ monthly_rate_percent = annual_rate_percent / 12.; monthly_rate = monthly_rate_percent / 100.; monthly_increase = 1.0 + monthly_rate; /* The magic monthly payment formula */ monthly_payment = loan_amount * monthly_rate * pow(monthly_increase,months) / (pow(monthly_increase,months) - 1.); printf("\nAnnual Rate = %.3f %%\n",annual_rate_percent); printf("Loan Amount = $%g\n",loan_amount); printf("Number of Years = %g\n",years); printf("Monthly Payment = $%.2f\n",monthly_payment); printf("Payment # Interest Remaining Principal\n" "-----------------------------------------------\n"); imod = (int)(months/10.+.1); // How often to print the values /* Loop to calculate remaining principal over time */ principal=loan_amount; for (i=1;i<=months;i++) { double interest; interest = principal * monthly_rate; principal = principal + interest - monthly_payment; if (i==1 || i%imod==0) printf(" %4d %9.2f %9.2f\n",i,interest,principal); } printf("\nPress to exit.\n"); fgets(buf,30,stdin); return(0); }