double tgamma(double x) { struct Double u; if (x >= 6) { if(x > 171.63) return (x / zero); u = large_gam(x); return(__exp__D(u.a, u.b)); } else if (x >= 1.0 + LEFT + x0) return (small_gam(x)); else if (x > 1.e-17) return (smaller_gam(x)); else if (x > -1.e-17) { if (x != 0.0) u.a = one - tiny; /* raise inexact */ return (one/x); } else if (!finite(x)) return (x - x); /* x is NaN or -Inf */ else return (neg_gam(x)); }
double tgamma(double x) { struct Double u; #if _IEEE endian = (*(int *) &one) ? 1 : 0; #endif if (x >= 6) { if(x > 171.63) if (_IEEE) return (x/zero); else return (infnan(ERANGE)); u = large_gam(x); return(__exp__D(u.a, u.b)); } else if (x >= 1.0 + LEFT + x0) return (small_gam(x)); else if (x > 1.e-17) return (smaller_gam(x)); else if (x > -1.e-17) { if (x == 0.0) { if (!_IEEE) return (infnan(ERANGE)); } else { u.a = one - tiny; /* raise inexact */ } return (one/x); } else if (!finite(x)) { if (_IEEE) /* x = NaN, -Inf */ return (x - x); else return (infnan(EDOM)); } else return (neg_gam(x)); }