I found that if we are in the last coupon period gnumeric returns a
different price than excel. According to my HP calculator, excel is
right, and gnumeric is wrong.
Here is one example (dates are in dd-mm-yyyy format):
Settlement: 07-10-2005
Maturity: 15-04-2006
Rate: 4.875%
Yield: 2.4394559%
Frequency: 1
Formula: 1
For these values, price returns 101.226114 in Excel and HP calculator,
when gnumeric gives 101.230116.
I am not really a C programmer, but I would suggest the following
changes in the price routine (in plugins/fn-financial/functions.c):
static gnm_float
price (GDate *settlement, GDate *maturity, gnm_float rate, gnm_float
yield,
gnm_float redemption, GnmCouponConvention const *conv)
{
gnm_float a, d, e, sum, den, basem1, exponent, first_term,
last_term;
gint k, n;
a = coupdaybs (settlement, maturity, conv);
d = coupdaysnc (settlement, maturity, conv);
e = coupdays (settlement, maturity, conv);
n = coupnum (settlement, maturity, conv);
sum = 0.0;
den = 100.0 * rate / conv->freq;
basem1 = yield / conv->freq;
exponent = d / e;
/* START OF PATCH */
if (n == 1)
return ((redemption + den)/(1.0+exponent*basem1)-a/e*den);
/* END OF PATCH */
/* FIXME: Eliminate loop. */
for (k = 0; k < n; k++)
sum += den / pow1p (basem1, exponent + k);
first_term = redemption / pow1p (basem1, (n - 1.0 + d / e));
last_term = a / e * den;
return (first_term + sum - last_term);
}
I hope this helps, and forgive me if I am wrong.
- Philippe.