static int fd_series(const double j, const double x, double * result) { const int nmax = 1000; int n; double sum = 0.0; double prev; double pow_factor = 1.0; double eta_factor; gsl_sf_eta_e(j + 1.0, &eta_factor); prev = pow_factor * eta_factor; sum += prev; for(n=1; n<nmax; n++) { double term; gsl_sf_eta_e(j+1.0-n, &eta_factor); pow_factor *= x/n; term = pow_factor * eta_factor; sum += term; if(fabs(term/sum) < GSL_DBL_EPSILON && fabs(prev/sum) < GSL_DBL_EPSILON) break; prev = term; } *result = sum; return GSL_SUCCESS; }
void eta(double *s, int *len, double *val, double *err, int *status) { int i; gsl_sf_result result; gsl_set_error_handler_off(); for(i = 0; i< *len ; i++){ status[i] = gsl_sf_eta_e(s[i], &result) ; val[i] = result.val; err[i] = result.err; } }
/// Dirichlet eta function. double dirichlet_eta(double x) { gsl_sf_result result; int stat = gsl_sf_eta_e(x, &result); if (stat != GSL_SUCCESS) { std::ostringstream msg("Error in dirichlet_eta:"); msg << " x=" << x; throw std::runtime_error(msg.str()); } else return result.val; }
double gsl_sf_eta(const double s) { EVAL_RESULT(gsl_sf_eta_e(s, &result)); }