@c We need some definitions here.
@ifclear mult
@ifhtml
@set mult &middot;
@set infty &infin;
@set pie &pi;
@end ifhtml
@iftex
@set mult @cdot
@set infty @infty
@end iftex
@ifclear mult
@set mult *
@set infty oo
@set pie pi
@end ifclear
@macro mul
@value{mult}
@end macro
@macro infinity
@value{infty}
@end macro
@ifnottex
@macro pi
@value{pie}
@end macro
@end ifnottex
@end ifclear

@node Mathematics, Arithmetic, Syslog, Top
@c %MENU% Math functions, useful constants, random numbers
@chapter Mathematics

This chapter contains information about functions for performing
mathematical computations, such as trigonometric functions.  Most of
these functions have prototypes declared in the header file
@file{math.h}.  The complex-valued functions are defined in
@file{complex.h}.
@pindex math.h
@pindex complex.h

All mathematical functions which take a floating-point argument
have three variants, one each for @code{double}, @code{float}, and
@code{long double} arguments.  The @code{double} versions are mostly
defined in @w{ISO C89}.  The @code{float} and @code{long double}
versions are from the numeric extensions to C included in @w{ISO C99}.

Which of the three versions of a function should be used depends on the
situation.  For most calculations, the @code{float} functions are the
fastest.  On the other hand, the @code{long double} functions have the
highest precision.  @code{double} is somewhere in between.  It is
usually wise to pick the narrowest type that can accommodate your data.
Not all machines have a distinct @code{long double} type; it may be the
same as @code{double}.

@menu
* Mathematical Constants::      Precise numeric values for often-used
                                 constants.
* Trig Functions::              Sine, cosine, tangent, and friends.
* Inverse Trig Functions::      Arcsine, arccosine, etc.
* Exponents and Logarithms::    Also pow and sqrt.
* Hyperbolic Functions::        sinh, cosh, tanh, etc.
* Special Functions::           Bessel, gamma, erf.
* Errors in Math Functions::    Known Maximum Errors in Math Functions.
* Pseudo-Random Numbers::       Functions for generating pseudo-random
				 numbers.
* FP Function Optimizations::   Fast code or small code.
@end menu

@node Mathematical Constants
@section Predefined Mathematical Constants
@cindex constants
@cindex mathematical constants

The header @file{math.h} defines several useful mathematical constants.
All values are defined as preprocessor macros starting with @code{M_}.
The values provided are:

@vtable @code
@item M_E
The base of natural logarithms.
@item M_LOG2E
The logarithm to base @code{2} of @code{M_E}.
@item M_LOG10E
The logarithm to base @code{10} of @code{M_E}.
@item M_LN2
The natural logarithm of @code{2}.
@item M_LN10
The natural logarithm of @code{10}.
@item M_PI
Pi, the ratio of a circle's circumference to its diameter.
@item M_PI_2
Pi divided by two.
@item M_PI_4
Pi divided by four.
@item M_1_PI
The reciprocal of pi (1/pi)
@item M_2_PI
Two times the reciprocal of pi.
@item M_2_SQRTPI
Two times the reciprocal of the square root of pi.
@item M_SQRT2
The square root of two.
@item M_SQRT1_2
The reciprocal of the square root of two (also the square root of 1/2).
@end vtable

These constants come from the Unix98 standard and were also available in
4.4BSD; therefore they are only defined if @code{_BSD_SOURCE} or
@code{_XOPEN_SOURCE=500}, or a more general feature select macro, is
defined.  The default set of features includes these constants.
@xref{Feature Test Macros}.

All values are of type @code{double}.  As an extension, @theglibc{}
also defines these constants with type @code{long double}.  The
@code{long double} macros have a lowercase @samp{l} appended to their
names: @code{M_El}, @code{M_PIl}, and so forth.  These are only
available if @code{_GNU_SOURCE} is defined.

@vindex PI
@emph{Note:} Some programs use a constant named @code{PI} which has the
same value as @code{M_PI}.  This constant is not standard; it may have
appeared in some old AT&T headers, and is mentioned in Stroustrup's book
on C++.  It infringes on the user's name space, so @theglibc{}
does not define it.  Fixing programs written to expect it is simple:
replace @code{PI} with @code{M_PI} throughout, or put @samp{-DPI=M_PI}
on the compiler command line.

@node Trig Functions
@section Trigonometric Functions
@cindex trigonometric functions

These are the familiar @code{sin}, @code{cos}, and @code{tan} functions.
The arguments to all of these functions are in units of radians; recall
that pi radians equals 180 degrees.

@cindex pi (trigonometric constant)
The math library normally defines @code{M_PI} to a @code{double}
approximation of pi.  If strict ISO and/or POSIX compliance
are requested this constant is not defined, but you can easily define it
yourself:

@smallexample
#define M_PI 3.14159265358979323846264338327
@end smallexample

@noindent
You can also compute the value of pi with the expression @code{acos
(-1.0)}.

@comment math.h
@comment ISO
@deftypefun double sin (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float sinf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} sinl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the sine of @var{x}, where @var{x} is given in
radians.  The return value is in the range @code{-1} to @code{1}.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double cos (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float cosf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} cosl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the cosine of @var{x}, where @var{x} is given in
radians.  The return value is in the range @code{-1} to @code{1}.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double tan (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float tanf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} tanl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the tangent of @var{x}, where @var{x} is given in
radians.

Mathematically, the tangent function has singularities at odd multiples
of pi/2.  If the argument @var{x} is too close to one of these
singularities, @code{tan} will signal overflow.
@end deftypefun

In many applications where @code{sin} and @code{cos} are used, the sine
and cosine of the same angle are needed at the same time.  It is more
efficient to compute them simultaneously, so the library provides a
function to do that.

@comment math.h
@comment GNU
@deftypefun void sincos (double @var{x}, double *@var{sinx}, double *@var{cosx})
@comment math.h
@comment GNU
@deftypefunx void sincosf (float @var{x}, float *@var{sinx}, float *@var{cosx})
@comment math.h
@comment GNU
@deftypefunx void sincosl (long double @var{x}, long double *@var{sinx}, long double *@var{cosx})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the sine of @var{x} in @code{*@var{sinx}} and the
cosine of @var{x} in @code{*@var{cos}}, where @var{x} is given in
radians.  Both values, @code{*@var{sinx}} and @code{*@var{cosx}}, are in
the range of @code{-1} to @code{1}.

This function is a GNU extension.  Portable programs should be prepared
to cope with its absence.
@end deftypefun

@cindex complex trigonometric functions

@w{ISO C99} defines variants of the trig functions which work on
complex numbers.  @Theglibc{} provides these functions, but they
are only useful if your compiler supports the new complex types defined
by the standard.
@c XXX Change this when gcc is fixed. -zw
(As of this writing GCC supports complex numbers, but there are bugs in
the implementation.)

@comment complex.h
@comment ISO
@deftypefun {complex double} csin (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} csinf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} csinl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c There are calls to nan* that could trigger @mtslocale if they didn't get
@c empty strings.
These functions return the complex sine of @var{z}.
The mathematical definition of the complex sine is

@ifnottex
@math{sin (z) = 1/(2*i) * (exp (z*i) - exp (-z*i))}.
@end ifnottex
@tex
$$\sin(z) = {1\over 2i} (e^{zi} - e^{-zi})$$
@end tex
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun {complex double} ccos (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} ccosf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} ccosl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the complex cosine of @var{z}.
The mathematical definition of the complex cosine is

@ifnottex
@math{cos (z) = 1/2 * (exp (z*i) + exp (-z*i))}
@end ifnottex
@tex
$$\cos(z) = {1\over 2} (e^{zi} + e^{-zi})$$
@end tex
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun {complex double} ctan (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} ctanf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} ctanl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the complex tangent of @var{z}.
The mathematical definition of the complex tangent is

@ifnottex
@math{tan (z) = -i * (exp (z*i) - exp (-z*i)) / (exp (z*i) + exp (-z*i))}
@end ifnottex
@tex
$$\tan(z) = -i \cdot {e^{zi} - e^{-zi}\over e^{zi} + e^{-zi}}$$
@end tex

@noindent
The complex tangent has poles at @math{pi/2 + 2n}, where @math{n} is an
integer.  @code{ctan} may signal overflow if @var{z} is too close to a
pole.
@end deftypefun


@node Inverse Trig Functions
@section Inverse Trigonometric Functions
@cindex inverse trigonometric functions

These are the usual arc sine, arc cosine and arc tangent functions,
which are the inverses of the sine, cosine and tangent functions
respectively.

@comment math.h
@comment ISO
@deftypefun double asin (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float asinf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} asinl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions compute the arc sine of @var{x}---that is, the value whose
sine is @var{x}.  The value is in units of radians.  Mathematically,
there are infinitely many such values; the one actually returned is the
one between @code{-pi/2} and @code{pi/2} (inclusive).

The arc sine function is defined mathematically only
over the domain @code{-1} to @code{1}.  If @var{x} is outside the
domain, @code{asin} signals a domain error.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double acos (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float acosf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} acosl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions compute the arc cosine of @var{x}---that is, the value
whose cosine is @var{x}.  The value is in units of radians.
Mathematically, there are infinitely many such values; the one actually
returned is the one between @code{0} and @code{pi} (inclusive).

The arc cosine function is defined mathematically only
over the domain @code{-1} to @code{1}.  If @var{x} is outside the
domain, @code{acos} signals a domain error.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double atan (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float atanf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} atanl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions compute the arc tangent of @var{x}---that is, the value
whose tangent is @var{x}.  The value is in units of radians.
Mathematically, there are infinitely many such values; the one actually
returned is the one between @code{-pi/2} and @code{pi/2} (inclusive).
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double atan2 (double @var{y}, double @var{x})
@comment math.h
@comment ISO
@deftypefunx float atan2f (float @var{y}, float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} atan2l (long double @var{y}, long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function computes the arc tangent of @var{y}/@var{x}, but the signs
of both arguments are used to determine the quadrant of the result, and
@var{x} is permitted to be zero.  The return value is given in radians
and is in the range @code{-pi} to @code{pi}, inclusive.

If @var{x} and @var{y} are coordinates of a point in the plane,
@code{atan2} returns the signed angle between the line from the origin
to that point and the x-axis.  Thus, @code{atan2} is useful for
converting Cartesian coordinates to polar coordinates.  (To compute the
radial coordinate, use @code{hypot}; see @ref{Exponents and
Logarithms}.)

@c This is experimentally true.  Should it be so? -zw
If both @var{x} and @var{y} are zero, @code{atan2} returns zero.
@end deftypefun

@cindex inverse complex trigonometric functions
@w{ISO C99} defines complex versions of the inverse trig functions.

@comment complex.h
@comment ISO
@deftypefun {complex double} casin (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} casinf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} casinl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions compute the complex arc sine of @var{z}---that is, the
value whose sine is @var{z}.  The value returned is in radians.

Unlike the real-valued functions, @code{casin} is defined for all
values of @var{z}.
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun {complex double} cacos (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} cacosf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} cacosl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions compute the complex arc cosine of @var{z}---that is, the
value whose cosine is @var{z}.  The value returned is in radians.

Unlike the real-valued functions, @code{cacos} is defined for all
values of @var{z}.
@end deftypefun


@comment complex.h
@comment ISO
@deftypefun {complex double} catan (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} catanf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} catanl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions compute the complex arc tangent of @var{z}---that is,
the value whose tangent is @var{z}.  The value is in units of radians.
@end deftypefun


@node Exponents and Logarithms
@section Exponentiation and Logarithms
@cindex exponentiation functions
@cindex power functions
@cindex logarithm functions

@comment math.h
@comment ISO
@deftypefun double exp (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float expf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} expl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions compute @code{e} (the base of natural logarithms) raised
to the power @var{x}.

If the magnitude of the result is too large to be representable,
@code{exp} signals overflow.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double exp2 (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float exp2f (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} exp2l (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions compute @code{2} raised to the power @var{x}.
Mathematically, @code{exp2 (x)} is the same as @code{exp (x * log (2))}.
@end deftypefun

@comment math.h
@comment GNU
@deftypefun double exp10 (double @var{x})
@comment math.h
@comment GNU
@deftypefunx float exp10f (float @var{x})
@comment math.h
@comment GNU
@deftypefunx {long double} exp10l (long double @var{x})
@comment math.h
@comment GNU
@deftypefunx double pow10 (double @var{x})
@comment math.h
@comment GNU
@deftypefunx float pow10f (float @var{x})
@comment math.h
@comment GNU
@deftypefunx {long double} pow10l (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions compute @code{10} raised to the power @var{x}.
Mathematically, @code{exp10 (x)} is the same as @code{exp (x * log (10))}.

These functions are GNU extensions.  The name @code{exp10} is
preferred, since it is analogous to @code{exp} and @code{exp2}.
@end deftypefun


@comment math.h
@comment ISO
@deftypefun double log (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float logf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} logl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions compute the natural logarithm of @var{x}.  @code{exp (log
(@var{x}))} equals @var{x}, exactly in mathematics and approximately in
C.

If @var{x} is negative, @code{log} signals a domain error.  If @var{x}
is zero, it returns negative infinity; if @var{x} is too close to zero,
it may signal overflow.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double log10 (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float log10f (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} log10l (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the base-10 logarithm of @var{x}.
@code{log10 (@var{x})} equals @code{log (@var{x}) / log (10)}.

@end deftypefun

@comment math.h
@comment ISO
@deftypefun double log2 (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float log2f (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} log2l (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the base-2 logarithm of @var{x}.
@code{log2 (@var{x})} equals @code{log (@var{x}) / log (2)}.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double logb (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float logbf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} logbl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions extract the exponent of @var{x} and return it as a
floating-point value.  If @code{FLT_RADIX} is two, @code{logb} is equal
to @code{floor (log2 (x))}, except it's probably faster.

If @var{x} is de-normalized, @code{logb} returns the exponent @var{x}
would have if it were normalized.  If @var{x} is infinity (positive or
negative), @code{logb} returns @math{@infinity{}}.  If @var{x} is zero,
@code{logb} returns @math{@infinity{}}.  It does not signal.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun int ilogb (double @var{x})
@comment math.h
@comment ISO
@deftypefunx int ilogbf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx int ilogbl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions are equivalent to the corresponding @code{logb}
functions except that they return signed integer values.
@end deftypefun

@noindent
Since integers cannot represent infinity and NaN, @code{ilogb} instead
returns an integer that can't be the exponent of a normal floating-point
number.  @file{math.h} defines constants so you can check for this.

@comment math.h
@comment ISO
@deftypevr Macro int FP_ILOGB0
@code{ilogb} returns this value if its argument is @code{0}.  The
numeric value is either @code{INT_MIN} or @code{-INT_MAX}.

This macro is defined in @w{ISO C99}.
@end deftypevr

@comment math.h
@comment ISO
@deftypevr Macro int FP_ILOGBNAN
@code{ilogb} returns this value if its argument is @code{NaN}.  The
numeric value is either @code{INT_MIN} or @code{INT_MAX}.

This macro is defined in @w{ISO C99}.
@end deftypevr

These values are system specific.  They might even be the same.  The
proper way to test the result of @code{ilogb} is as follows:

@smallexample
i = ilogb (f);
if (i == FP_ILOGB0 || i == FP_ILOGBNAN)
  @{
    if (isnan (f))
      @{
        /* @r{Handle NaN.}  */
      @}
    else if (f  == 0.0)
      @{
        /* @r{Handle 0.0.}  */
      @}
    else
      @{
        /* @r{Some other value with large exponent,}
           @r{perhaps +Inf.}  */
      @}
  @}
@end smallexample

@comment math.h
@comment ISO
@deftypefun double pow (double @var{base}, double @var{power})
@comment math.h
@comment ISO
@deftypefunx float powf (float @var{base}, float @var{power})
@comment math.h
@comment ISO
@deftypefunx {long double} powl (long double @var{base}, long double @var{power})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These are general exponentiation functions, returning @var{base} raised
to @var{power}.

Mathematically, @code{pow} would return a complex number when @var{base}
is negative and @var{power} is not an integral value.  @code{pow} can't
do that, so instead it signals a domain error. @code{pow} may also
underflow or overflow the destination type.
@end deftypefun

@cindex square root function
@comment math.h
@comment ISO
@deftypefun double sqrt (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float sqrtf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} sqrtl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the nonnegative square root of @var{x}.

If @var{x} is negative, @code{sqrt} signals a domain error.
Mathematically, it should return a complex number.
@end deftypefun

@cindex cube root function
@comment math.h
@comment BSD
@deftypefun double cbrt (double @var{x})
@comment math.h
@comment BSD
@deftypefunx float cbrtf (float @var{x})
@comment math.h
@comment BSD
@deftypefunx {long double} cbrtl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the cube root of @var{x}.  They cannot
fail; every representable real value has a representable real cube root.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double hypot (double @var{x}, double @var{y})
@comment math.h
@comment ISO
@deftypefunx float hypotf (float @var{x}, float @var{y})
@comment math.h
@comment ISO
@deftypefunx {long double} hypotl (long double @var{x}, long double @var{y})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return @code{sqrt (@var{x}*@var{x} +
@var{y}*@var{y})}.  This is the length of the hypotenuse of a right
triangle with sides of length @var{x} and @var{y}, or the distance
of the point (@var{x}, @var{y}) from the origin.  Using this function
instead of the direct formula is wise, since the error is
much smaller.  See also the function @code{cabs} in @ref{Absolute Value}.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double expm1 (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float expm1f (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} expm1l (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return a value equivalent to @code{exp (@var{x}) - 1}.
They are computed in a way that is accurate even if @var{x} is
near zero---a case where @code{exp (@var{x}) - 1} would be inaccurate owing
to subtraction of two numbers that are nearly equal.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double log1p (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float log1pf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} log1pl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions returns a value equivalent to @w{@code{log (1 + @var{x})}}.
They are computed in a way that is accurate even if @var{x} is
near zero.
@end deftypefun

@cindex complex exponentiation functions
@cindex complex logarithm functions

@w{ISO C99} defines complex variants of some of the exponentiation and
logarithm functions.

@comment complex.h
@comment ISO
@deftypefun {complex double} cexp (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} cexpf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} cexpl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return @code{e} (the base of natural
logarithms) raised to the power of @var{z}.
Mathematically, this corresponds to the value

@ifnottex
@math{exp (z) = exp (creal (z)) * (cos (cimag (z)) + I * sin (cimag (z)))}
@end ifnottex
@tex
$$\exp(z) = e^z = e^{{\rm Re}\,z} (\cos ({\rm Im}\,z) + i \sin ({\rm Im}\,z))$$
@end tex
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun {complex double} clog (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} clogf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} clogl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the natural logarithm of @var{z}.
Mathematically, this corresponds to the value

@ifnottex
@math{log (z) = log (cabs (z)) + I * carg (z)}
@end ifnottex
@tex
$$\log(z) = \log |z| + i \arg z$$
@end tex

@noindent
@code{clog} has a pole at 0, and will signal overflow if @var{z} equals
or is very close to 0.  It is well-defined for all other values of
@var{z}.
@end deftypefun


@comment complex.h
@comment GNU
@deftypefun {complex double} clog10 (complex double @var{z})
@comment complex.h
@comment GNU
@deftypefunx {complex float} clog10f (complex float @var{z})
@comment complex.h
@comment GNU
@deftypefunx {complex long double} clog10l (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the base 10 logarithm of the complex value
@var{z}. Mathematically, this corresponds to the value

@ifnottex
@math{log (z) = log10 (cabs (z)) + I * carg (z)}
@end ifnottex
@tex
$$\log_{10}(z) = \log_{10}|z| + i \arg z$$
@end tex

These functions are GNU extensions.
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun {complex double} csqrt (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} csqrtf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} csqrtl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the complex square root of the argument @var{z}.  Unlike
the real-valued functions, they are defined for all values of @var{z}.
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun {complex double} cpow (complex double @var{base}, complex double @var{power})
@comment complex.h
@comment ISO
@deftypefunx {complex float} cpowf (complex float @var{base}, complex float @var{power})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} cpowl (complex long double @var{base}, complex long double @var{power})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return @var{base} raised to the power of
@var{power}.  This is equivalent to @w{@code{cexp (y * clog (x))}}
@end deftypefun

@node Hyperbolic Functions
@section Hyperbolic Functions
@cindex hyperbolic functions

The functions in this section are related to the exponential functions;
see @ref{Exponents and Logarithms}.

@comment math.h
@comment ISO
@deftypefun double sinh (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float sinhf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} sinhl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the hyperbolic sine of @var{x}, defined
mathematically as @w{@code{(exp (@var{x}) - exp (-@var{x})) / 2}}.  They
may signal overflow if @var{x} is too large.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double cosh (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float coshf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} coshl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These function return the hyperbolic cosine of @var{x},
defined mathematically as @w{@code{(exp (@var{x}) + exp (-@var{x})) / 2}}.
They may signal overflow if @var{x} is too large.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double tanh (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float tanhf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} tanhl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the hyperbolic tangent of @var{x},
defined mathematically as @w{@code{sinh (@var{x}) / cosh (@var{x})}}.
They may signal overflow if @var{x} is too large.
@end deftypefun

@cindex hyperbolic functions

There are counterparts for the hyperbolic functions which take
complex arguments.

@comment complex.h
@comment ISO
@deftypefun {complex double} csinh (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} csinhf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} csinhl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the complex hyperbolic sine of @var{z}, defined
mathematically as @w{@code{(exp (@var{z}) - exp (-@var{z})) / 2}}.
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun {complex double} ccosh (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} ccoshf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} ccoshl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the complex hyperbolic cosine of @var{z}, defined
mathematically as @w{@code{(exp (@var{z}) + exp (-@var{z})) / 2}}.
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun {complex double} ctanh (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} ctanhf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} ctanhl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the complex hyperbolic tangent of @var{z},
defined mathematically as @w{@code{csinh (@var{z}) / ccosh (@var{z})}}.
@end deftypefun


@cindex inverse hyperbolic functions

@comment math.h
@comment ISO
@deftypefun double asinh (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float asinhf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} asinhl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the inverse hyperbolic sine of @var{x}---the
value whose hyperbolic sine is @var{x}.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double acosh (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float acoshf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} acoshl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the inverse hyperbolic cosine of @var{x}---the
value whose hyperbolic cosine is @var{x}.  If @var{x} is less than
@code{1}, @code{acosh} signals a domain error.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double atanh (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float atanhf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} atanhl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the inverse hyperbolic tangent of @var{x}---the
value whose hyperbolic tangent is @var{x}.  If the absolute value of
@var{x} is greater than @code{1}, @code{atanh} signals a domain error;
if it is equal to 1, @code{atanh} returns infinity.
@end deftypefun

@cindex inverse complex hyperbolic functions

@comment complex.h
@comment ISO
@deftypefun {complex double} casinh (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} casinhf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} casinhl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the inverse complex hyperbolic sine of
@var{z}---the value whose complex hyperbolic sine is @var{z}.
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun {complex double} cacosh (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} cacoshf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} cacoshl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the inverse complex hyperbolic cosine of
@var{z}---the value whose complex hyperbolic cosine is @var{z}.  Unlike
the real-valued functions, there are no restrictions on the value of @var{z}.
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun {complex double} catanh (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} catanhf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} catanhl (complex long double @var{z})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These functions return the inverse complex hyperbolic tangent of
@var{z}---the value whose complex hyperbolic tangent is @var{z}.  Unlike
the real-valued functions, there are no restrictions on the value of
@var{z}.
@end deftypefun

@node Special Functions
@section Special Functions
@cindex special functions
@cindex Bessel functions
@cindex gamma function

These are some more exotic mathematical functions which are sometimes
useful.  Currently they only have real-valued versions.

@comment math.h
@comment SVID
@deftypefun double erf (double @var{x})
@comment math.h
@comment SVID
@deftypefunx float erff (float @var{x})
@comment math.h
@comment SVID
@deftypefunx {long double} erfl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@code{erf} returns the error function of @var{x}.  The error
function is defined as
@tex
$$\hbox{erf}(x) = {2\over\sqrt{\pi}}\cdot\int_0^x e^{-t^2} \hbox{d}t$$
@end tex
@ifnottex
@smallexample
erf (x) = 2/sqrt(pi) * integral from 0 to x of exp(-t^2) dt
@end smallexample
@end ifnottex
@end deftypefun

@comment math.h
@comment SVID
@deftypefun double erfc (double @var{x})
@comment math.h
@comment SVID
@deftypefunx float erfcf (float @var{x})
@comment math.h
@comment SVID
@deftypefunx {long double} erfcl (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@code{erfc} returns @code{1.0 - erf(@var{x})}, but computed in a
fashion that avoids round-off error when @var{x} is large.
@end deftypefun

@comment math.h
@comment SVID
@deftypefun double lgamma (double @var{x})
@comment math.h
@comment SVID
@deftypefunx float lgammaf (float @var{x})
@comment math.h
@comment SVID
@deftypefunx {long double} lgammal (long double @var{x})
@safety{@prelim{}@mtunsafe{@mtasurace{:signgam}}@asunsafe{}@acsafe{}}
@code{lgamma} returns the natural logarithm of the absolute value of
the gamma function of @var{x}.  The gamma function is defined as
@tex
$$\Gamma(x) = \int_0^\infty t^{x-1} e^{-t} \hbox{d}t$$
@end tex
@ifnottex
@smallexample
gamma (x) = integral from 0 to @infinity{} of t^(x-1) e^-t dt
@end smallexample
@end ifnottex

@vindex signgam
The sign of the gamma function is stored in the global variable
@var{signgam}, which is declared in @file{math.h}.  It is @code{1} if
the intermediate result was positive or zero, or @code{-1} if it was
negative.

To compute the real gamma function you can use the @code{tgamma}
function or you can compute the values as follows:
@smallexample
lgam = lgamma(x);
gam  = signgam*exp(lgam);
@end smallexample

The gamma function has singularities at the non-positive integers.
@code{lgamma} will raise the zero divide exception if evaluated at a
singularity.
@end deftypefun

@comment math.h
@comment XPG
@deftypefun double lgamma_r (double @var{x}, int *@var{signp})
@comment math.h
@comment XPG
@deftypefunx float lgammaf_r (float @var{x}, int *@var{signp})
@comment math.h
@comment XPG
@deftypefunx {long double} lgammal_r (long double @var{x}, int *@var{signp})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@code{lgamma_r} is just like @code{lgamma}, but it stores the sign of
the intermediate result in the variable pointed to by @var{signp}
instead of in the @var{signgam} global.  This means it is reentrant.
@end deftypefun

@comment math.h
@comment SVID
@deftypefun double gamma (double @var{x})
@comment math.h
@comment SVID
@deftypefunx float gammaf (float @var{x})
@comment math.h
@comment SVID
@deftypefunx {long double} gammal (long double @var{x})
@safety{@prelim{}@mtunsafe{@mtasurace{:signgam}}@asunsafe{}@acsafe{}}
These functions exist for compatibility reasons.  They are equivalent to
@code{lgamma} etc.  It is better to use @code{lgamma} since for one the
name reflects better the actual computation, moreover @code{lgamma} is
standardized in @w{ISO C99} while @code{gamma} is not.
@end deftypefun

@comment math.h
@comment XPG, ISO
@deftypefun double tgamma (double @var{x})
@comment math.h
@comment XPG, ISO
@deftypefunx float tgammaf (float @var{x})
@comment math.h
@comment XPG, ISO
@deftypefunx {long double} tgammal (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@code{tgamma} applies the gamma function to @var{x}.  The gamma
function is defined as
@tex
$$\Gamma(x) = \int_0^\infty t^{x-1} e^{-t} \hbox{d}t$$
@end tex
@ifnottex
@smallexample
gamma (x) = integral from 0 to @infinity{} of t^(x-1) e^-t dt
@end smallexample
@end ifnottex

This function was introduced in @w{ISO C99}.
@end deftypefun

@comment math.h
@comment SVID
@deftypefun double j0 (double @var{x})
@comment math.h
@comment SVID
@deftypefunx float j0f (float @var{x})
@comment math.h
@comment SVID
@deftypefunx {long double} j0l (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@code{j0} returns the Bessel function of the first kind of order 0 of
@var{x}.  It may signal underflow if @var{x} is too large.
@end deftypefun

@comment math.h
@comment SVID
@deftypefun double j1 (double @var{x})
@comment math.h
@comment SVID
@deftypefunx float j1f (float @var{x})
@comment math.h
@comment SVID
@deftypefunx {long double} j1l (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@code{j1} returns the Bessel function of the first kind of order 1 of
@var{x}.  It may signal underflow if @var{x} is too large.
@end deftypefun

@comment math.h
@comment SVID
@deftypefun double jn (int @var{n}, double @var{x})
@comment math.h
@comment SVID
@deftypefunx float jnf (int @var{n}, float @var{x})
@comment math.h
@comment SVID
@deftypefunx {long double} jnl (int @var{n}, long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@code{jn} returns the Bessel function of the first kind of order
@var{n} of @var{x}.  It may signal underflow if @var{x} is too large.
@end deftypefun

@comment math.h
@comment SVID
@deftypefun double y0 (double @var{x})
@comment math.h
@comment SVID
@deftypefunx float y0f (float @var{x})
@comment math.h
@comment SVID
@deftypefunx {long double} y0l (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@code{y0} returns the Bessel function of the second kind of order 0 of
@var{x}.  It may signal underflow if @var{x} is too large.  If @var{x}
is negative, @code{y0} signals a domain error; if it is zero,
@code{y0} signals overflow and returns @math{-@infinity}.
@end deftypefun

@comment math.h
@comment SVID
@deftypefun double y1 (double @var{x})
@comment math.h
@comment SVID
@deftypefunx float y1f (float @var{x})
@comment math.h
@comment SVID
@deftypefunx {long double} y1l (long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@code{y1} returns the Bessel function of the second kind of order 1 of
@var{x}.  It may signal underflow if @var{x} is too large.  If @var{x}
is negative, @code{y1} signals a domain error; if it is zero,
@code{y1} signals overflow and returns @math{-@infinity}.
@end deftypefun

@comment math.h
@comment SVID
@deftypefun double yn (int @var{n}, double @var{x})
@comment math.h
@comment SVID
@deftypefunx float ynf (int @var{n}, float @var{x})
@comment math.h
@comment SVID
@deftypefunx {long double} ynl (int @var{n}, long double @var{x})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@code{yn} returns the Bessel function of the second kind of order @var{n} of
@var{x}.  It may signal underflow if @var{x} is too large.  If @var{x}
is negative, @code{yn} signals a domain error; if it is zero,
@code{yn} signals overflow and returns @math{-@infinity}.
@end deftypefun

@node Errors in Math Functions
@section Known Maximum Errors in Math Functions
@cindex math errors
@cindex ulps

This section lists the known errors of the functions in the math
library.  Errors are measured in ``units of the last place''.  This is a
measure for the relative error.  For a number @math{z} with the
representation @math{d.d@dots{}d@mul{}2^e} (we assume IEEE
floating-point numbers with base 2) the ULP is represented by

@tex
$${|d.d\dots d - (z/2^e)|}\over {2^{p-1}}$$
@end tex
@ifnottex
@smallexample
|d.d...d - (z / 2^e)| / 2^(p - 1)
@end smallexample
@end ifnottex

@noindent
where @math{p} is the number of bits in the mantissa of the
floating-point number representation.  Ideally the error for all
functions is always less than 0.5ulps in round-to-nearest mode.  Using
rounding bits this is also
possible and normally implemented for the basic operations.  Except
for certain functions such as @code{sqrt}, @code{fma} and @code{rint}
whose results are fully specified by reference to corresponding IEEE
754 floating-point operations, and conversions between strings and
floating point, @theglibc{} does not aim for correctly rounded results
for functions in the math library, and does not aim for correctness in
whether ``inexact'' exceptions are raised.  Instead, the goals for
accuracy of functions without fully specified results are as follows;
some functions have bugs meaning they do not meet these goals in all
cases.  In future, @theglibc{} may provide some other correctly
rounding functions under the names such as @code{crsin} proposed for
an extension to ISO C.

@itemize @bullet

@item
Each function with a floating-point result behaves as if it computes
an infinite-precision result that is within a few ulp (in both real
and complex parts, for functions with complex results) of the
mathematically correct value of the function (interpreted together
with ISO C or POSIX semantics for the function in question) at the
exact value passed as the input.  Exceptions are raised appropriately
for this value and in accordance with IEEE 754 / ISO C / POSIX
semantics, and it is then rounded according to the current rounding
direction to the result that is returned to the user.  @code{errno}
may also be set (@pxref{Math Error Reporting}).

@item
For the IBM @code{long double} format, as used on PowerPC GNU/Linux,
the accuracy goal is weaker for input values not exactly representable
in 106 bits of precision; it is as if the input value is some value
within 0.5ulp of the value actually passed, where ``ulp'' is
interpreted in terms of a fixed-precision 106-bit mantissa, but not
necessarily the exact value actually passed with discontiguous
mantissa bits.

@item
Functions behave as if the infinite-precision result computed is zero,
infinity or NaN if and only if that is the mathematically correct
infinite-precision result.  They behave as if the infinite-precision
result computed always has the same sign as the mathematically correct
result.

@item
If the mathematical result is more than a few ulp above the overflow
threshold for the current rounding direction, the value returned is
the appropriate overflow value for the current rounding direction,
with the overflow exception raised.

@item
If the mathematical result has magnitude well below half the least
subnormal magnitude, the returned value is either zero or the least
subnormal (in each case, with the correct sign), according to the
current rounding direction and with the underflow exception raised.

@item
Where the mathematical result underflows and is not exactly
representable as a floating-point value, the underflow exception is
raised (so there may be spurious underflow exceptions in cases where
the underflowing result is exact, but not missing underflow exceptions
in cases where it is inexact).

@item
@Theglibc{} does not aim for functions to satisfy other properties of
the underlying mathematical function, such as monotonicity, where not
implied by the above goals.

@item
All the above applies to both real and complex parts, for complex
functions.

@end itemize

Therefore many of the functions in the math library have errors.  The
table lists the maximum error for each function which is exposed by one
of the existing tests in the test suite.  The table tries to cover as much
as possible and list the actual maximum error (or at least a ballpark
figure) but this is often not achieved due to the large search space.

The table lists the ULP values for different architectures.  Different
architectures have different results since their hardware support for
floating-point operations varies and also the existing hardware support
is different.

@page
@c This multitable does not fit on a single page
@include libm-err.texi

@node Pseudo-Random Numbers
@section Pseudo-Random Numbers
@cindex random numbers
@cindex pseudo-random numbers
@cindex seed (for random numbers)

This section describes the GNU facilities for generating a series of
pseudo-random numbers.  The numbers generated are not truly random;
typically, they form a sequence that repeats periodically, with a period
so large that you can ignore it for ordinary purposes.  The random
number generator works by remembering a @dfn{seed} value which it uses
to compute the next random number and also to compute a new seed.

Although the generated numbers look unpredictable within one run of a
program, the sequence of numbers is @emph{exactly the same} from one run
to the next.  This is because the initial seed is always the same.  This
is convenient when you are debugging a program, but it is unhelpful if
you want the program to behave unpredictably.  If you want a different
pseudo-random series each time your program runs, you must specify a
different seed each time.  For ordinary purposes, basing the seed on the
current time works well.

You can obtain repeatable sequences of numbers on a particular machine type
by specifying the same initial seed value for the random number
generator.  There is no standard meaning for a particular seed value;
the same seed, used in different C libraries or on different CPU types,
will give you different random numbers.

@Theglibc{} supports the standard @w{ISO C} random number functions
plus two other sets derived from BSD and SVID.  The BSD and @w{ISO C}
functions provide identical, somewhat limited functionality.  If only a
small number of random bits are required, we recommend you use the
@w{ISO C} interface, @code{rand} and @code{srand}.  The SVID functions
provide a more flexible interface, which allows better random number
generator algorithms, provides more random bits (up to 48) per call, and
can provide random floating-point numbers.  These functions are required
by the XPG standard and therefore will be present in all modern Unix
systems.

@menu
* ISO Random::                  @code{rand} and friends.
* BSD Random::                  @code{random} and friends.
* SVID Random::                 @code{drand48} and friends.
@end menu

@node ISO Random
@subsection ISO C Random Number Functions

This section describes the random number functions that are part of
the @w{ISO C} standard.

To use these facilities, you should include the header file
@file{stdlib.h} in your program.
@pindex stdlib.h

@comment stdlib.h
@comment ISO
@deftypevr Macro int RAND_MAX
The value of this macro is an integer constant representing the largest
value the @code{rand} function can return.  In @theglibc{}, it is
@code{2147483647}, which is the largest signed integer representable in
32 bits.  In other libraries, it may be as low as @code{32767}.
@end deftypevr

@comment stdlib.h
@comment ISO
@deftypefun int rand (void)
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
@c Just calls random.
The @code{rand} function returns the next pseudo-random number in the
series.  The value ranges from @code{0} to @code{RAND_MAX}.
@end deftypefun

@comment stdlib.h
@comment ISO
@deftypefun void srand (unsigned int @var{seed})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
@c Alias to srandom.
This function establishes @var{seed} as the seed for a new series of
pseudo-random numbers.  If you call @code{rand} before a seed has been
established with @code{srand}, it uses the value @code{1} as a default
seed.

To produce a different pseudo-random series each time your program is
run, do @code{srand (time (0))}.
@end deftypefun

POSIX.1 extended the C standard functions to support reproducible random
numbers in multi-threaded programs.  However, the extension is badly
designed and unsuitable for serious work.

@comment stdlib.h
@comment POSIX.1
@deftypefun int rand_r (unsigned int *@var{seed})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function returns a random number in the range 0 to @code{RAND_MAX}
just as @code{rand} does.  However, all its state is stored in the
@var{seed} argument.  This means the RNG's state can only have as many
bits as the type @code{unsigned int} has.  This is far too few to
provide a good RNG.

If your program requires a reentrant RNG, we recommend you use the
reentrant GNU extensions to the SVID random number generator.  The
POSIX.1 interface should only be used when the GNU extensions are not
available.
@end deftypefun


@node BSD Random
@subsection BSD Random Number Functions

This section describes a set of random number generation functions that
are derived from BSD.  There is no advantage to using these functions
with @theglibc{}; we support them for BSD compatibility only.

The prototypes for these functions are in @file{stdlib.h}.
@pindex stdlib.h

@comment stdlib.h
@comment BSD
@deftypefun {long int} random (void)
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
@c Takes a lock and calls random_r with an automatic variable and the
@c global state, while holding a lock.
This function returns the next pseudo-random number in the sequence.
The value returned ranges from @code{0} to @code{2147483647}.

@strong{NB:} Temporarily this function was defined to return a
@code{int32_t} value to indicate that the return value always contains
32 bits even if @code{long int} is wider.  The standard demands it
differently.  Users must always be aware of the 32-bit limitation,
though.
@end deftypefun

@comment stdlib.h
@comment BSD
@deftypefun void srandom (unsigned int @var{seed})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
@c Takes a lock and calls srandom_r with an automatic variable and a
@c static buffer.  There's no MT-safety issue because the static buffer
@c is internally protected by a lock, although other threads may modify
@c the set state before it is used.
The @code{srandom} function sets the state of the random number
generator based on the integer @var{seed}.  If you supply a @var{seed} value
of @code{1}, this will cause @code{random} to reproduce the default set
of random numbers.

To produce a different set of pseudo-random numbers each time your
program runs, do @code{srandom (time (0))}.
@end deftypefun

@comment stdlib.h
@comment BSD
@deftypefun {char *} initstate (unsigned int @var{seed}, char *@var{state}, size_t @var{size})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
The @code{initstate} function is used to initialize the random number
generator state.  The argument @var{state} is an array of @var{size}
bytes, used to hold the state information.  It is initialized based on
@var{seed}.  The size must be between 8 and 256 bytes, and should be a
power of two.  The bigger the @var{state} array, the better.

The return value is the previous value of the state information array.
You can use this value later as an argument to @code{setstate} to
restore that state.
@end deftypefun

@comment stdlib.h
@comment BSD
@deftypefun {char *} setstate (char *@var{state})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
The @code{setstate} function restores the random number state
information @var{state}.  The argument must have been the result of
a previous call to @var{initstate} or @var{setstate}.

The return value is the previous value of the state information array.
You can use this value later as an argument to @code{setstate} to
restore that state.

If the function fails the return value is @code{NULL}.
@end deftypefun

The four functions described so far in this section all work on a state
which is shared by all threads.  The state is not directly accessible to
the user and can only be modified by these functions.  This makes it
hard to deal with situations where each thread should have its own
pseudo-random number generator.

@Theglibc{} contains four additional functions which contain the
state as an explicit parameter and therefore make it possible to handle
thread-local PRNGs.  Beside this there is no difference.  In fact, the
four functions already discussed are implemented internally using the
following interfaces.

The @file{stdlib.h} header contains a definition of the following type:

@comment stdlib.h
@comment GNU
@deftp {Data Type} {struct random_data}

Objects of type @code{struct random_data} contain the information
necessary to represent the state of the PRNG.  Although a complete
definition of the type is present the type should be treated as opaque.
@end deftp

The functions modifying the state follow exactly the already described
functions.

@comment stdlib.h
@comment GNU
@deftypefun int random_r (struct random_data *restrict @var{buf}, int32_t *restrict @var{result})
@safety{@prelim{}@mtsafe{@mtsrace{:buf}}@assafe{}@acunsafe{@acucorrupt{}}}
The @code{random_r} function behaves exactly like the @code{random}
function except that it uses and modifies the state in the object
pointed to by the first parameter instead of the global state.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun int srandom_r (unsigned int @var{seed}, struct random_data *@var{buf})
@safety{@prelim{}@mtsafe{@mtsrace{:buf}}@assafe{}@acunsafe{@acucorrupt{}}}
The @code{srandom_r} function behaves exactly like the @code{srandom}
function except that it uses and modifies the state in the object
pointed to by the second parameter instead of the global state.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun int initstate_r (unsigned int @var{seed}, char *restrict @var{statebuf}, size_t @var{statelen}, struct random_data *restrict @var{buf})
@safety{@prelim{}@mtsafe{@mtsrace{:buf}}@assafe{}@acunsafe{@acucorrupt{}}}
The @code{initstate_r} function behaves exactly like the @code{initstate}
function except that it uses and modifies the state in the object
pointed to by the fourth parameter instead of the global state.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun int setstate_r (char *restrict @var{statebuf}, struct random_data *restrict @var{buf})
@safety{@prelim{}@mtsafe{@mtsrace{:buf}}@assafe{}@acunsafe{@acucorrupt{}}}
The @code{setstate_r} function behaves exactly like the @code{setstate}
function except that it uses and modifies the state in the object
pointed to by the first parameter instead of the global state.
@end deftypefun

@node SVID Random
@subsection SVID Random Number Function

The C library on SVID systems contains yet another kind of random number
generator functions.  They use a state of 48 bits of data.  The user can
choose among a collection of functions which return the random bits
in different forms.

Generally there are two kinds of function.  The first uses a state of
the random number generator which is shared among several functions and
by all threads of the process.  The second requires the user to handle
the state.

All functions have in common that they use the same congruential
formula with the same constants.  The formula is

@smallexample
Y = (a * X + c) mod m
@end smallexample

@noindent
where @var{X} is the state of the generator at the beginning and
@var{Y} the state at the end.  @code{a} and @code{c} are constants
determining the way the generator works.  By default they are

@smallexample
a = 0x5DEECE66D = 25214903917
c = 0xb = 11
@end smallexample

@noindent
but they can also be changed by the user.  @code{m} is of course 2^48
since the state consists of a 48-bit array.

The prototypes for these functions are in @file{stdlib.h}.
@pindex stdlib.h


@comment stdlib.h
@comment SVID
@deftypefun double drand48 (void)
@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
@c Uses of the static state buffer are not guarded by a lock (thus
@c @mtasurace:drand48), so they may be found or left at a
@c partially-updated state in case of calls from within signal handlers
@c or cancellation.  None of this will break safety rules or invoke
@c undefined behavior, but it may affect randomness.
This function returns a @code{double} value in the range of @code{0.0}
to @code{1.0} (exclusive).  The random bits are determined by the global
state of the random number generator in the C library.

Since the @code{double} type according to @w{IEEE 754} has a 52-bit
mantissa this means 4 bits are not initialized by the random number
generator.  These are (of course) chosen to be the least significant
bits and they are initialized to @code{0}.
@end deftypefun

@comment stdlib.h
@comment SVID
@deftypefun double erand48 (unsigned short int @var{xsubi}[3])
@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
@c The static buffer is just initialized with default parameters, which
@c are later read to advance the state held in xsubi.
This function returns a @code{double} value in the range of @code{0.0}
to @code{1.0} (exclusive), similarly to @code{drand48}.  The argument is
an array describing the state of the random number generator.

This function can be called subsequently since it updates the array to
guarantee random numbers.  The array should have been initialized before
initial use to obtain reproducible results.
@end deftypefun

@comment stdlib.h
@comment SVID
@deftypefun {long int} lrand48 (void)
@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
The @code{lrand48} function returns an integer value in the range of
@code{0} to @code{2^31} (exclusive).  Even if the size of the @code{long
int} type can take more than 32 bits, no higher numbers are returned.
The random bits are determined by the global state of the random number
generator in the C library.
@end deftypefun

@comment stdlib.h
@comment SVID
@deftypefun {long int} nrand48 (unsigned short int @var{xsubi}[3])
@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
This function is similar to the @code{lrand48} function in that it
returns a number in the range of @code{0} to @code{2^31} (exclusive) but
the state of the random number generator used to produce the random bits
is determined by the array provided as the parameter to the function.

The numbers in the array are updated afterwards so that subsequent calls
to this function yield different results (as is expected of a random
number generator).  The array should have been initialized before the
first call to obtain reproducible results.
@end deftypefun

@comment stdlib.h
@comment SVID
@deftypefun {long int} mrand48 (void)
@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
The @code{mrand48} function is similar to @code{lrand48}.  The only
difference is that the numbers returned are in the range @code{-2^31} to
@code{2^31} (exclusive).
@end deftypefun

@comment stdlib.h
@comment SVID
@deftypefun {long int} jrand48 (unsigned short int @var{xsubi}[3])
@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
The @code{jrand48} function is similar to @code{nrand48}.  The only
difference is that the numbers returned are in the range @code{-2^31} to
@code{2^31} (exclusive).  For the @code{xsubi} parameter the same
requirements are necessary.
@end deftypefun

The internal state of the random number generator can be initialized in
several ways.  The methods differ in the completeness of the
information provided.

@comment stdlib.h
@comment SVID
@deftypefun void srand48 (long int @var{seedval})
@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
The @code{srand48} function sets the most significant 32 bits of the
internal state of the random number generator to the least
significant 32 bits of the @var{seedval} parameter.  The lower 16 bits
are initialized to the value @code{0x330E}.  Even if the @code{long
int} type contains more than 32 bits only the lower 32 bits are used.

Owing to this limitation, initialization of the state of this
function is not very useful.  But it makes it easy to use a construct
like @code{srand48 (time (0))}.

A side-effect of this function is that the values @code{a} and @code{c}
from the internal state, which are used in the congruential formula,
are reset to the default values given above.  This is of importance once
the user has called the @code{lcong48} function (see below).
@end deftypefun

@comment stdlib.h
@comment SVID
@deftypefun {unsigned short int *} seed48 (unsigned short int @var{seed16v}[3])
@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
The @code{seed48} function initializes all 48 bits of the state of the
internal random number generator from the contents of the parameter
@var{seed16v}.  Here the lower 16 bits of the first element of
@var{see16v} initialize the least significant 16 bits of the internal
state, the lower 16 bits of @code{@var{seed16v}[1]} initialize the mid-order
16 bits of the state and the 16 lower bits of @code{@var{seed16v}[2]}
initialize the most significant 16 bits of the state.

Unlike @code{srand48} this function lets the user initialize all 48 bits
of the state.

The value returned by @code{seed48} is a pointer to an array containing
the values of the internal state before the change.  This might be
useful to restart the random number generator at a certain state.
Otherwise the value can simply be ignored.

As for @code{srand48}, the values @code{a} and @code{c} from the
congruential formula are reset to the default values.
@end deftypefun

There is one more function to initialize the random number generator
which enables you to specify even more information by allowing you to
change the parameters in the congruential formula.

@comment stdlib.h
@comment SVID
@deftypefun void lcong48 (unsigned short int @var{param}[7])
@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
The @code{lcong48} function allows the user to change the complete state
of the random number generator.  Unlike @code{srand48} and
@code{seed48}, this function also changes the constants in the
congruential formula.

From the seven elements in the array @var{param} the least significant
16 bits of the entries @code{@var{param}[0]} to @code{@var{param}[2]}
determine the initial state, the least significant 16 bits of
@code{@var{param}[3]} to @code{@var{param}[5]} determine the 48 bit
constant @code{a} and @code{@var{param}[6]} determines the 16-bit value
@code{c}.
@end deftypefun

All the above functions have in common that they use the global
parameters for the congruential formula.  In multi-threaded programs it
might sometimes be useful to have different parameters in different
threads.  For this reason all the above functions have a counterpart
which works on a description of the random number generator in the
user-supplied buffer instead of the global state.

Please note that it is no problem if several threads use the global
state if all threads use the functions which take a pointer to an array
containing the state.  The random numbers are computed following the
same loop but if the state in the array is different all threads will
obtain an individual random number generator.

The user-supplied buffer must be of type @code{struct drand48_data}.
This type should be regarded as opaque and not manipulated directly.

@comment stdlib.h
@comment GNU
@deftypefun int drand48_r (struct drand48_data *@var{buffer}, double *@var{result})
@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
This function is equivalent to the @code{drand48} function with the
difference that it does not modify the global random number generator
parameters but instead the parameters in the buffer supplied through the
pointer @var{buffer}.  The random number is returned in the variable
pointed to by @var{result}.

The return value of the function indicates whether the call succeeded.
If the value is less than @code{0} an error occurred and @var{errno} is
set to indicate the problem.

This function is a GNU extension and should not be used in portable
programs.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun int erand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, double *@var{result})
@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
The @code{erand48_r} function works like @code{erand48}, but in addition
it takes an argument @var{buffer} which describes the random number
generator.  The state of the random number generator is taken from the
@code{xsubi} array, the parameters for the congruential formula from the
global random number generator data.  The random number is returned in
the variable pointed to by @var{result}.

The return value is non-negative if the call succeeded.

This function is a GNU extension and should not be used in portable
programs.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun int lrand48_r (struct drand48_data *@var{buffer}, long int *@var{result})
@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
This function is similar to @code{lrand48}, but in addition it takes a
pointer to a buffer describing the state of the random number generator
just like @code{drand48}.

If the return value of the function is non-negative the variable pointed
to by @var{result} contains the result.  Otherwise an error occurred.

This function is a GNU extension and should not be used in portable
programs.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun int nrand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, long int *@var{result})
@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
The @code{nrand48_r} function works like @code{nrand48} in that it
produces a random number in the range @code{0} to @code{2^31}.  But instead
of using the global parameters for the congruential formula it uses the
information from the buffer pointed to by @var{buffer}.  The state is
described by the values in @var{xsubi}.

If the return value is non-negative the variable pointed to by
@var{result} contains the result.

This function is a GNU extension and should not be used in portable
programs.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun int mrand48_r (struct drand48_data *@var{buffer}, long int *@var{result})
@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
This function is similar to @code{mrand48} but like the other reentrant
functions it uses the random number generator described by the value in
the buffer pointed to by @var{buffer}.

If the return value is non-negative the variable pointed to by
@var{result} contains the result.

This function is a GNU extension and should not be used in portable
programs.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun int jrand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, long int *@var{result})
@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
The @code{jrand48_r} function is similar to @code{jrand48}.  Like the
other reentrant functions of this function family it uses the
congruential formula parameters from the buffer pointed to by
@var{buffer}.

If the return value is non-negative the variable pointed to by
@var{result} contains the result.

This function is a GNU extension and should not be used in portable
programs.
@end deftypefun

Before any of the above functions are used the buffer of type
@code{struct drand48_data} should be initialized.  The easiest way to do
this is to fill the whole buffer with null bytes, e.g. by

@smallexample
memset (buffer, '\0', sizeof (struct drand48_data));
@end smallexample

@noindent
Using any of the reentrant functions of this family now will
automatically initialize the random number generator to the default
values for the state and the parameters of the congruential formula.

The other possibility is to use any of the functions which explicitly
initialize the buffer.  Though it might be obvious how to initialize the
buffer from looking at the parameter to the function, it is highly
recommended to use these functions since the result might not always be
what you expect.

@comment stdlib.h
@comment GNU
@deftypefun int srand48_r (long int @var{seedval}, struct drand48_data *@var{buffer})
@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
The description of the random number generator represented by the
information in @var{buffer} is initialized similarly to what the function
@code{srand48} does.  The state is initialized from the parameter
@var{seedval} and the parameters for the congruential formula are
initialized to their default values.

If the return value is non-negative the function call succeeded.

This function is a GNU extension and should not be used in portable
programs.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun int seed48_r (unsigned short int @var{seed16v}[3], struct drand48_data *@var{buffer})
@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
This function is similar to @code{srand48_r} but like @code{seed48} it
initializes all 48 bits of the state from the parameter @var{seed16v}.

If the return value is non-negative the function call succeeded.  It
does not return a pointer to the previous state of the random number
generator like the @code{seed48} function does.  If the user wants to
preserve the state for a later re-run s/he can copy the whole buffer
pointed to by @var{buffer}.

This function is a GNU extension and should not be used in portable
programs.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun int lcong48_r (unsigned short int @var{param}[7], struct drand48_data *@var{buffer})
@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
This function initializes all aspects of the random number generator
described in @var{buffer} with the data in @var{param}.  Here it is
especially true that the function does more than just copying the
contents of @var{param} and @var{buffer}.  More work is required and
therefore it is important to use this function rather than initializing
the random number generator directly.

If the return value is non-negative the function call succeeded.

This function is a GNU extension and should not be used in portable
programs.
@end deftypefun

@node FP Function Optimizations
@section Is Fast Code or Small Code preferred?
@cindex Optimization

If an application uses many floating point functions it is often the case
that the cost of the function calls themselves is not negligible.
Modern processors can often execute the operations themselves
very fast, but the function call disrupts the instruction pipeline.

For this reason @theglibc{} provides optimizations for many of the
frequently-used math functions.  When GNU CC is used and the user
activates the optimizer, several new inline functions and macros are
defined.  These new functions and macros have the same names as the
library functions and so are used instead of the latter.  In the case of
inline functions the compiler will decide whether it is reasonable to
use them, and this decision is usually correct.

This means that no calls to the library functions may be necessary, and
can increase the speed of generated code significantly.  The drawback is
that code size will increase, and the increase is not always negligible.

There are two kind of inline functions: Those that give the same result
as the library functions and others that might not set @code{errno} and
might have a reduced precision and/or argument range in comparison with
the library functions.  The latter inline functions are only available
if the flag @code{-ffast-math} is given to GNU CC.

In cases where the inline functions and macros are not wanted the symbol
@code{__NO_MATH_INLINES} should be defined before any system header is
included.  This will ensure that only library functions are used.  Of
course, it can be determined for each file in the project whether
giving this option is preferable or not.

Not all hardware implements the entire @w{IEEE 754} standard, and even
if it does there may be a substantial performance penalty for using some
of its features.  For example, enabling traps on some processors forces
the FPU to run un-pipelined, which can more than double calculation time.
@c ***Add explanation of -lieee, -mieee.
