示例#1
0
int gsl_sf_expint_Ei_e(const double x, gsl_sf_result * result)
{
  /* CHECK_POINTER(result) */

  {
    int status = gsl_sf_expint_E1_e(-x, result);
    result->val = -result->val;
    return status;
  }
}
示例#2
0
/// Exponential integral E_1.
double
expint_E1(double x)
{
  gsl_sf_result result;
  int stat = gsl_sf_expint_E1_e(x, &result);
  if (stat != GSL_SUCCESS)
    {
      std::ostringstream msg("Error in expint_E1:");
      msg << " x=" << x;
      throw std::runtime_error(msg.str());
    }
  else
    return result.val;
}
示例#3
0
int gsl_sf_expint_E2_e(const double x, gsl_sf_result * result)
{
  const double xmaxt = -GSL_LOG_DBL_MIN;
  const double xmax  = xmaxt - log(xmaxt);

  /* CHECK_POINTER(result) */

  if(x < -xmax) {
    OVERFLOW_ERROR(result);
  }
  else if(x < 100.0) {
    const double ex = exp(-x);
    gsl_sf_result result_E1;
    int stat_E1 = gsl_sf_expint_E1_e(x, &result_E1);
    result->val  = ex - x*result_E1.val;
    result->err  = fabs(x) * (GSL_DBL_EPSILON*ex + result_E1.err);
    result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
    return stat_E1;
  }
  else if(x < xmax) {
    const double c1  = -2.0;
    const double c2  =  6.0;
    const double c3  = -24.0;
    const double c4  =  120.0;
    const double c5  = -720.0;
    const double c6  =  5040.0;
    const double c7  = -40320.0;
    const double c8  =  362880.0;
    const double c9  = -3628800.0;
    const double c10 =  39916800.0;
    const double c11 = -479001600.0;
    const double c12 =  6227020800.0;
    const double c13 = -87178291200.0;
    const double y = 1.0/x;
    const double sum6 = c6+y*(c7+y*(c8+y*(c9+y*(c10+y*(c11+y*(c12+y*c13))))));
    const double sum  = y*(c1+y*(c2+y*(c3+y*(c4+y*(c5+y*sum6)))));
    result->val = exp(-x) * (1.0 + sum)/x;
    result->err = 2.0 * (x + 1.0) * GSL_DBL_EPSILON * result->val;
    return GSL_SUCCESS;
  }
  else {
    UNDERFLOW_ERROR(result);
  }
}
示例#4
0
int gsl_sf_Chi_e(const double x, gsl_sf_result * result)
{
  gsl_sf_result result_Ei;
  gsl_sf_result result_E1;
  int status_Ei = gsl_sf_expint_Ei_e(x, &result_Ei);
  int status_E1 = gsl_sf_expint_E1_e(x, &result_E1);
  if(status_Ei == GSL_EDOM || status_E1 == GSL_EDOM) {
    DOMAIN_ERROR(result);
  }
  else if(status_Ei == GSL_EUNDRFLW && status_E1 == GSL_EUNDRFLW) {
    UNDERFLOW_ERROR(result);
  }
  else if(status_Ei == GSL_EOVRFLW || status_E1 == GSL_EOVRFLW) {
    OVERFLOW_ERROR(result);
  }
  else {
    result->val  = 0.5 * (result_Ei.val - result_E1.val);
    result->err  = 0.5 * (result_Ei.err + result_E1.err);
    result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
    return GSL_SUCCESS;
  }
}
示例#5
0
int gsl_sf_Shi_e(const double x, gsl_sf_result * result)
{
  const double xsml = GSL_SQRT_DBL_EPSILON;  /* sqrt (r1mach(3)) */
  const double ax   = fabs(x);

  if(ax < xsml) {
    result->val = x;
    result->err = 0.0;
    return GSL_SUCCESS;
  }
  else if(ax <= 0.375) {
    gsl_sf_result result_c;
    cheb_eval_e(&shi_cs, 128.0*x*x/9.0-1.0, &result_c);
    result->val  = x * (1.0 + result_c.val);
    result->err  = x * result_c.err;
    result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
    return GSL_SUCCESS;
  }
  else {
    gsl_sf_result result_Ei;
    gsl_sf_result result_E1;
    int status_Ei = gsl_sf_expint_Ei_e(x, &result_Ei);
    int status_E1 = gsl_sf_expint_E1_e(x, &result_E1);
    result->val  = 0.5*(result_Ei.val + result_E1.val);
    result->err  = 0.5*(result_Ei.err + result_E1.err);
    result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
    if(status_Ei == GSL_EUNDRFLW && status_E1 == GSL_EUNDRFLW) {
      GSL_ERROR ("underflow", GSL_EUNDRFLW);
    }
    else if(status_Ei == GSL_EOVRFLW || status_E1 == GSL_EOVRFLW) {
      GSL_ERROR ("overflow", GSL_EOVRFLW);
    }
    else {
      return GSL_SUCCESS;
    }
  }
}
示例#6
0
double gsl_sf_expint_E1(const double x)
{
  EVAL_RESULT(gsl_sf_expint_E1_e(x, &result));
}