int gsl_sf_eta_e(const double s, gsl_sf_result * result) { /* CHECK_POINTER(result) */ if(s > 100.0) { result->val = 1.0; result->err = GSL_DBL_EPSILON; return GSL_SUCCESS; } else if(fabs(s-1.0) < 10.0*GSL_ROOT5_DBL_EPSILON) { double del = s-1.0; double c0 = M_LN2; double c1 = M_LN2 * (M_EULER - 0.5*M_LN2); double c2 = -0.0326862962794492996; double c3 = 0.0015689917054155150; double c4 = 0.00074987242112047532; result->val = c0 + del * (c1 + del * (c2 + del * (c3 + del * c4))); result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } else { gsl_sf_result z; gsl_sf_result p; int stat_z = gsl_sf_zeta_e(s, &z); int stat_p = gsl_sf_exp_e((1.0-s)*M_LN2, &p); int stat_m = gsl_sf_multiply_e(1.0-p.val, z.val, result); result->err = fabs(p.err * (M_LN2*(1.0-s)) * z.val) + z.err * fabs(p.val); result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val); return GSL_ERROR_SELECT_3(stat_m, stat_p, stat_z); } }
int gsl_sf_multiply_err_e(const double x, const double dx, const double y, const double dy, gsl_sf_result * result) { int status = gsl_sf_multiply_e(x, y, result); result->err += fabs(dx*y) + fabs(dy*x); return status; }
static VALUE rb_gsl_sf_multiply_e(VALUE obj, VALUE x, VALUE y) { gsl_sf_result *r; VALUE v; int status; Need_Float(x); Need_Float(y); v = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, r); status = gsl_sf_multiply_e(NUM2DBL(x), NUM2DBL(y), r); return v; }
int gsl_sf_eta_int_e(int n, gsl_sf_result * result) { if(n > ETA_POS_TABLE_NMAX) { result->val = 1.0; result->err = GSL_DBL_EPSILON; return GSL_SUCCESS; } else if(n >= 0) { result->val = eta_pos_int_table[n]; result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } else { /* n < 0 */ if(!GSL_IS_ODD(n)) { /* exactly zero at even negative integers */ result->val = 0.0; result->err = 0.0; return GSL_SUCCESS; } else if(n > -ETA_NEG_TABLE_NMAX) { result->val = eta_neg_int_table[-(n+1)/2]; result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } else { gsl_sf_result z; gsl_sf_result p; int stat_z = gsl_sf_zeta_int_e(n, &z); int stat_p = gsl_sf_exp_e((1.0-n)*M_LN2, &p); int stat_m = gsl_sf_multiply_e(-p.val, z.val, result); result->err = fabs(p.err * (M_LN2*(1.0-n)) * z.val) + z.err * fabs(p.val); result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val); return GSL_ERROR_SELECT_3(stat_m, stat_p, stat_z); } } }
double gsl_sf_multiply(const double x, const double y) { EVAL_RESULT(gsl_sf_multiply_e(x, y, &result)); }
static VALUE Elementary_multiply_e(VALUE self, VALUE x, VALUE y) { int ret; gsl_sf_result r; ret = gsl_sf_multiply_e(NUM2DBL(x), NUM2DBL(y), &r); return RESULT(&r); }