# HP Forums

Full Version: TVM with odd period
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
A program to calculate TVM for a loan with "odd period" after the first payment.
From the HP 12C Guide: «The period from the date interest begins accruing to the date of the first payment, being not equal to the regular payment periods is sometimes referred to as an “odd first period»

The program calculates payment or rate (APR, Europe: TAEG) and interest for the days in odd period, inputting the number of days or calculating a difference between two dates.

Enjoy with it!

Salvo Micciché

Code:

export OP_pmt:=0;
export OP_rate:={0,0};
export OP_interest:=0;

diffDays();
numDays();
simpComp();
diffRate();
numRate();

EXPORT odd_period()
// SAlvo Micciché 2015
BEGIN
END;

diffDays()
BEGIN
local day1, day2, n, fin, r;
local dd1, dd2, mm1, mm2, yy1, yy2;
local pv, beg, inte;
local comp, pmt, anno,gg;

input ({ {pv, [0], {15,15,1}},
{n, [0], {40,15,1}},{r,[0],{70,15,1}},
{beg,0, {15,2,2}}, {comp,0,{50,2,2}},
{fin,0,{80,2, 2}},
{dd1,[0],{15,15,4}},
{mm1,{"1","2","3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}, {40,15,4}},
{yy1,[0],{70,15,4}},
{dd2,[0],{15,15,5}},
{mm2,{"1","2","3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}, {40,15,5}},
{yy2,[0],{70,15,5}} },
"Calc payment with Δdays",
{"PV", "N","r%","End","Compound","Financial", "d1", "m1", "y1", "d2", "m2", "y2"},
{"Present value (loan)", "Yearly pmt number", "APR Yearly rate%", "Begin or End", "Compound interest",
"Financial year (360)", "Day 1", "Month 1", "Year 1", "Day 2", "Month 2", "Year 2"},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0},
{1000, 36, 5, 1, 0, 1, 1, 1, 2015, 1, 1, 2015});

dd1:=EVAL(dd1); mm1:=EVAL(mm1);
dd2:=EVAL(dd2); mm2:=EVAL(mm2);
yy1:=EVAL(yy1); yy2:=EVAL(yy2);
day1 := yy1+mm1/100+dd1/10000;
day2 := yy2+mm2/100+dd2/10000;

IF (fin==0) THEN // Actual year
gg:= DDAYS(day1, day2);
anno:=365;
ELSE // Financial year
gg:= 30*(mm2-mm1)+dd2-dd1;
anno:=360;
END; //if

inte:= simpComp(comp, pv, r, gg, anno);
pmt:=Finance.CalcPMT(n, r, (-(pv+inte)),0,12,12,beg);
RECT_P();
TEXTOUT_P("Odd period " + EVAL(gg) + "days", 25,50);
TEXTOUT_P("Interest odd period " + EVAL(inte), 25, 70);
TEXTOUT_P("Monthly payment " + EVAL(pmt), 25, 90);
TEXTOUT_P("Press ESC key to continue", 25, 110, 3, RGB(0,0,255));
WAIT;
sto(pmt, OP_pmt);
sto(inte, OP_interest);
// RETURN pmt;
END;

numDays()
BEGIN
local day1, day2, n, fin, r;
local dd1, dd2, mm1, mm2, yy1, yy2;
local pv, beg, inte;
local comp, pmt, anno,gg;

input ({ {pv, [0], {15,15,1}},
{n, [0], {40,15,1}},{r,[0],{70,15,1}},
{beg,0, {15,2,2}},
{comp,0, {50,2,2}},
{fin,0,{80,2, 2}},
{gg, [0], {70,15,3}} },
"Calc payment with num days",
{"PV", "N","r%","End","Compound","Financial","num Days"},
{"Present value (loan)", "Yearly pmt number", "APR Yearly rate%",
"Begin or End", "Compound interest", "Financial year (360)", "Number of Days" },
{0, 0, 0, 0, 0, 0, 0},
{1000, 36, 5, 1, 0, 1, 20} );

IF (fin==0) THEN // Actual year
anno:=365;
ELSE // Financial year
anno:=360;
END; //if

inte:= simpComp(comp, pv, r, gg, anno);
pmt:=Finance.CalcPMT(n, r, (-(pv+inte)),0,12,12,beg);
RECT_P();
TEXTOUT_P("Odd period " + EVAL(gg), 25,50);
TEXTOUT_P("Interest odd period " + EVAL(inte), 25, 70);
TEXTOUT_P("Monthly payment " + EVAL(pmt), 25, 90);
TEXTOUT_P("Press ESC key to continue", 25, 110, 3, RGB(0,0,255));
WAIT;
sto(pmt, OP_pmt);
sto(inte, OP_interest);
END;

diffRate()
BEGIN
local day1, day2, n, fin, r;
local dd1, dd2, mm1, mm2, yy1, yy2;
local pv, beg, inte, reff;
local comp, pmt, anno,gg;

input ({ {pv, [0], {15,15,1}},
{pmt, [0], {40,15,1}},{n,[0],{70,15,1}},
{beg,0, {15,2,2}}, {comp,0,{50,2,2}}, {fin,0,{80,2, 2}},
{dd1,[0],{15,15,4}},
{mm1,{"1","2","3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}, {40,15,4}},
{yy1,[0],{70,15,4}},
{dd2,[0],{15,15,5}},
{mm2,{"1","2","3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}, {40,15,5}},
{yy2,[0],{70,15,5}}  },
"Calc APR rate with Δdays",
{"PV", "PMT","N", "End","Compound","Financial", "d1", "m1", "y1", "d2", "m2", "y2" },
{"Present value (loan)", "Monthly payment", "Yearly payments number",
"Begin or End", "Compound interest", "Financial year (360)",
"Day 1", "Month 1", "Year 1", "Day 2", "Month 2", "Year 2" },
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0},
{1000, 100, 42, 1, 0, 1, 1, 1, 2015, 1, 1, 2015} );
dd1:=EVAL(dd1); mm1:=EVAL(mm1);
dd2:=EVAL(dd2); mm2:=EVAL(mm2);
yy1:=EVAL(yy1); yy2:=EVAL(yy2);
day1 := yy1+mm1/100+dd1/10000;
day2 := yy2+mm2/100+dd2/10000;
IF (fin==0) THEN // Actual year
gg:= DDAYS(day1, day2);
anno:=365;
ELSE // Financial year
gg:= 30*(mm2-mm1)+dd2-dd1;
anno:=360;
END; //if
reff:=Finance.CalcIPYR(n,pv,-pmt,0,12,12,1); // effective rate
r:= 100*((reff/100 + 1)^(1/12)-1)*12; // nominal rate (12 compounding period yearly)
inte:= simpComp(comp, pv, r, gg, anno);
r:=Finance.CalcIPYR(n, (-(pv+inte)),pmt, 0,12,12,beg);
RECT_P();
TEXTOUT_P("Odd period " + EVAL(gg), 25,50);
TEXTOUT_P("Interest odd period " + EVAL(inte), 25, 70);
TEXTOUT_P("Monthly rate " + EVAL(r/12), 25, 90);
TEXTOUT_P("APR yearly rate (TAEG) " + EVAL(r), 25, 110);
TEXTOUT_P("Press ESC key to continue", 25, 130, 3, RGB(0,0,255));
WAIT;
sto({r/12, r}, OP_rate);
sto(inte, OP_interest);
END;

numRate()
BEGIN
local day1, day2, n, fin, r;
local dd1, dd2, mm1, mm2, yy1, yy2;
local pv, beg, inte, reff;
local comp, pmt, anno,gg;

input ({ {pv, [0], {15,15,1}},
{pmt, [0], {40,15,1}},
{n,[0],{70,15,1}},
{beg,0, {15,2,2}},
{comp,0,{50,2,2}},
{fin,0,{80,2, 2}},
{gg, [0], {70,15,3}} },
"Calc APR rate with num days",
{"PV", "PMT","N", "End","Compound","Financial", "Num days" },
{"Present value (loan)", "Monthly payment", "Yearly payments number",
"Begin or End", "Compound interest", "Financial year (360)", "Number of Days"},
{0, 0, 0, 0, 0, 0, 0}, {1000, 100, 42, 1, 0, 1, 15} );

IF (fin==0) THEN // Actual year
anno:=365;
ELSE // Financial year
anno:=360;
END; //if
reff:= Finance.CalcIPYR(n,pv,-pmt,0,12,12,1); // effective rate
r:= 100*((reff/100 + 1)^(1/12)-1)*12; // nominal rate (12 compounding period yearly)
inte:= simpComp(comp, pv, r, gg, anno);
r:=Finance.CalcIPYR(n, (-(pv+inte)),pmt, 0,12,12,beg);
RECT_P();
TEXTOUT_P("Odd period " + EVAL(gg), 25,50);
TEXTOUT_P("Interest odd period " + EVAL(inte), 25, 70);
TEXTOUT_P("Monthly rate " + EVAL(r/12), 25, 90);
TEXTOUT_P("APR yearly rate (TAEG) " + EVAL(r), 25, 110);
TEXTOUT_P("Press ESC key to continue", 25, 130, 3, RGB(0,0,255));
WAIT;
sto({r/12, r}, OP_rate);
sto(inte, OP_interest);
END;

simpComp(comp, pv, r, gg, anno)
BEGIN
local inte;
IF (comp==0) THEN // Simple interest
inte:=(pv*(r/100)*(gg))/anno;
ELSE // Compound interest
inte:= pv*((r/100+1)^(gg/anno)-1);
END;
RETURN inte;
END;

BEGIN
local ch;
CHOOSE(ch, "TVM with Odd Period", "Payment: difference days", "Payment: number days", "APR rate: diff days",
"APR rate: num days", "Quit");
CASE
IF ch==1 THEN diffDays(); END;
IF ch==2 THEN numDays(); END;
IF ch==3 THEN diffRate(); END;
IF ch==4 THEN numRate(); END;
IF ch==5 THEN RETURN; END;
DEFAULT
END; // case
END;
New version after firmware 10077.
This version doesn't run with firmwares < 10077.

Code:

// Odd Period v 2.0 by Salvo Micciché
// this version runs only with firmware > 10077

export OP_pmt:=0;
export OP_rate:={0,0};
export OP_interest:=0;

diffDays();
numDays();
simpComp();
diffRate();
numRate();

EXPORT odd_period()
// SAlvo Micciché 2015
BEGIN
END;

diffDays()
BEGIN
local day1, day2, n, fin, r;
local dd1, dd2, mm1, mm2, yy1, yy2;
local pv, beg, inte;
local comp, pmt, anno,gg;

input ({ {pv, [0], {15,15,1}},
{n, [0], {40,15,1}},{r,[0],{70,15,1}},
{beg,0, {15,2,2}}, {comp,0,{50,2,2}},
{fin,0,{80,2, 2}},
{dd1,[0],{15,15,4}},
{mm1,{"1","2","3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}, {40,15,4}},
{yy1,[0],{70,15,4}},
{dd2,[0],{15,15,5}},
{mm2,{"1","2","3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}, {40,15,5}},
{yy2,[0],{70,15,5}} },
"Calc payment with Δdays",
{"PV", "N","r%","End","Compound","Financial", "d1", "m1", "y1", "d2", "m2", "y2"},
{"Present value (loan)", "Yearly pmt number", "APR Yearly rate%", "Begin or End", "Compound interest",
"Financial year (360)", "Day 1", "Month 1", "Year 1", "Day 2", "Month 2", "Year 2"},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0},
{1000, 36, 5, 1, 0, 1, 1, 1, 2015, 1, 1, 2015});

dd1:=EVAL(dd1); mm1:=EVAL(mm1);
dd2:=EVAL(dd2); mm2:=EVAL(mm2);
yy1:=EVAL(yy1); yy2:=EVAL(yy2);
day1 := yy1+mm1/100+dd1/10000;
day2 := yy2+mm2/100+dd2/10000;

IF (fin==0) THEN // Actual year
gg:= DDAYS(day1, day2);
anno:=365;
ELSE // Financial year
gg:= 30*(mm2-mm1)+dd2-dd1;
anno:=360;
END; //if

inte:= simpComp(comp, pv, r, gg, anno);
pmt:=Finance.TvmPMT(n, r, (-(pv+inte)),0,12,12,beg);
RECT_P();
TEXTOUT_P("Odd period " + EVAL(gg) + "days", 25,50);
TEXTOUT_P("Interest odd period " + EVAL(inte), 25, 70);
TEXTOUT_P("Monthly payment " + EVAL(pmt), 25, 90);
TEXTOUT_P("Press ESC key to continue", 25, 110, 3, RGB(0,0,255));
WAIT;
sto(pmt, OP_pmt);
sto(inte, OP_interest);
// RETURN pmt;
END;

numDays()
BEGIN
local day1, day2, n, fin, r;
local dd1, dd2, mm1, mm2, yy1, yy2;
local pv, beg, inte;
local comp, pmt, anno,gg;

input ({ {pv, [0], {15,15,1}},
{n, [0], {40,15,1}},{r,[0],{70,15,1}},
{beg,0, {15,2,2}},
{comp,0, {50,2,2}},
{fin,0,{80,2, 2}},
{gg, [0], {70,15,3}} },
"Calc payment with num days",
{"PV", "N","r%","End","Compound","Financial","num Days"},
{"Present value (loan)", "Yearly pmt number", "APR Yearly rate%",
"Begin or End", "Compound interest", "Financial year (360)", "Number of Days" },
{0, 0, 0, 0, 0, 0, 0},
{1000, 36, 5, 1, 0, 1, 20} );

IF (fin==0) THEN // Actual year
anno:=365;
ELSE // Financial year
anno:=360;
END; //if

inte:= simpComp(comp, pv, r, gg, anno);
pmt:=Finance.TvmPMT(n, r, (-(pv+inte)),0,12,12,beg);
RECT_P();
TEXTOUT_P("Odd period " + EVAL(gg), 25,50);
TEXTOUT_P("Interest odd period " + EVAL(inte), 25, 70);
TEXTOUT_P("Monthly payment " + EVAL(pmt), 25, 90);
TEXTOUT_P("Press ESC key to continue", 25, 110, 3, RGB(0,0,255));
WAIT;
sto(pmt, OP_pmt);
sto(inte, OP_interest);
END;

diffRate()
BEGIN
local day1, day2, n, fin, r;
local dd1, dd2, mm1, mm2, yy1, yy2;
local pv, beg, inte, reff;
local comp, pmt, anno,gg;

input ({ {pv, [0], {15,15,1}},
{pmt, [0], {40,15,1}},{n,[0],{70,15,1}},
{beg,0, {15,2,2}}, {comp,0,{50,2,2}}, {fin,0,{80,2, 2}},
{dd1,[0],{15,15,4}},
{mm1,{"1","2","3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}, {40,15,4}},
{yy1,[0],{70,15,4}},
{dd2,[0],{15,15,5}},
{mm2,{"1","2","3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}, {40,15,5}},
{yy2,[0],{70,15,5}}  },
"Calc APR rate with Δdays",
{"PV", "PMT","N", "End","Compound","Financial", "d1", "m1", "y1", "d2", "m2", "y2" },
{"Present value (loan)", "Monthly payment", "Yearly payments number",
"Begin or End", "Compound interest", "Financial year (360)",
"Day 1", "Month 1", "Year 1", "Day 2", "Month 2", "Year 2" },
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0},
{1000, 100, 42, 1, 0, 1, 1, 1, 2015, 1, 1, 2015} );
dd1:=EVAL(dd1); mm1:=EVAL(mm1);
dd2:=EVAL(dd2); mm2:=EVAL(mm2);
yy1:=EVAL(yy1); yy2:=EVAL(yy2);
day1 := yy1+mm1/100+dd1/10000;
day2 := yy2+mm2/100+dd2/10000;
IF (fin==0) THEN // Actual year
gg:= DDAYS(day1, day2);
anno:=365;
ELSE // Financial year
gg:= 30*(mm2-mm1)+dd2-dd1;
anno:=360;
END; //if
reff:=Finance.TvmIPYR(n,pv,-pmt,0,12,12,1); // effective rate
r:= 100*((reff/100 + 1)^(1/12)-1)*12; // nominal rate (12 compounding period yearly)
inte:= simpComp(comp, pv, r, gg, anno);
r:=Finance.TvmIPYR(n, (-(pv+inte)),pmt, 0,12,12,beg);
RECT_P();
TEXTOUT_P("Odd period " + EVAL(gg), 25,50);
TEXTOUT_P("Interest odd period " + EVAL(inte), 25, 70);
TEXTOUT_P("Monthly rate " + EVAL(r/12), 25, 90);
TEXTOUT_P("APR yearly rate (TAEG) " + EVAL(r), 25, 110);
TEXTOUT_P("Press ESC key to continue", 25, 130, 3, RGB(0,0,255));
WAIT;
sto({r/12, r}, OP_rate);
sto(inte, OP_interest);
END;

numRate()
BEGIN
local day1, day2, n, fin, r;
local dd1, dd2, mm1, mm2, yy1, yy2;
local pv, beg, inte, reff;
local comp, pmt, anno,gg;

input ({ {pv, [0], {15,15,1}},
{pmt, [0], {40,15,1}},
{n,[0],{70,15,1}},
{beg,0, {15,2,2}},
{comp,0,{50,2,2}},
{fin,0,{80,2, 2}},
{gg, [0], {70,15,3}} },
"Calc APR rate with num days",
{"PV", "PMT","N", "End","Compound","Financial", "Num days" },
{"Present value (loan)", "Monthly payment", "Yearly payments number",
"Begin or End", "Compound interest", "Financial year (360)", "Number of Days"},
{0, 0, 0, 0, 0, 0, 0}, {1000, 100, 42, 1, 0, 1, 15} );

IF (fin==0) THEN // Actual year
anno:=365;
ELSE // Financial year
anno:=360;
END; //if
reff:= Finance.TvmIPYR(n,pv,-pmt,0,12,12,1); // effective rate
r:= 100*((reff/100 + 1)^(1/12)-1)*12; // nominal rate (12 compounding period yearly)
inte:= simpComp(comp, pv, r, gg, anno);
r:=Finance.TvmIPYR(n, (-(pv+inte)),pmt, 0,12,12,beg);
RECT_P();
TEXTOUT_P("Odd period " + EVAL(gg), 25,50);
TEXTOUT_P("Interest odd period " + EVAL(inte), 25, 70);
TEXTOUT_P("Monthly rate " + EVAL(r/12), 25, 90);
TEXTOUT_P("APR yearly rate (TAEG) " + EVAL(r), 25, 110);
TEXTOUT_P("Press ESC key to continue", 25, 130, 3, RGB(0,0,255));
WAIT;
sto({r/12, r}, OP_rate);
sto(inte, OP_interest);
END;

simpComp(comp, pv, r, gg, anno)
BEGIN
local inte;
IF (comp==0) THEN // Simple interest
inte:=(pv*(r/100)*(gg))/anno;
ELSE // Compound interest
inte:= pv*((r/100+1)^(gg/anno)-1);
END;
RETURN inte;
END;

BEGIN
local ch;
CHOOSE(ch, "TVM with Odd Period", "Payment: difference days", "Payment: number days", "APR rate: diff days",
"APR rate: num days", "Quit");
CASE
IF ch==1 THEN diffDays(); END;
IF ch==2 THEN numDays(); END;
IF ch==3 THEN diffRate(); END;
IF ch==4 THEN numRate(); END;
IF ch==5 THEN RETURN; END;
DEFAULT
END; // case
END;
Reference URL's
• HP Forums: https://www.hpmuseum.org/forum/index.php
• :