201 long double term = 1.0L / nu;
202 long double corrected_term = term;
203 long double temp_sum = term;
204 long double correction = -temp_sum + corrected_term;
205 long double sum1 = temp_sum;
207 long double epsilon = 0.0L;
210 if (nu > Gamma_Function_Max_Arg())
212 coef = expl( nu * logl(x) - x - xLn_Gamma_Function(nu) );
213 if (coef > 0.0L) epsilon = DBL_EPSILON/coef;
217 coef = powl(x, nu) * expl(-x) / xGamma_Function(nu);
218 epsilon = DBL_EPSILON/coef;
220 if (epsilon <= 0.0L) epsilon = (
long double) DBL_EPSILON;
222 for (i = 1; term > epsilon * sum1; i++)
224 term *= x / (nu + i);
225 corrected_term = term + correction;
226 temp_sum = sum1 + corrected_term;
227 correction = (sum1 - temp_sum) + corrected_term;
232 correction += sum2 - sum1 / coef;
233 term *= x / (nu + i);
234 sum2 = term + correction;
235 for (i++; (term + correction) > epsilon * sum2; i++)
237 term *= x / (nu + i);
238 corrected_term = term + correction;
239 temp_sum = sum2 + corrected_term;
240 correction = (sum2 - temp_sum) + corrected_term;
277 long double temp = 1.0L / nu;
278 long double sum = temp;
283 n = (int)(x - nu - 1.0L) + 1;
284 for (i = 1; i < n; i++)
286 temp *= x / (nu + i);
289 if ( nu <= Gamma_Function_Max_Arg() )
291 coef = powl(x, nu) * expl(-x) / xGamma_Function(nu);
292 return xMedium_x(x, nu + n) + coef * sum;
296 return expl(logl(sum) + nu * logl(x) - x - xLn_Gamma_Function(nu)) + xMedium_x(x, nu + n);