/*********************************************
gcc -std=gnu99 $CFLAGS -Wall -Wextra -I/usr/local/include/dfp -o dfp-amort dfp-amort.c -ldfp

./dfp-amort

**********************************************/

#define _GNU_SOURCE
#define __STDC_WANT_DEC_FP__
#include <fenv.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
extern int __bid_fixddsi(_Decimal64 a);

int main() {

_Decimal64 P, pmt, interest, ann_rate, num_periods, per_rate, Ppmt;
int i;

// set rounding mode to round half up
fe_dec_setround(FE_DEC_TONEARESTFROMZERO);

ann_rate = 0.0329DD;
per_rate = ann_rate / 12.0DD;

P = 60000.0DD; // P = strtod64("60000.0", NULL);
num_periods = 60.0DD;

// The formula used to determine payment of an annuity (loan):
// pmt = P * per_rate/(1-(1+per_rate)^-n)
//
pmt = P * per_rate/(1.0DD - powd64((1.0DD + per_rate), -num_periods));
pmt = quantized64(pmt, 1.00DD);

fprintf(stdout, "Payment = %10.2DF\n\n", pmt);

fprintf(stdout, "%10s%12s%12s%16s%12s\n", "Period" , "Principal", "Interest", "Pmt on Princ", "Check");

i = 1;
interest = per_rate * P;
interest = quantized64(interest, 1.00DD);
Ppmt = pmt - interest;
fprintf(stdout, "%10d%12.2Df%12.2Df%16.2Df%12.2Df\n", i, P, interest, Ppmt, (interest + Ppmt));

for(i=2; i<=__bid_fixddsi(num_periods); i++) {
	P = P - Ppmt;
	interest = per_rate * P;
	interest = quantized64(interest, 1.00DD);
	Ppmt = pmt - interest;
	fprintf(stdout, "%10d%12.2Df%12.2Df%16.2Df%12.2Df\n", i, P, interest, Ppmt, (interest + Ppmt));
}

}
