diff --git a/src/calculation/fin.c b/src/calculation/fin.c index b0fb6ba9fc..16f2d7e564 100644 --- a/src/calculation/fin.c +++ b/src/calculation/fin.c @@ -1247,7 +1247,9 @@ _B (double eint, unsigned beg) if (eint == 0.0) { fprintf (stderr, "Zero Interest.\n"); - exit (1); + fflush(stderr); + return 0.0; +/* exit (1);*/ } /* endif */ return (1.0 + eint * (double) beg) / eint; @@ -1257,7 +1259,9 @@ _B (double eint, unsigned beg) static double _C (double eint, double pmt, unsigned beg) { - return pmt * _B (eint, beg); + unsigned check = _B (eint, beg); + if(check) return pmt * check; + return 0.0; } /* _C */ /* compute Number of Periods from preset data */ @@ -1289,8 +1293,7 @@ _fi_calc_num_payments (double nint, /* nominal interest rate */ { double eint = eff_int (nint / 100.0, CF, PF, disc); double CC = _C (eint, pmt, bep); - - CC = (CC - fv) / (CC + pv); + if(CC) CC = (CC - fv) / (CC + pv); return (CC > 0.0) ? log (CC) / log (1.0 + eint) : 0.0; } /* _fi_calc_num_payments */ @@ -1431,6 +1434,7 @@ _fi_calc_payment (unsigned per, /* number of periods */ double eint = eff_int (nint / 100.0, CF, PF, disc); double AA = _A (eint, per); double BB = _B (eint, bep); + if(BB == 0.0) return 0.0; return -(fv + pv * (AA + 1.0)) / (AA * BB); } /* _fi_calc_payment */ @@ -1530,7 +1534,7 @@ fip (unsigned per, double eint, double pv, double pmt, double fv, unsigned bep) double AA = _A (eint, per); double CC = _C (eint, pmt, bep); double D = (AA + 1.0) / (1.0 + eint); - + if(CC == 0) return 0.0; return (double) per *(pv + CC) * D - (AA * CC) / eint; } /* fip */