2.11BSD/man/cat3/lgamma.0
LGAMMA(3M) UNIX Programmer's Manual LGAMMA(3M)
NAME
lgamma - log gamma function
SYNOPSIS
#include <math.h>
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 <math.h>
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