LGAMMA(3M) UNIX Programmer's Manual LGAMMA(3M) NAME lgamma - log gamma function SYNOPSIS #include double lgamma(x) double x; DESCRIPTION Lgamma returns ln|I~(x)|. The external integer signgam returns the sign of I~(x) . IDIOSYNCRASIES Do not use the expression signgam*exp(lgamma(x)) to compute g := I~(x). Instead use a program like this (in C): lg = lgamma(x); g = signgam*exp(lg); Only after lgamma has returned can signgam be correct. Note too that I~(x) must overflow when x is large enough, under- flow when -x is large enough, and spawn a division by zero when x is a nonpositive integer. Only in the UNIX math library for C was the name gamma ever attached to lnI~. Elsewhere, for instance in IBM's FORTRAN library, the name GAMMA belongs to I~ and the name ALGAMA to lnI~ in single precision; in double the names are DGAMMA and DLGAMA. Why should C be different? Archaeological records suggest that C's gamma originally delivered ln(I~(|x|)). Later, the program gamma was changed to cope with negative arguments x in a more conventional way, but the documentation did not reflect that change correctly. The most recent change corrects inaccurate values when x is almost a negative integer, and lets I~(x) be computed without conditional expressions. Programmers should not assume that lgamma has settled down. At some time in the future, the name _g_a_m_m_a will be rehabili- tated and used for the gamma function, just as is done in FORTRAN. The reason for this is not so much compatibility with FORTRAN as a desire to achieve greater speed for smaller values of |x| and greater accuracy for larger values. Meanwhile, programmers who have to use the name _g_a_m_m_a in its former sense, for what is now _l_g_a_m_m_a, have two choices: 1) Use the old math library, _l_i_b_o_m. 2) Add the following program to your others: Printed 11/26/99 May 12, 1986 1 LGAMMA(3M) UNIX Programmer's Manual LGAMMA(3M) #include double gamma(x) double x; { return (lgamma(x)); } DIAGNOSTICS The reserved operand is returned on a VAX for negative integer arguments, _e_r_r_n_o is set to ERANGE; for very large arguments over/underflows will occur inside the _l_g_a_m_m_a rou- tine. SEE ALSO math(3M), infnan(3M) Printed 11/26/99 May 12, 1986 2