1 /* specfunc/fermi_dirac.c
3 * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or (at
8 * your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 /* Author: G. Jungman */
23 #include <gsl/gsl_math.h>
24 #include <gsl/gsl_errno.h>
25 #include <gsl/gsl_sf_exp.h>
26 #include <gsl/gsl_sf_gamma.h>
27 #include <gsl/gsl_sf_hyperg.h>
28 #include <gsl/gsl_sf_pow_int.h>
29 #include <gsl/gsl_sf_zeta.h>
30 #include <gsl/gsl_sf_fermi_dirac.h>
34 #include "chebyshev.h"
35 #include "cheb_eval.c"
37 #define locEPS (1000.0*GSL_DBL_EPSILON)
40 /* Chebyshev fit for F_{1}(t); -1 < t < 1, -1 < x < 1
42 static double fd_1_a_data[22] = {
43 1.8949340668482264365,
44 0.7237719066890052793,
45 0.1250000000000000000,
46 0.0101065196435973942,
48 -0.0000600615242174119,
66 static cheb_series fd_1_a_cs = {
74 /* Chebyshev fit for F_{1}(3/2(t+1) + 1); -1 < t < 1, 1 < x < 4
76 static double fd_1_b_data[22] = {
77 10.409136795234611872,
81 -0.001584468020659694,
100 static cheb_series fd_1_b_cs = {
108 /* Chebyshev fit for F_{1}(3(t+1) + 4); -1 < t < 1, 4 < x < 10
110 static double fd_1_c_data[23] = {
111 56.78099449124299762,
112 21.00718468237668011,
115 -0.00058716468739423,
117 -0.00003817425583020,
135 static cheb_series fd_1_c_cs = {
143 /* Chebyshev fit for F_{1}(x) / x^2
146 * t = 1/10 (x-10) - 1 = x/10 - 2
149 static double fd_1_d_data[30] = {
150 1.0126626021151374442,
151 -0.0063312525536433793,
152 0.0024837319237084326,
153 -0.0008764333697726109,
154 0.0002913344438921266,
155 -0.0000931877907705692,
156 0.0000290151342040275,
181 static cheb_series fd_1_d_cs = {
189 /* Chebyshev fit for F_{1}(x) / x^2
195 static double fd_1_e_data[10] = {
196 1.0013707783890401683,
197 0.0009138522593601060,
198 0.0002284630648400133,
207 static cheb_series fd_1_e_cs = {
215 /* Chebyshev fit for F_{2}(t); -1 < t < 1, -1 < x < 1
217 static double fd_2_a_data[21] = {
218 2.1573661917148458336,
219 0.8849670334241132182,
220 0.1784163467613519713,
221 0.0208333333333333333,
222 0.0012708226459768508,
240 static cheb_series fd_2_a_cs = {
248 /* Chebyshev fit for F_{2}(3/2(t+1) + 1); -1 < t < 1, 1 < x < 4
250 static double fd_2_b_data[22] = {
251 16.508258811798623599,
252 7.421719394793067988,
253 1.458309885545603821,
254 0.128773850882795229,
255 0.001963612026198147,
256 -0.000237458988738779,
257 0.000018539661382641,
274 static cheb_series fd_2_b_cs = {
282 /* Chebyshev fit for F_{1}(3(t+1) + 4); -1 < t < 1, 4 < x < 10
284 static double fd_2_c_data[20] = {
285 168.87129776686440711,
286 81.80260488091659458,
287 15.75408505947931513,
290 -0.00016469712946921,
306 static cheb_series fd_2_c_cs = {
314 /* Chebyshev fit for F_{1}(x) / x^3
317 * t = 1/10 (x-10) - 1 = x/10 - 2
320 static double fd_2_d_data[30] = {
321 0.3459960518965277589,
322 -0.00633136397691958024,
323 0.00248382959047594408,
324 -0.00087651191884005114,
325 0.00029139255351719932,
326 -0.00009322746111846199,
327 0.00002904021914564786,
328 -8.86962264810663e-6,
352 static cheb_series fd_2_d_cs = {
360 /* Chebyshev fit for F_{2}(x) / x^3
366 static double fd_2_e_data[4] = {
367 0.3347041117223735227,
368 0.00091385225936012645,
369 0.00022846306484003205,
372 static cheb_series fd_2_e_cs = {
380 /* Chebyshev fit for F_{-1/2}(t); -1 < t < 1, -1 < x < 1
382 static double fd_mhalf_a_data[20] = {
383 1.2663290042859741974,
384 0.3697876251911153071,
385 0.0278131011214405055,
386 -0.0033332848565672007,
387 -0.0004438108265412038,
388 0.0000616495177243839,
404 static cheb_series fd_mhalf_a_cs = {
412 /* Chebyshev fit for F_{-1/2}(3/2(t+1) + 1); -1 < t < 1, 1 < x < 4
414 static double fd_mhalf_b_data[20] = {
415 3.270796131942071484,
416 0.5809004935853417887,
417 -0.0299313438794694987,
418 -0.0013287935412612198,
419 0.0009910221228704198,
420 -0.0001690954939688554,
436 static cheb_series fd_mhalf_b_cs = {
444 /* Chebyshev fit for F_{-1/2}(3(t+1) + 4); -1 < t < 1, 4 < x < 10
446 static double fd_mhalf_c_data[25] = {
447 5.828283273430595507,
448 0.677521118293264655,
449 -0.043946248736481554,
450 0.005825595781828244,
451 -0.000864858907380668,
452 0.000110017890076539,
473 static cheb_series fd_mhalf_c_cs = {
481 /* Chebyshev fit for F_{-1/2}(x) / x^(1/2)
484 * t = 1/10 (x-10) - 1 = x/10 - 2
486 static double fd_mhalf_d_data[30] = {
487 2.2530744202862438709,
488 0.0018745152720114692,
489 -0.0007550198497498903,
490 0.0002759818676644382,
491 -0.0000959406283465913,
492 0.0000324056855537065,
493 -0.0000107462396145761,
518 static cheb_series fd_mhalf_d_cs = {
526 /* Chebyshev fit for F_{1/2}(t); -1 < t < 1, -1 < x < 1
528 static double fd_half_a_data[23] = {
529 1.7177138871306189157,
530 0.6192579515822668460,
531 0.0932802275119206269,
532 0.0047094853246636182,
533 -0.0004243667967864481,
534 -0.0000452569787686193,
553 static cheb_series fd_half_a_cs = {
561 /* Chebyshev fit for F_{1/2}(3/2(t+1) + 1); -1 < t < 1, 1 < x < 4
563 static double fd_half_b_data[20] = {
564 7.651013792074984027,
565 2.475545606866155737,
566 0.218335982672476128,
567 -0.007730591500584980,
568 -0.000217443383867318,
569 0.000147663980681359,
570 -0.000021586361321527,
585 static cheb_series fd_half_b_cs = {
593 /* Chebyshev fit for F_{1/2}(3(t+1) + 4); -1 < t < 1, 4 < x < 10
595 static double fd_half_c_data[23] = {
596 29.584339348839816528,
597 8.808344283250615592,
598 0.503771641883577308,
599 -0.021540694914550443,
600 0.002143341709406890,
601 -0.000257365680646579,
602 0.000027933539372803,
620 static cheb_series fd_half_c_cs = {
628 /* Chebyshev fit for F_{1/2}(x) / x^(3/2)
631 * t = 1/10 (x-10) - 1 = x/10 - 2
633 static double fd_half_d_data[30] = {
634 1.5116909434145508537,
635 -0.0036043405371630468,
636 0.0014207743256393359,
637 -0.0005045399052400260,
638 0.0001690758006957347,
639 -0.0000546305872688307,
640 0.0000172223228484571,
665 static cheb_series fd_half_d_cs = {
674 /* Chebyshev fit for F_{3/2}(t); -1 < t < 1, -1 < x < 1
676 static double fd_3half_a_data[20] = {
677 2.0404775940601704976,
678 0.8122168298093491444,
679 0.1536371165644008069,
680 0.0156174323847845125,
681 0.0005943427879290297,
682 -0.0000429609447738365,
698 static cheb_series fd_3half_a_cs = {
706 /* Chebyshev fit for F_{3/2}(3/2(t+1) + 1); -1 < t < 1, 1 < x < 4
708 static double fd_3half_b_data[22] = {
709 13.403206654624176674,
710 5.574508357051880924,
711 0.931228574387527769,
712 0.054638356514085862,
713 -0.001477172902737439,
714 -0.000029378553381869,
715 0.000018357033493246,
732 static cheb_series fd_3half_b_cs = {
740 /* Chebyshev fit for F_{3/2}(3(t+1) + 4); -1 < t < 1, 4 < x < 10
742 static double fd_3half_c_data[21] = {
743 101.03685253378877642,
744 43.62085156043435883,
747 -0.00798124846271395,
749 -0.00006392178890410,
765 static cheb_series fd_3half_c_cs = {
773 /* Chebyshev fit for F_{3/2}(x) / x^(5/2)
776 * t = 1/10 (x-10) - 1 = x/10 - 2
778 static double fd_3half_d_data[25] = {
779 0.6160645215171852381,
780 -0.0071239478492671463,
781 0.0027906866139659846,
782 -0.0009829521424317718,
783 0.0003260229808519545,
784 -0.0001040160912910890,
785 0.0000322931223232439,
805 static cheb_series fd_3half_d_cs = {
813 /* Goano's modification of the Levin-u implementation.
814 * This is a simplification of the original WHIZ algorithm.
815 * See [Fessler et al., ACM Toms 9, 346 (1983)].
819 fd_whiz(const double term, const int iterm,
820 double * qnum, double * qden,
821 double * result, double * s)
823 if(iterm == 0) *s = 0.0;
827 qden[iterm] = 1.0/(term*(iterm+1.0)*(iterm+1.0));
828 qnum[iterm] = *s * qden[iterm];
832 double ratio = iterm/(iterm+1.0);
834 for(j=iterm-1; j>=0; j--) {
835 double c = factor * (j+1.0) / (iterm+1.0);
837 qden[j] = qden[j+1] - c * qden[j];
838 qnum[j] = qnum[j+1] - c * qnum[j];
842 *result = qnum[0] / qden[0];
847 /* Handle case of integer j <= -2.
851 fd_nint(const int j, const double x, gsl_sf_result * result)
853 /* const int nsize = 100 + 1; */
857 double qcoeff[nsize];
862 GSL_ERROR ("error", GSL_ESANITY);
864 else if(j < -(nsize)) {
867 GSL_ERROR ("error", GSL_EUNIMPL);
876 for(k=2; k<=n; k++) {
877 qcoeff[k] = -qcoeff[k-1];
878 for(i=k-1; i>=2; i--) {
879 qcoeff[i] = i*qcoeff[i] - (k-(i-1))*qcoeff[i-1];
886 for(i=2; i<=n; i++) {
893 for(i=n-1; i>=1; i--) {
898 p = gsl_sf_pow_int(1.0+a, j);
900 result->err = 3.0 * GSL_DBL_EPSILON * fabs(f*a*p);
910 fd_neg(const double j, const double x, gsl_sf_result * result)
916 /* const int itmax = 100; */
917 /* const int qsize = 100 + 1; */
918 double qnum[qsize], qden[qsize];
920 if(x < GSL_LOG_DBL_MIN) {
925 else if(x < -1.0 && x < -fabs(j+1.0)) {
926 /* Simple series implementation. Avoid the
927 * complexity and extra work of the series
928 * acceleration method below.
934 for(n=2; n<100; n++) {
935 double rat = (n-1.0)/n;
936 double p = pow(rat, j+1.0);
939 if(fabs(term/sum) < GSL_DBL_EPSILON) break;
942 result->err = 2.0 * GSL_DBL_EPSILON * fabs(sum);
953 for(jterm=0; jterm<=itmax; jterm++) {
954 double p = pow(jterm+1.0, j+1.0);
957 fd_whiz(term, jterm, qnum, qden, &f, &s);
959 if(fabs(f-f_previous) < fabs(f)*2.0*GSL_DBL_EPSILON || xn < GSL_LOG_DBL_MIN) break;
964 result->err = fabs(f-f_previous);
965 result->err += 2.0 * GSL_DBL_EPSILON * fabs(f);
968 GSL_ERROR ("error", GSL_EMAXITER);
975 /* asymptotic expansion
980 fd_asymp(const double j, const double x, gsl_sf_result * result)
982 const int j_integer = ( fabs(j - floor(j+0.5)) < 100.0*GSL_DBL_EPSILON );
983 const int itmax = 200;
985 int stat_lg = gsl_sf_lngamma_e(j + 2.0, &lg);
986 double seqn_val = 0.5;
987 double seqn_err = 0.0;
988 double xm2 = (1.0/x)/x;
990 double add = GSL_DBL_MAX;
996 gsl_sf_result ex_arg;
1001 for(n=1; n<=itmax; n++) {
1002 double add_previous = add;
1004 gsl_sf_eta_int_e(2*n, &eta);
1005 xgam = xgam * xm2 * (j + 1.0 - (2*n-2)) * (j + 1.0 - (2*n-1));
1006 add = eta.val * xgam;
1007 if(!j_integer && fabs(add) > fabs(add_previous)) break;
1008 if(fabs(add/seqn_val) < GSL_DBL_EPSILON) break;
1010 seqn_err += 2.0 * GSL_DBL_EPSILON * fabs(add);
1012 seqn_err += fabs(add);
1014 stat_fneg = fd_neg(j, -x, &fneg);
1016 ex_term_1 = (j+1.0)*ln_x;
1018 ex_arg.val = ex_term_1 - ex_term_2; /*(j+1.0)*ln_x - lg.val; */
1019 ex_arg.err = GSL_DBL_EPSILON*(fabs(ex_term_1) + fabs(ex_term_2)) + lg.err;
1020 stat_e = gsl_sf_exp_err_e(ex_arg.val, ex_arg.err, &ex);
1021 cos_term = cos(j*M_PI);
1022 result->val = cos_term * fneg.val + 2.0 * seqn_val * ex.val;
1023 result->err = fabs(2.0 * ex.err * seqn_val);
1024 result->err += fabs(2.0 * ex.val * seqn_err);
1025 result->err += fabs(cos_term) * fneg.err;
1026 result->err += 4.0 * GSL_DBL_EPSILON * fabs(result->val);
1027 return GSL_ERROR_SELECT_3(stat_e, stat_fneg, stat_lg);
1031 /* Series evaluation for small x, generic j.
1037 fd_series(const double j, const double x, double * result)
1039 const int nmax = 1000;
1043 double pow_factor = 1.0;
1045 gsl_sf_eta_e(j + 1.0, &eta_factor);
1046 prev = pow_factor * eta_factor;
1048 for(n=1; n<nmax; n++) {
1050 gsl_sf_eta_e(j+1.0-n, &eta_factor);
1052 term = pow_factor * eta_factor;
1054 if(fabs(term/sum) < GSL_DBL_EPSILON && fabs(prev/sum) < GSL_DBL_EPSILON) break;
1064 /* Series evaluation for small x > 0, integer j > 0; x < Pi.
1069 fd_series_int(const int j, const double x, gsl_sf_result * result)
1074 double pow_factor = 1.0;
1075 gsl_sf_result eta_factor;
1076 gsl_sf_eta_int_e(j + 1, &eta_factor);
1077 del = pow_factor * eta_factor.val;
1080 /* Sum terms where the argument
1081 * of eta() is positive.
1083 for(n=1; n<=j+2; n++) {
1084 gsl_sf_eta_int_e(j+1-n, &eta_factor);
1086 del = pow_factor * eta_factor.val;
1088 if(fabs(del/sum) < GSL_DBL_EPSILON) break;
1091 /* Now sum the terms where eta() is negative.
1092 * The argument of eta() must be odd as well,
1093 * so it is convenient to transform the series
1096 * Sum[ eta(j+1-n) x^n / n!, {n,j+4,Infinity}]
1097 * = x^j / j! Sum[ eta(1-2m) x^(2m) j! / (2m+j)! , {m,2,Infinity}]
1099 * We do not need to do this sum if j is large enough.
1103 gsl_sf_result jfact;
1107 gsl_sf_fact_e((unsigned int)j, &jfact);
1108 pre2 = gsl_sf_pow_int(x, j) / jfact.val;
1110 gsl_sf_eta_int_e(-3, &eta_factor);
1111 pow_factor = x*x*x*x / ((j+4)*(j+3)*(j+2)*(j+1));
1112 sum2 = eta_factor.val * pow_factor;
1114 for(m=3; m<24; m++) {
1115 gsl_sf_eta_int_e(1-2*m, &eta_factor);
1116 pow_factor *= x*x / ((j+2*m)*(j+2*m-1));
1117 sum2 += eta_factor.val * pow_factor;
1124 result->err = 2.0 * GSL_DBL_EPSILON * fabs(sum);
1130 /* series of hypergeometric functions for integer j > 0, x > 0
1135 fd_UMseries_int(const int j, const double x, gsl_sf_result * result)
1137 const int nmax = 2000;
1141 double sum_even_val = 1.0;
1142 double sum_even_err = 0.0;
1143 double sum_odd_val = 0.0;
1144 double sum_odd_err = 0.0;
1147 int stat_h = GSL_SUCCESS;
1150 if(x < 500.0 && j < 80) {
1151 double p = gsl_sf_pow_int(x, j+1);
1153 gsl_sf_fact_e(j+1, &g); /* Gamma(j+2) */
1159 double lnx = log(x);
1161 gsl_sf_lngamma_e(j + 2.0, &lg);
1162 lnpre_val = (j+1.0)*lnx - lg.val;
1163 lnpre_err = 2.0 * GSL_DBL_EPSILON * fabs((j+1.0)*lnx) + lg.err;
1167 /* Add up the odd terms of the sum.
1169 for(n=1; n<nmax; n+=2) {
1174 int stat_h_U = gsl_sf_hyperg_U_int_e(1, j+2, n*x, &U);
1175 int stat_h_F = gsl_sf_hyperg_1F1_int_e(1, j+2, -n*x, &M);
1176 stat_h = GSL_ERROR_SELECT_3(stat_h, stat_h_U, stat_h_F);
1177 del_val = ((j+1.0)*U.val - M.val);
1178 del_err = (fabs(j+1.0)*U.err + M.err);
1179 sum_odd_val += del_val;
1180 sum_odd_err += del_err;
1181 if(fabs(del_val/sum_odd_val) < GSL_DBL_EPSILON) break;
1184 /* Add up the even terms of the sum.
1186 for(n=2; n<nmax; n+=2) {
1191 int stat_h_U = gsl_sf_hyperg_U_int_e(1, j+2, n*x, &U);
1192 int stat_h_F = gsl_sf_hyperg_1F1_int_e(1, j+2, -n*x, &M);
1193 stat_h = GSL_ERROR_SELECT_3(stat_h, stat_h_U, stat_h_F);
1194 del_val = ((j+1.0)*U.val - M.val);
1195 del_err = (fabs(j+1.0)*U.err + M.err);
1196 sum_even_val -= del_val;
1197 sum_even_err += del_err;
1198 if(fabs(del_val/sum_even_val) < GSL_DBL_EPSILON) break;
1201 stat_sum = ( n >= nmax ? GSL_EMAXITER : GSL_SUCCESS );
1202 stat_e = gsl_sf_exp_mult_err_e(lnpre_val, lnpre_err,
1203 pre*(sum_even_val + sum_odd_val),
1204 pre*(sum_even_err + sum_odd_err),
1206 result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
1208 return GSL_ERROR_SELECT_3(stat_e, stat_h, stat_sum);
1212 /*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
1215 int gsl_sf_fermi_dirac_m1_e(const double x, gsl_sf_result * result)
1217 if(x < GSL_LOG_DBL_MIN) {
1218 UNDERFLOW_ERROR(result);
1221 const double ex = exp(x);
1222 result->val = ex/(1.0+ex);
1223 result->err = 2.0 * (fabs(x) + 1.0) * GSL_DBL_EPSILON * fabs(result->val);
1227 double ex = exp(-x);
1228 result->val = 1.0/(1.0 + ex);
1229 result->err = 2.0 * GSL_DBL_EPSILON * (x + 1.0) * ex;
1236 int gsl_sf_fermi_dirac_0_e(const double x, gsl_sf_result * result)
1238 if(x < GSL_LOG_DBL_MIN) {
1239 UNDERFLOW_ERROR(result);
1243 double ser = 1.0 - ex*(0.5 - ex*(1.0/3.0 - ex*(1.0/4.0 - ex*(1.0/5.0 - ex/6.0))));
1244 result->val = ex * ser;
1245 result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
1249 result->val = log(1.0 + exp(x));
1250 result->err = fabs(x * GSL_DBL_EPSILON);
1254 double ex = exp(-x);
1255 result->val = x + ex * (1.0 - 0.5*ex + ex*ex/3.0 - ex*ex*ex/4.0);
1256 result->err = (x + ex) * GSL_DBL_EPSILON;
1262 int gsl_sf_fermi_dirac_1_e(const double x, gsl_sf_result * result)
1264 if(x < GSL_LOG_DBL_MIN) {
1265 UNDERFLOW_ERROR(result);
1268 /* series [Goano (6)]
1274 for(n=2; n<100 ; n++) {
1275 double rat = (n-1.0)/n;
1276 term *= -ex * rat * rat;
1278 if(fabs(term/sum) < GSL_DBL_EPSILON) break;
1281 result->err = 2.0 * fabs(sum) * GSL_DBL_EPSILON;
1285 return cheb_eval_e(&fd_1_a_cs, x, result);
1288 double t = 2.0/3.0*(x-1.0) - 1.0;
1289 return cheb_eval_e(&fd_1_b_cs, t, result);
1292 double t = 1.0/3.0*(x-4.0) - 1.0;
1293 return cheb_eval_e(&fd_1_c_cs, t, result);
1296 double t = 0.1*x - 2.0;
1298 cheb_eval_e(&fd_1_d_cs, t, &c);
1299 result->val = c.val * x*x;
1300 result->err = c.err * x*x + GSL_DBL_EPSILON * fabs(result->val);
1303 else if(x < 1.0/GSL_SQRT_DBL_EPSILON) {
1304 double t = 60.0/x - 1.0;
1306 cheb_eval_e(&fd_1_e_cs, t, &c);
1307 result->val = c.val * x*x;
1308 result->err = c.err * x*x + GSL_DBL_EPSILON * fabs(result->val);
1311 else if(x < GSL_SQRT_DBL_MAX) {
1312 result->val = 0.5 * x*x;
1313 result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
1317 OVERFLOW_ERROR(result);
1322 int gsl_sf_fermi_dirac_2_e(const double x, gsl_sf_result * result)
1324 if(x < GSL_LOG_DBL_MIN) {
1325 UNDERFLOW_ERROR(result);
1328 /* series [Goano (6)]
1334 for(n=2; n<100 ; n++) {
1335 double rat = (n-1.0)/n;
1336 term *= -ex * rat * rat * rat;
1338 if(fabs(term/sum) < GSL_DBL_EPSILON) break;
1341 result->err = 2.0 * GSL_DBL_EPSILON * fabs(sum);
1345 return cheb_eval_e(&fd_2_a_cs, x, result);
1348 double t = 2.0/3.0*(x-1.0) - 1.0;
1349 return cheb_eval_e(&fd_2_b_cs, t, result);
1352 double t = 1.0/3.0*(x-4.0) - 1.0;
1353 return cheb_eval_e(&fd_2_c_cs, t, result);
1356 double t = 0.1*x - 2.0;
1358 cheb_eval_e(&fd_2_d_cs, t, &c);
1359 result->val = c.val * x*x*x;
1360 result->err = c.err * x*x*x + 3.0 * GSL_DBL_EPSILON * fabs(result->val);
1363 else if(x < 1.0/GSL_ROOT3_DBL_EPSILON) {
1364 double t = 60.0/x - 1.0;
1366 cheb_eval_e(&fd_2_e_cs, t, &c);
1367 result->val = c.val * x*x*x;
1368 result->err = c.err * x*x*x + 3.0 * GSL_DBL_EPSILON * fabs(result->val);
1371 else if(x < GSL_ROOT3_DBL_MAX) {
1372 result->val = 1.0/6.0 * x*x*x;
1373 result->err = 3.0 * GSL_DBL_EPSILON * fabs(result->val);
1377 OVERFLOW_ERROR(result);
1382 int gsl_sf_fermi_dirac_int_e(const int j, const double x, gsl_sf_result * result)
1385 return fd_nint(j, x, result);
1388 return gsl_sf_fermi_dirac_m1_e(x, result);
1391 return gsl_sf_fermi_dirac_0_e(x, result);
1394 return gsl_sf_fermi_dirac_1_e(x, result);
1397 return gsl_sf_fermi_dirac_2_e(x, result);
1400 return fd_neg(j, x, result);
1403 return gsl_sf_eta_int_e(j+1, result);
1406 return fd_series_int(j, x, result);
1409 gsl_sf_result fasymp;
1410 int stat_asymp = fd_asymp(j, x, &fasymp);
1412 if(stat_asymp == GSL_SUCCESS) {
1413 result->val = fasymp.val;
1414 result->err = fasymp.err;
1415 result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
1419 return fd_UMseries_int(j, x, result);
1425 int gsl_sf_fermi_dirac_mhalf_e(const double x, gsl_sf_result * result)
1427 if(x < GSL_LOG_DBL_MIN) {
1428 UNDERFLOW_ERROR(result);
1431 /* series [Goano (6)]
1437 for(n=2; n<200 ; n++) {
1438 double rat = (n-1.0)/n;
1439 term *= -ex * sqrt(rat);
1441 if(fabs(term/sum) < GSL_DBL_EPSILON) break;
1444 result->err = 2.0 * fabs(sum) * GSL_DBL_EPSILON;
1448 return cheb_eval_e(&fd_mhalf_a_cs, x, result);
1451 double t = 2.0/3.0*(x-1.0) - 1.0;
1452 return cheb_eval_e(&fd_mhalf_b_cs, t, result);
1455 double t = 1.0/3.0*(x-4.0) - 1.0;
1456 return cheb_eval_e(&fd_mhalf_c_cs, t, result);
1459 double rtx = sqrt(x);
1460 double t = 0.1*x - 2.0;
1462 cheb_eval_e(&fd_mhalf_d_cs, t, &c);
1463 result->val = c.val * rtx;
1464 result->err = c.err * rtx + 0.5 * GSL_DBL_EPSILON * fabs(result->val);
1468 return fd_asymp(-0.5, x, result);
1473 int gsl_sf_fermi_dirac_half_e(const double x, gsl_sf_result * result)
1475 if(x < GSL_LOG_DBL_MIN) {
1476 UNDERFLOW_ERROR(result);
1479 /* series [Goano (6)]
1485 for(n=2; n<100 ; n++) {
1486 double rat = (n-1.0)/n;
1487 term *= -ex * rat * sqrt(rat);
1489 if(fabs(term/sum) < GSL_DBL_EPSILON) break;
1492 result->err = 2.0 * fabs(sum) * GSL_DBL_EPSILON;
1496 return cheb_eval_e(&fd_half_a_cs, x, result);
1499 double t = 2.0/3.0*(x-1.0) - 1.0;
1500 return cheb_eval_e(&fd_half_b_cs, t, result);
1503 double t = 1.0/3.0*(x-4.0) - 1.0;
1504 return cheb_eval_e(&fd_half_c_cs, t, result);
1507 double x32 = x*sqrt(x);
1508 double t = 0.1*x - 2.0;
1510 cheb_eval_e(&fd_half_d_cs, t, &c);
1511 result->val = c.val * x32;
1512 result->err = c.err * x32 + 1.5 * GSL_DBL_EPSILON * fabs(result->val);
1516 return fd_asymp(0.5, x, result);
1521 int gsl_sf_fermi_dirac_3half_e(const double x, gsl_sf_result * result)
1523 if(x < GSL_LOG_DBL_MIN) {
1524 UNDERFLOW_ERROR(result);
1527 /* series [Goano (6)]
1533 for(n=2; n<100 ; n++) {
1534 double rat = (n-1.0)/n;
1535 term *= -ex * rat * rat * sqrt(rat);
1537 if(fabs(term/sum) < GSL_DBL_EPSILON) break;
1540 result->err = 2.0 * fabs(sum) * GSL_DBL_EPSILON;
1544 return cheb_eval_e(&fd_3half_a_cs, x, result);
1547 double t = 2.0/3.0*(x-1.0) - 1.0;
1548 return cheb_eval_e(&fd_3half_b_cs, t, result);
1551 double t = 1.0/3.0*(x-4.0) - 1.0;
1552 return cheb_eval_e(&fd_3half_c_cs, t, result);
1555 double x52 = x*x*sqrt(x);
1556 double t = 0.1*x - 2.0;
1558 cheb_eval_e(&fd_3half_d_cs, t, &c);
1559 result->val = c.val * x52;
1560 result->err = c.err * x52 + 2.5 * GSL_DBL_EPSILON * fabs(result->val);
1564 return fd_asymp(1.5, x, result);
1568 /* [Goano p. 222] */
1569 int gsl_sf_fermi_dirac_inc_0_e(const double x, const double b, gsl_sf_result * result)
1572 DOMAIN_ERROR(result);
1577 int status = gsl_sf_fermi_dirac_0_e(arg, &f0);
1578 result->val = f0.val - arg;
1579 result->err = f0.err + GSL_DBL_EPSILON * (fabs(x) + fabs(b));
1586 /*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
1590 double gsl_sf_fermi_dirac_m1(const double x)
1592 EVAL_RESULT(gsl_sf_fermi_dirac_m1_e(x, &result));
1595 double gsl_sf_fermi_dirac_0(const double x)
1597 EVAL_RESULT(gsl_sf_fermi_dirac_0_e(x, &result));
1600 double gsl_sf_fermi_dirac_1(const double x)
1602 EVAL_RESULT(gsl_sf_fermi_dirac_1_e(x, &result));
1605 double gsl_sf_fermi_dirac_2(const double x)
1607 EVAL_RESULT(gsl_sf_fermi_dirac_2_e(x, &result));
1610 double gsl_sf_fermi_dirac_int(const int j, const double x)
1612 EVAL_RESULT(gsl_sf_fermi_dirac_int_e(j, x, &result));
1615 double gsl_sf_fermi_dirac_mhalf(const double x)
1617 EVAL_RESULT(gsl_sf_fermi_dirac_mhalf_e(x, &result));
1620 double gsl_sf_fermi_dirac_half(const double x)
1622 EVAL_RESULT(gsl_sf_fermi_dirac_half_e(x, &result));
1625 double gsl_sf_fermi_dirac_3half(const double x)
1627 EVAL_RESULT(gsl_sf_fermi_dirac_3half_e(x, &result));
1630 double gsl_sf_fermi_dirac_inc_0(const double x, const double b)
1632 EVAL_RESULT(gsl_sf_fermi_dirac_inc_0_e(x, b, &result));