/* [Carlson, Numer. Math. 33 (1979) 1, (4.2)] */ int gsl_sf_ellint_E_e(double phi, double k, gsl_mode_t mode, gsl_sf_result * result) { const double sin_phi = sin(phi); const double sin2_phi = sin_phi * sin_phi; const double x = 1.0 - sin2_phi; const double y = 1.0 - k*k*sin2_phi; if(x < GSL_DBL_EPSILON) { return gsl_sf_ellint_Ecomp_e(k, mode, result); } else { gsl_sf_result rf; gsl_sf_result rd; const double sin3_phi = sin2_phi * sin_phi; const int rfstatus = gsl_sf_ellint_RF_e(x, y, 1.0, mode, &rf); const int rdstatus = gsl_sf_ellint_RD_e(x, y, 1.0, mode, &rd); result->val = sin_phi * rf.val - k*k/3.0 * sin3_phi * rd.val; result->err = GSL_DBL_EPSILON * fabs(sin_phi * rf.val); result->err += fabs(sin_phi*rf.err); result->err += k*k/3.0 * GSL_DBL_EPSILON * fabs(sin3_phi * rd.val); result->err += k*k/3.0 * fabs(sin3_phi*rd.err); return GSL_ERROR_SELECT_2(rfstatus, rdstatus); } }
double gsl_sf_ellint_RF(double x, double y, double z, gsl_mode_t mode) { EVAL_RESULT(gsl_sf_ellint_RF_e(x, y, z, mode, &result)); }
/** * C++ version of gsl_sf_ellint_RF_e(). * Carlson's symmetric basis of functions * * RF(x,y,z) = 1/2 Integral[(t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-1/2), {t,0,Inf}] * @param x A real number * @param y A real number * @param z A real number * @param mode The mode * @param result The result as a @c gsl::sf::result object * @return GSL_SUCCESS or GSL_EDOM */ inline int RF_e( double x, double y, double z, mode_t mode, result& result ){ return gsl_sf_ellint_RF_e( x, y, z, mode, &result ); }