1497
1496
"@DESCRIPTION="
1498
1497
"RATE calculates the rate of an investment.\n"
1500
"* If @pmt is ommitted it defaults to 0\n"
1499
"* If @pmt is omitted it defaults to 0\n"
1501
1500
"* If @nper <= 0, RATE returns #NUM! error.\n"
1502
1501
"* If @type != 0 and @type != 1, RATE returns #VALUE! error.\n"
1937
1936
typedef struct {
1938
const gnm_float *values;
1939
const gnm_float *dates;
1941
1940
} gnumeric_xirr_t;
1943
1942
static GoalSeekStatus
1944
1943
xirr_npv (gnm_float rate, gnm_float *y, void *user_data)
1946
gnumeric_xirr_t *p = user_data;
1947
gnm_float *values, *dates, sum;
1955
for (i = 0; i < n; i++) {
1956
gnm_float d = dates[i] - dates[0];
1945
const gnumeric_xirr_t *p = user_data;
1949
for (i = 0; i < p->n; i++) {
1950
gnm_float d = p->dates[i] - p->dates[0];
1959
1953
return GOAL_SEEK_ERROR;
1960
sum += values[i] / pow1p (rate, d / 365.0);
1954
sum += p->values[i] / pow1p (rate, d / 365.0);
1964
1958
return GOAL_SEEK_OK;
1968
gnumeric_xirr (GnmFuncEvalInfo *ei, GnmValue const * const *argv)
1962
gnm_range_xirr (gnm_float const *xs, const gnm_float *ys,
1963
int n, gnm_float *res, gpointer user)
1971
GoalSeekStatus status;
1972
GnmValue *result = NULL;
1973
1965
gnumeric_xirr_t p;
1966
gnm_float rate0 = *(gnm_float *)user;
1968
GoalSeekStatus status;
1977
1974
goal_seek_initialize (&data);
1978
1975
data.xmin = -1;
1979
1976
data.xmax = MIN (1000, data.xmax);
1981
rate0 = argv[2] ? value_get_as_float (argv[2]) : 0.1;
1983
p.values = collect_floats_value (argv[0], ei->pos,
1984
COLLECT_COERCE_STRINGS,
1991
p.dates = collect_floats_value (argv[1], ei->pos,
1992
COLLECT_COERCE_STRINGS,
1998
1978
status = goal_seek_newton (&xirr_npv, NULL, &data, &p, rate0);
1999
1979
if (status != GOAL_SEEK_OK) {
1982
/* This is likely to be on the left side of the root. */
1983
(void)goal_seek_point (&xirr_npv, &data, &p, -1);
2001
1985
for (i = 1; i <= 1024; i += i) {
2002
1986
(void)goal_seek_point (&xirr_npv, &data, &p, -1 + 10.0 / (i + 9));
2003
1987
(void)goal_seek_point (&xirr_npv, &data, &p, i);
2010
if (status == GOAL_SEEK_OK)
2011
result = value_new_float (data.root);
2013
result = value_new_error_NUM (ei->pos);
1994
if (status == GOAL_SEEK_OK) {
2004
gnumeric_xirr (GnmFuncEvalInfo *ei, GnmValue const * const *argv)
2006
gnm_float rate0 = argv[2] ? value_get_as_float (argv[2]) : 0.1;
2008
return float_range_function2d (argv[0], argv[1],
2011
COLLECT_IGNORE_BLANKS |
2012
COLLECT_COERCE_STRINGS,
2022
2017
/***************************************************************************/