From b29d88dc905085e95b0988abe856e1e64ba6cd50 Mon Sep 17 00:00:00 2001 From: Neil Williams Date: Mon, 13 Feb 2006 00:12:45 +0000 Subject: [PATCH] Fix Bug 107876 - financial calculator would call exit(1) if calculation resulted in an interest rate of zero. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@13248 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/calculation/fin.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) 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 */