46 Float attribute_hidden stirlerr(Float n)
49 #define S0 0.083333333333333333333 50 #define S1 0.00277777777777777777778 51 #define S2 0.00079365079365079365079365 52 #define S3 0.000595238095238095238095238 53 #define S4 0.0008417508417508417508417508 58 const static double sferr_halves[31] = {
60 0.1534264097200273452913848,
61 0.0810614667953272582196702,
62 0.0548141210519176538961390,
63 0.0413406959554092940938221,
64 0.03316287351993628748511048,
65 0.02767792568499833914878929,
66 0.02374616365629749597132920,
67 0.02079067210376509311152277,
68 0.01848845053267318523077934,
69 0.01664469118982119216319487,
70 0.01513497322191737887351255,
71 0.01387612882307074799874573,
72 0.01281046524292022692424986,
73 0.01189670994589177009505572,
74 0.01110455975820691732662991,
75 0.010411265261972096497478567,
76 0.009799416126158803298389475,
77 0.009255462182712732917728637,
78 0.008768700134139385462952823,
79 0.008330563433362871256469318,
80 0.007934114564314020547248100,
81 0.007573675487951840794972024,
82 0.007244554301320383179543912,
83 0.006942840107209529865664152,
84 0.006665247032707682442354394,
85 0.006408994188004207068439631,
86 0.006171712263039457647532867,
87 0.005951370112758847735624416,
88 0.005746216513010115682023589,
89 0.005554733551962801371038690
95 if (nn == (
int)trunc(nn))
return(sferr_halves[(
int)trunc(nn)]);
96 return(lgammafn(n + 1.) - (n + 0.5)*log(n) + n - M_LN_SQRT_2PI);
100 if (n>500)
return((S0-S1/nn)/n);
101 if (n> 80)
return((S0-(S1-S2/nn)/nn)/n);
102 if (n> 35)
return((S0-(S1-(S2-S3/nn)/nn)/nn)/n);
104 return((S0-(S1-(S2-(S3-S4/nn)/nn)/nn)/nn)/n);