⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zeta.c

📁 This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY without ev
💻 C
📖 第 1 页 / 共 3 页
字号:
-7.5103780796592645925968460677e+88, 5.9598418264260880840077992227e+91,-4.9455988887500020399263196307e+94, 4.2873596927020241277675775935e+97,-3.8791952037716162900707994047e+100, 3.6600317773156342245401829308e+103,-3.5978775704117283875784869570e+106    /* eta(-99)  */};/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/int gsl_sf_hzeta_e(const double s, const double q, gsl_sf_result * result){  /* CHECK_POINTER(result) */  if(s <= 1.0 || q <= 0.0) {    DOMAIN_ERROR(result);  }  else {    const double max_bits = 54.0;    const double ln_term0 = -s * log(q);      if(ln_term0 < GSL_LOG_DBL_MIN + 1.0) {      UNDERFLOW_ERROR(result);    }    else if(ln_term0 > GSL_LOG_DBL_MAX - 1.0) {      OVERFLOW_ERROR (result);    }    else if((s > max_bits && q < 1.0) || (s > 0.5*max_bits && q < 0.25)) {      result->val = pow(q, -s);      result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);      return GSL_SUCCESS;    }    else if(s > 0.5*max_bits && q < 1.0) {      const double p1 = pow(q, -s);      const double p2 = pow(q/(1.0+q), s);      const double p3 = pow(q/(2.0+q), s);      result->val = p1 * (1.0 + p2 + p3);      result->err = GSL_DBL_EPSILON * (0.5*s + 2.0) * fabs(result->val);      return GSL_SUCCESS;    }    else {      /* Euler-Maclaurin summation formula        * [Moshier, p. 400, with several typo corrections]       */      const int jmax = 12;      const int kmax = 10;      int j, k;      const double pmax  = pow(kmax + q, -s);      double scp = s;      double pcp = pmax / (kmax + q);      double ans = pmax*((kmax+q)/(s-1.0) + 0.5);      for(k=0; k<kmax; k++) {        ans += pow(k + q, -s);      }      for(j=0; j<=jmax; j++) {        double delta = hzeta_c[j+1] * scp * pcp;        ans += delta;        if(fabs(delta/ans) < 0.5*GSL_DBL_EPSILON) break;        scp *= (s+2*j+1)*(s+2*j+2);        pcp /= (kmax + q)*(kmax + q);      }      result->val = ans;      result->err = 2.0 * (jmax + 1.0) * GSL_DBL_EPSILON * fabs(ans);      return GSL_SUCCESS;    }  }}int gsl_sf_zeta_e(const double s, gsl_sf_result * result){  /* CHECK_POINTER(result) */  if(s == 1.0) {    DOMAIN_ERROR(result);  }  else if(s >= 0.0) {    return riemann_zeta_sgt0(s, result);  }  else {    /* reflection formula, [Abramowitz+Stegun, 23.2.5] */    gsl_sf_result zeta_one_minus_s;    const int stat_zoms = riemann_zeta1ms_slt0(s, &zeta_one_minus_s);    const double sin_term = sin(0.5*M_PI*s)/M_PI;    if(sin_term == 0.0) {      result->val = 0.0;      result->err = 0.0;      return GSL_SUCCESS;    }    else if(s > -170) {      /* We have to be careful about losing digits       * in calculating pow(2 Pi, s). The gamma       * function is fine because we were careful       * with that implementation.       * We keep an array of (2 Pi)^(10 n).       */      const double twopi_pow[18] = { 1.0,                                     9.589560061550901348e+007,                                     9.195966217409212684e+015,                                     8.818527036583869903e+023,                                     8.456579467173150313e+031,                                     8.109487671573504384e+039,                                     7.776641909496069036e+047,                                     7.457457466828644277e+055,                                     7.151373628461452286e+063,                                     6.857852693272229709e+071,                                     6.576379029540265771e+079,                                     6.306458169130020789e+087,                                     6.047615938853066678e+095,                                     5.799397627482402614e+103,                                     5.561367186955830005e+111,                                     5.333106466365131227e+119,                                     5.114214477385391780e+127,                                     4.904306689854036836e+135                                    };      const int n = floor((-s)/10.0);      const double fs = s + 10.0*n;      const double p = pow(2.0*M_PI, fs) / twopi_pow[n];      gsl_sf_result g;      const int stat_g = gsl_sf_gamma_e(1.0-s, &g);      result->val  = p * g.val * sin_term * zeta_one_minus_s.val;      result->err  = fabs(p * g.val * sin_term) * zeta_one_minus_s.err;      result->err += fabs(p * sin_term * zeta_one_minus_s.val) * g.err;      result->err += GSL_DBL_EPSILON * (fabs(s)+2.0) * fabs(result->val);      return GSL_ERROR_SELECT_2(stat_g, stat_zoms);    }    else {      /* The actual zeta function may or may not       * overflow here. But we have no easy way       * to calculate it when the prefactor(s)       * overflow. Trying to use log's and exp       * is no good because we loose a couple       * digits to the exp error amplification.       * When we gather a little more patience,       * we can implement something here. Until       * then just give up.       */      OVERFLOW_ERROR(result);    }  }}int gsl_sf_zeta_int_e(const int n, gsl_sf_result * result){  /* CHECK_POINTER(result) */  if(n < 0) {    if(!GSL_IS_ODD(n)) {      result->val = 0.0; /* exactly zero at even negative integers */      result->err = 0.0;      return GSL_SUCCESS;    }    else if(n > -ZETA_NEG_TABLE_NMAX) {      result->val = zeta_neg_int_table[-(n+1)/2];      result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);      return GSL_SUCCESS;    }    else {      return gsl_sf_zeta_e((double)n, result);    }  }  else if(n == 1){    DOMAIN_ERROR(result);  }  else if(n <= ZETA_POS_TABLE_NMAX){    result->val = 1.0 + zetam1_pos_int_table[n];    result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);    return GSL_SUCCESS;  }  else {    result->val = 1.0;    result->err = GSL_DBL_EPSILON;    return GSL_SUCCESS;  }}int gsl_sf_zetam1_e(const double s, gsl_sf_result * result){  if(s <= 5.0)  {    int stat = gsl_sf_zeta_e(s, result);    result->val = result->val - 1.0;    return stat;  }  else if(s < 15.0)  {    return riemann_zeta_minus_1_intermediate_s(s, result);  }  else  {    return riemann_zeta_minus1_large_s(s, result);  }}int gsl_sf_zetam1_int_e(const int n, gsl_sf_result * result){  if(n < 0) {    if(!GSL_IS_ODD(n)) {      result->val = 0.0; /* exactly zero at even negative integers */      result->err = 0.0;      return GSL_SUCCESS;    }    else if(n > -ZETA_NEG_TABLE_NMAX) {      result->val = zeta_neg_int_table[-(n+1)/2] - 1.0;      result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);      return GSL_SUCCESS;    }    else {      return gsl_sf_zeta_e((double)n, result);    }  }  else if(n == 1){    DOMAIN_ERROR(result);  }  else if(n <= ZETA_POS_TABLE_NMAX){    result->val = zetam1_pos_int_table[n];    result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);    return GSL_SUCCESS;  }  else {    return gsl_sf_zetam1_e(n, result);  }}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);    }  }}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);  }}/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/#include "eval.h"double gsl_sf_zeta(const double s){  EVAL_RESULT(gsl_sf_zeta_e(s, &result));}double gsl_sf_hzeta(const double s, const double a){  EVAL_RESULT(gsl_sf_hzeta_e(s, a, &result));}double gsl_sf_zeta_int(const int s){  EVAL_RESULT(gsl_sf_zeta_int_e(s, &result));}double gsl_sf_zetam1(const double s){  EVAL_RESULT(gsl_sf_zetam1_e(s, &result));}double gsl_sf_zetam1_int(const int s){  EVAL_RESULT(gsl_sf_zetam1_int_e(s, &result));}double gsl_sf_eta_int(const int s){  EVAL_RESULT(gsl_sf_eta_int_e(s, &result));}double gsl_sf_eta(const double s){  EVAL_RESULT(gsl_sf_eta_e(s, &result));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -