LGAMMA(3M) RISC/os Reference Manual LGAMMA(3M)
NAME
lgamma - log gamma function
SYNOPSIS
#include <math.h>
double lgamma(x)
double x;
DESCRIPTION
lgamma returns ln|Γ(x)|.
The external integer signgam returns the sign of Γ(x) .
IDIOSYNCRASIES
Do not use the expression signgam*exp(lgamma(x)) to compute
g := Γ(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 Γ(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.
The following C program fragment might be used to calculate
Γ if the overflow needs to be detected:
if ((y = lgamma(x)) > LN_MAXDOUBLE)
error();
y = signgam * exp(y);
where LN_MAXDOUBLE is the least value that causes exp(3M) to
overflow, and is defined in the <values.h> header file.
Only in the UNIX math library for C was the name gamma ever
attached to lnΓ. Elsewhere, for instance in IBM's FORTRAN
library, the name GAMMA belongs to Γ and the name ALGAMA to
lnΓ 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(Γ(|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 Γ(x) be
computed without conditional expressions. Programmers
should not assume that lgamma has settled down.
Printed 11/19/92 Page 1
LGAMMA(3M) RISC/os Reference Manual LGAMMA(3M)
At some time in the future, the name gamma 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 gamma in its
former sense, for what is now lgamma, have two choices:
1) Change your source to use lgamma instead of gamma.
2) Add the following program to your others:
#include <math.h>
double gamma(x)
double x;
{
return (lgamma(x));
}
DIAGNOSTICS
Γ returns +Infinity for negative integer arguments.
SEE ALSO
math(3M)
Page 2 Printed 11/19/92