]> git.ipfire.org Git - thirdparty/glibc.git/blame - manual/math.texi
Update.
[thirdparty/glibc.git] / manual / math.texi
CommitLineData
55c14926 1@c We need some definitions here.
7a68c94a 2@ifclear mult
55c14926 3@ifhtml
7a68c94a
UD
4@set mult ·
5@set infty ∞
6@set pie π
55c14926 7@end ifhtml
ca34d7a7 8@iftex
838e5ffe 9@set mult @cdot
7a68c94a 10@set infty @infty
ca34d7a7 11@end iftex
838e5ffe 12@ifclear mult
7a68c94a
UD
13@set mult *
14@set infty oo
15@set pie pi
838e5ffe 16@end ifclear
fe0ec73e 17@macro mul
838e5ffe 18@value{mult}
fe0ec73e 19@end macro
ca34d7a7
UD
20@macro infinity
21@value{infty}
22@end macro
7a68c94a
UD
23@ifnottex
24@macro pi
25@value{pie}
26@end macro
27@end ifnottex
28@end ifclear
55c14926 29
28f540f4 30@node Mathematics, Arithmetic, Low-Level Terminal Interface, Top
7a68c94a 31@c %MENU% Math functions, useful constants, random numbers
28f540f4
RM
32@chapter Mathematics
33
34This chapter contains information about functions for performing
35mathematical computations, such as trigonometric functions. Most of
36these functions have prototypes declared in the header file
7a68c94a
UD
37@file{math.h}. The complex-valued functions are defined in
38@file{complex.h}.
28f540f4 39@pindex math.h
7a68c94a
UD
40@pindex complex.h
41
42All mathematical functions which take a floating-point argument
43have three variants, one each for @code{double}, @code{float}, and
44@code{long double} arguments. The @code{double} versions are mostly
ec751a23
UD
45defined in @w{ISO C89}. The @code{float} and @code{long double}
46versions are from the numeric extensions to C included in @w{ISO C99}.
7a68c94a
UD
47
48Which of the three versions of a function should be used depends on the
49situation. For most calculations, the @code{float} functions are the
50fastest. On the other hand, the @code{long double} functions have the
51highest precision. @code{double} is somewhere in between. It is
04b9968b 52usually wise to pick the narrowest type that can accommodate your data.
7a68c94a
UD
53Not all machines have a distinct @code{long double} type; it may be the
54same as @code{double}.
28f540f4
RM
55
56@menu
7a68c94a
UD
57* Mathematical Constants:: Precise numeric values for often-used
58 constants.
59* Trig Functions:: Sine, cosine, tangent, and friends.
60* Inverse Trig Functions:: Arcsine, arccosine, etc.
61* Exponents and Logarithms:: Also pow and sqrt.
62* Hyperbolic Functions:: sinh, cosh, tanh, etc.
63* Special Functions:: Bessel, gamma, erf.
aaa1276e 64* Errors in Math Functions:: Known Maximum Errors in Math Functions.
7a68c94a
UD
65* Pseudo-Random Numbers:: Functions for generating pseudo-random
66 numbers.
67* FP Function Optimizations:: Fast code or small code.
28f540f4
RM
68@end menu
69
55c14926
UD
70@node Mathematical Constants
71@section Predefined Mathematical Constants
72@cindex constants
73@cindex mathematical constants
74
7a68c94a
UD
75The header @file{math.h} defines several useful mathematical constants.
76All values are defined as preprocessor macros starting with @code{M_}.
77The values provided are:
55c14926
UD
78
79@vtable @code
80@item M_E
7a68c94a 81The base of natural logarithms.
55c14926 82@item M_LOG2E
7a68c94a 83The logarithm to base @code{2} of @code{M_E}.
55c14926 84@item M_LOG10E
7a68c94a 85The logarithm to base @code{10} of @code{M_E}.
55c14926 86@item M_LN2
7a68c94a 87The natural logarithm of @code{2}.
55c14926 88@item M_LN10
7a68c94a 89The natural logarithm of @code{10}.
55c14926 90@item M_PI
04b9968b 91Pi, the ratio of a circle's circumference to its diameter.
55c14926 92@item M_PI_2
7a68c94a 93Pi divided by two.
55c14926 94@item M_PI_4
7a68c94a 95Pi divided by four.
55c14926 96@item M_1_PI
7a68c94a 97The reciprocal of pi (1/pi)
55c14926 98@item M_2_PI
7a68c94a 99Two times the reciprocal of pi.
55c14926 100@item M_2_SQRTPI
7a68c94a 101Two times the reciprocal of the square root of pi.
55c14926 102@item M_SQRT2
7a68c94a 103The square root of two.
55c14926 104@item M_SQRT1_2
7a68c94a 105The reciprocal of the square root of two (also the square root of 1/2).
55c14926
UD
106@end vtable
107
7a68c94a 108These constants come from the Unix98 standard and were also available in
04b9968b 1094.4BSD; therefore they are only defined if @code{_BSD_SOURCE} or
7a68c94a
UD
110@code{_XOPEN_SOURCE=500}, or a more general feature select macro, is
111defined. The default set of features includes these constants.
112@xref{Feature Test Macros}.
113
114All values are of type @code{double}. As an extension, the GNU C
115library also defines these constants with type @code{long double}. The
116@code{long double} macros have a lowercase @samp{l} appended to their
117names: @code{M_El}, @code{M_PIl}, and so forth. These are only
118available if @code{_GNU_SOURCE} is defined.
55c14926
UD
119
120@vindex PI
121@emph{Note:} Some programs use a constant named @code{PI} which has the
7a68c94a
UD
122same value as @code{M_PI}. This constant is not standard; it may have
123appeared in some old AT&T headers, and is mentioned in Stroustrup's book
124on C++. It infringes on the user's name space, so the GNU C library
125does not define it. Fixing programs written to expect it is simple:
126replace @code{PI} with @code{M_PI} throughout, or put @samp{-DPI=M_PI}
127on the compiler command line.
61eb22d3 128
28f540f4
RM
129@node Trig Functions
130@section Trigonometric Functions
131@cindex trigonometric functions
132
133These are the familiar @code{sin}, @code{cos}, and @code{tan} functions.
134The arguments to all of these functions are in units of radians; recall
135that pi radians equals 180 degrees.
136
137@cindex pi (trigonometric constant)
7a68c94a
UD
138The math library normally defines @code{M_PI} to a @code{double}
139approximation of pi. If strict ISO and/or POSIX compliance
140are requested this constant is not defined, but you can easily define it
141yourself:
28f540f4
RM
142
143@smallexample
b4012b75 144#define M_PI 3.14159265358979323846264338327
28f540f4
RM
145@end smallexample
146
147@noindent
148You can also compute the value of pi with the expression @code{acos
149(-1.0)}.
150
28f540f4 151@comment math.h
f65fd747 152@comment ISO
28f540f4 153@deftypefun double sin (double @var{x})
4260bc74
UD
154@comment math.h
155@comment ISO
779ae82e 156@deftypefunx float sinf (float @var{x})
4260bc74
UD
157@comment math.h
158@comment ISO
779ae82e 159@deftypefunx {long double} sinl (long double @var{x})
b4012b75 160These functions return the sine of @var{x}, where @var{x} is given in
28f540f4
RM
161radians. The return value is in the range @code{-1} to @code{1}.
162@end deftypefun
163
164@comment math.h
f65fd747 165@comment ISO
28f540f4 166@deftypefun double cos (double @var{x})
4260bc74
UD
167@comment math.h
168@comment ISO
779ae82e 169@deftypefunx float cosf (float @var{x})
4260bc74
UD
170@comment math.h
171@comment ISO
779ae82e 172@deftypefunx {long double} cosl (long double @var{x})
b4012b75 173These functions return the cosine of @var{x}, where @var{x} is given in
28f540f4
RM
174radians. The return value is in the range @code{-1} to @code{1}.
175@end deftypefun
176
177@comment math.h
f65fd747 178@comment ISO
28f540f4 179@deftypefun double tan (double @var{x})
4260bc74
UD
180@comment math.h
181@comment ISO
779ae82e 182@deftypefunx float tanf (float @var{x})
4260bc74
UD
183@comment math.h
184@comment ISO
779ae82e 185@deftypefunx {long double} tanl (long double @var{x})
b4012b75 186These functions return the tangent of @var{x}, where @var{x} is given in
28f540f4
RM
187radians.
188
28f540f4
RM
189Mathematically, the tangent function has singularities at odd multiples
190of pi/2. If the argument @var{x} is too close to one of these
7a68c94a 191singularities, @code{tan} will signal overflow.
28f540f4
RM
192@end deftypefun
193
7a68c94a
UD
194In many applications where @code{sin} and @code{cos} are used, the sine
195and cosine of the same angle are needed at the same time. It is more
196efficient to compute them simultaneously, so the library provides a
197function to do that.
b4012b75
UD
198
199@comment math.h
200@comment GNU
201@deftypefun void sincos (double @var{x}, double *@var{sinx}, double *@var{cosx})
4260bc74
UD
202@comment math.h
203@comment GNU
779ae82e 204@deftypefunx void sincosf (float @var{x}, float *@var{sinx}, float *@var{cosx})
4260bc74
UD
205@comment math.h
206@comment GNU
779ae82e 207@deftypefunx void sincosl (long double @var{x}, long double *@var{sinx}, long double *@var{cosx})
b4012b75
UD
208These functions return the sine of @var{x} in @code{*@var{sinx}} and the
209cosine of @var{x} in @code{*@var{cos}}, where @var{x} is given in
210radians. Both values, @code{*@var{sinx}} and @code{*@var{cosx}}, are in
211the range of @code{-1} to @code{1}.
ca34d7a7 212
7a68c94a
UD
213This function is a GNU extension. Portable programs should be prepared
214to cope with its absence.
b4012b75
UD
215@end deftypefun
216
217@cindex complex trigonometric functions
218
ec751a23 219@w{ISO C99} defines variants of the trig functions which work on
7a68c94a
UD
220complex numbers. The GNU C library provides these functions, but they
221are only useful if your compiler supports the new complex types defined
222by the standard.
ec751a23 223@c XXX Change this when gcc is fixed. -zw
7a68c94a
UD
224(As of this writing GCC supports complex numbers, but there are bugs in
225the implementation.)
b4012b75
UD
226
227@comment complex.h
228@comment ISO
229@deftypefun {complex double} csin (complex double @var{z})
4260bc74
UD
230@comment complex.h
231@comment ISO
779ae82e 232@deftypefunx {complex float} csinf (complex float @var{z})
4260bc74
UD
233@comment complex.h
234@comment ISO
779ae82e 235@deftypefunx {complex long double} csinl (complex long double @var{z})
7a68c94a 236These functions return the complex sine of @var{z}.
b4012b75
UD
237The mathematical definition of the complex sine is
238
779ae82e
UD
239@ifinfo
240@math{sin (z) = 1/(2*i) * (exp (z*i) - exp (-z*i))}.
241@end ifinfo
779ae82e
UD
242@tex
243$$\sin(z) = {1\over 2i} (e^{zi} - e^{-zi})$$
244@end tex
b4012b75
UD
245@end deftypefun
246
247@comment complex.h
248@comment ISO
249@deftypefun {complex double} ccos (complex double @var{z})
4260bc74
UD
250@comment complex.h
251@comment ISO
779ae82e 252@deftypefunx {complex float} ccosf (complex float @var{z})
4260bc74
UD
253@comment complex.h
254@comment ISO
779ae82e 255@deftypefunx {complex long double} ccosl (complex long double @var{z})
7a68c94a 256These functions return the complex cosine of @var{z}.
b4012b75
UD
257The mathematical definition of the complex cosine is
258
779ae82e
UD
259@ifinfo
260@math{cos (z) = 1/2 * (exp (z*i) + exp (-z*i))}
261@end ifinfo
779ae82e
UD
262@tex
263$$\cos(z) = {1\over 2} (e^{zi} + e^{-zi})$$
264@end tex
b4012b75
UD
265@end deftypefun
266
267@comment complex.h
268@comment ISO
269@deftypefun {complex double} ctan (complex double @var{z})
4260bc74
UD
270@comment complex.h
271@comment ISO
779ae82e 272@deftypefunx {complex float} ctanf (complex float @var{z})
4260bc74
UD
273@comment complex.h
274@comment ISO
779ae82e 275@deftypefunx {complex long double} ctanl (complex long double @var{z})
7a68c94a 276These functions return the complex tangent of @var{z}.
b4012b75
UD
277The mathematical definition of the complex tangent is
278
779ae82e 279@ifinfo
7a68c94a 280@math{tan (z) = -i * (exp (z*i) - exp (-z*i)) / (exp (z*i) + exp (-z*i))}
779ae82e 281@end ifinfo
779ae82e 282@tex
7a68c94a 283$$\tan(z) = -i \cdot {e^{zi} - e^{-zi}\over e^{zi} + e^{-zi}}$$
779ae82e 284@end tex
7a68c94a
UD
285
286@noindent
287The complex tangent has poles at @math{pi/2 + 2n}, where @math{n} is an
288integer. @code{ctan} may signal overflow if @var{z} is too close to a
289pole.
b4012b75
UD
290@end deftypefun
291
28f540f4
RM
292
293@node Inverse Trig Functions
294@section Inverse Trigonometric Functions
6d52618b 295@cindex inverse trigonometric functions
28f540f4
RM
296
297These are the usual arc sine, arc cosine and arc tangent functions,
04b9968b 298which are the inverses of the sine, cosine and tangent functions
28f540f4
RM
299respectively.
300
301@comment math.h
f65fd747 302@comment ISO
28f540f4 303@deftypefun double asin (double @var{x})
4260bc74
UD
304@comment math.h
305@comment ISO
779ae82e 306@deftypefunx float asinf (float @var{x})
4260bc74
UD
307@comment math.h
308@comment ISO
779ae82e 309@deftypefunx {long double} asinl (long double @var{x})
b4012b75 310These functions compute the arc sine of @var{x}---that is, the value whose
28f540f4
RM
311sine is @var{x}. The value is in units of radians. Mathematically,
312there are infinitely many such values; the one actually returned is the
313one between @code{-pi/2} and @code{pi/2} (inclusive).
314
7a68c94a
UD
315The arc sine function is defined mathematically only
316over the domain @code{-1} to @code{1}. If @var{x} is outside the
317domain, @code{asin} signals a domain error.
28f540f4
RM
318@end deftypefun
319
320@comment math.h
f65fd747 321@comment ISO
28f540f4 322@deftypefun double acos (double @var{x})
4260bc74
UD
323@comment math.h
324@comment ISO
779ae82e 325@deftypefunx float acosf (float @var{x})
4260bc74
UD
326@comment math.h
327@comment ISO
779ae82e 328@deftypefunx {long double} acosl (long double @var{x})
b4012b75 329These functions compute the arc cosine of @var{x}---that is, the value
28f540f4
RM
330whose cosine is @var{x}. The value is in units of radians.
331Mathematically, there are infinitely many such values; the one actually
332returned is the one between @code{0} and @code{pi} (inclusive).
333
7a68c94a
UD
334The arc cosine function is defined mathematically only
335over the domain @code{-1} to @code{1}. If @var{x} is outside the
336domain, @code{acos} signals a domain error.
28f540f4
RM
337@end deftypefun
338
28f540f4 339@comment math.h
f65fd747 340@comment ISO
28f540f4 341@deftypefun double atan (double @var{x})
4260bc74
UD
342@comment math.h
343@comment ISO
779ae82e 344@deftypefunx float atanf (float @var{x})
4260bc74
UD
345@comment math.h
346@comment ISO
779ae82e 347@deftypefunx {long double} atanl (long double @var{x})
b4012b75 348These functions compute the arc tangent of @var{x}---that is, the value
28f540f4
RM
349whose tangent is @var{x}. The value is in units of radians.
350Mathematically, there are infinitely many such values; the one actually
7a68c94a 351returned is the one between @code{-pi/2} and @code{pi/2} (inclusive).
28f540f4
RM
352@end deftypefun
353
354@comment math.h
f65fd747 355@comment ISO
28f540f4 356@deftypefun double atan2 (double @var{y}, double @var{x})
4260bc74
UD
357@comment math.h
358@comment ISO
779ae82e 359@deftypefunx float atan2f (float @var{y}, float @var{x})
4260bc74
UD
360@comment math.h
361@comment ISO
779ae82e 362@deftypefunx {long double} atan2l (long double @var{y}, long double @var{x})
7a68c94a
UD
363This function computes the arc tangent of @var{y}/@var{x}, but the signs
364of both arguments are used to determine the quadrant of the result, and
365@var{x} is permitted to be zero. The return value is given in radians
366and is in the range @code{-pi} to @code{pi}, inclusive.
28f540f4
RM
367
368If @var{x} and @var{y} are coordinates of a point in the plane,
369@code{atan2} returns the signed angle between the line from the origin
370to that point and the x-axis. Thus, @code{atan2} is useful for
371converting Cartesian coordinates to polar coordinates. (To compute the
372radial coordinate, use @code{hypot}; see @ref{Exponents and
373Logarithms}.)
374
7a68c94a
UD
375@c This is experimentally true. Should it be so? -zw
376If both @var{x} and @var{y} are zero, @code{atan2} returns zero.
28f540f4
RM
377@end deftypefun
378
b4012b75 379@cindex inverse complex trigonometric functions
ec751a23 380@w{ISO C99} defines complex versions of the inverse trig functions.
b4012b75
UD
381
382@comment complex.h
383@comment ISO
384@deftypefun {complex double} casin (complex double @var{z})
4260bc74
UD
385@comment complex.h
386@comment ISO
779ae82e 387@deftypefunx {complex float} casinf (complex float @var{z})
4260bc74
UD
388@comment complex.h
389@comment ISO
779ae82e 390@deftypefunx {complex long double} casinl (complex long double @var{z})
b4012b75 391These functions compute the complex arc sine of @var{z}---that is, the
7a68c94a 392value whose sine is @var{z}. The value returned is in radians.
b4012b75 393
7a68c94a
UD
394Unlike the real-valued functions, @code{casin} is defined for all
395values of @var{z}.
b4012b75
UD
396@end deftypefun
397
398@comment complex.h
399@comment ISO
400@deftypefun {complex double} cacos (complex double @var{z})
4260bc74
UD
401@comment complex.h
402@comment ISO
779ae82e 403@deftypefunx {complex float} cacosf (complex float @var{z})
4260bc74
UD
404@comment complex.h
405@comment ISO
779ae82e 406@deftypefunx {complex long double} cacosl (complex long double @var{z})
b4012b75 407These functions compute the complex arc cosine of @var{z}---that is, the
7a68c94a 408value whose cosine is @var{z}. The value returned is in radians.
b4012b75 409
7a68c94a
UD
410Unlike the real-valued functions, @code{cacos} is defined for all
411values of @var{z}.
b4012b75
UD
412@end deftypefun
413
414
415@comment complex.h
416@comment ISO
417@deftypefun {complex double} catan (complex double @var{z})
4260bc74
UD
418@comment complex.h
419@comment ISO
779ae82e 420@deftypefunx {complex float} catanf (complex float @var{z})
4260bc74
UD
421@comment complex.h
422@comment ISO
779ae82e 423@deftypefunx {complex long double} catanl (complex long double @var{z})
b4012b75
UD
424These functions compute the complex arc tangent of @var{z}---that is,
425the value whose tangent is @var{z}. The value is in units of radians.
426@end deftypefun
427
28f540f4
RM
428
429@node Exponents and Logarithms
430@section Exponentiation and Logarithms
431@cindex exponentiation functions
432@cindex power functions
433@cindex logarithm functions
434
435@comment math.h
f65fd747 436@comment ISO
28f540f4 437@deftypefun double exp (double @var{x})
4260bc74
UD
438@comment math.h
439@comment ISO
779ae82e 440@deftypefunx float expf (float @var{x})
4260bc74
UD
441@comment math.h
442@comment ISO
779ae82e 443@deftypefunx {long double} expl (long double @var{x})
7a68c94a
UD
444These functions compute @code{e} (the base of natural logarithms) raised
445to the power @var{x}.
28f540f4 446
7a68c94a
UD
447If the magnitude of the result is too large to be representable,
448@code{exp} signals overflow.
28f540f4
RM
449@end deftypefun
450
b4012b75
UD
451@comment math.h
452@comment ISO
04a96fd4 453@deftypefun double exp2 (double @var{x})
4260bc74
UD
454@comment math.h
455@comment ISO
04a96fd4 456@deftypefunx float exp2f (float @var{x})
4260bc74
UD
457@comment math.h
458@comment ISO
04a96fd4 459@deftypefunx {long double} exp2l (long double @var{x})
7a68c94a 460These functions compute @code{2} raised to the power @var{x}.
04a96fd4 461Mathematically, @code{exp2 (x)} is the same as @code{exp (x * log (2))}.
b4012b75
UD
462@end deftypefun
463
464@comment math.h
04a96fd4
UD
465@comment GNU
466@deftypefun double exp10 (double @var{x})
4260bc74
UD
467@comment math.h
468@comment GNU
04a96fd4 469@deftypefunx float exp10f (float @var{x})
4260bc74
UD
470@comment math.h
471@comment GNU
04a96fd4 472@deftypefunx {long double} exp10l (long double @var{x})
4260bc74
UD
473@comment math.h
474@comment GNU
04a96fd4 475@deftypefunx double pow10 (double @var{x})
4260bc74
UD
476@comment math.h
477@comment GNU
04a96fd4 478@deftypefunx float pow10f (float @var{x})
4260bc74
UD
479@comment math.h
480@comment GNU
04a96fd4 481@deftypefunx {long double} pow10l (long double @var{x})
7a68c94a
UD
482These functions compute @code{10} raised to the power @var{x}.
483Mathematically, @code{exp10 (x)} is the same as @code{exp (x * log (10))}.
b4012b75 484
7a68c94a
UD
485These functions are GNU extensions. The name @code{exp10} is
486preferred, since it is analogous to @code{exp} and @code{exp2}.
b4012b75
UD
487@end deftypefun
488
489
28f540f4 490@comment math.h
f65fd747 491@comment ISO
28f540f4 492@deftypefun double log (double @var{x})
4260bc74
UD
493@comment math.h
494@comment ISO
f2ea0f5b 495@deftypefunx float logf (float @var{x})
4260bc74
UD
496@comment math.h
497@comment ISO
779ae82e 498@deftypefunx {long double} logl (long double @var{x})
7a68c94a 499These functions compute the natural logarithm of @var{x}. @code{exp (log
28f540f4
RM
500(@var{x}))} equals @var{x}, exactly in mathematics and approximately in
501C.
502
7a68c94a
UD
503If @var{x} is negative, @code{log} signals a domain error. If @var{x}
504is zero, it returns negative infinity; if @var{x} is too close to zero,
505it may signal overflow.
28f540f4
RM
506@end deftypefun
507
508@comment math.h
f65fd747 509@comment ISO
28f540f4 510@deftypefun double log10 (double @var{x})
4260bc74
UD
511@comment math.h
512@comment ISO
779ae82e 513@deftypefunx float log10f (float @var{x})
4260bc74
UD
514@comment math.h
515@comment ISO
779ae82e 516@deftypefunx {long double} log10l (long double @var{x})
7a68c94a 517These functions return the base-10 logarithm of @var{x}.
28f540f4 518@code{log10 (@var{x})} equals @code{log (@var{x}) / log (10)}.
7a68c94a 519
28f540f4
RM
520@end deftypefun
521
b4012b75
UD
522@comment math.h
523@comment ISO
524@deftypefun double log2 (double @var{x})
4260bc74
UD
525@comment math.h
526@comment ISO
779ae82e 527@deftypefunx float log2f (float @var{x})
4260bc74
UD
528@comment math.h
529@comment ISO
779ae82e 530@deftypefunx {long double} log2l (long double @var{x})
7a68c94a 531These functions return the base-2 logarithm of @var{x}.
b4012b75
UD
532@code{log2 (@var{x})} equals @code{log (@var{x}) / log (2)}.
533@end deftypefun
534
55c14926
UD
535@comment math.h
536@comment ISO
537@deftypefun double logb (double @var{x})
4260bc74
UD
538@comment math.h
539@comment ISO
55c14926 540@deftypefunx float logbf (float @var{x})
4260bc74
UD
541@comment math.h
542@comment ISO
55c14926
UD
543@deftypefunx {long double} logbl (long double @var{x})
544These functions extract the exponent of @var{x} and return it as a
7a68c94a
UD
545floating-point value. If @code{FLT_RADIX} is two, @code{logb} is equal
546to @code{floor (log2 (x))}, except it's probably faster.
55c14926 547
04b9968b 548If @var{x} is de-normalized, @code{logb} returns the exponent @var{x}
7a68c94a
UD
549would have if it were normalized. If @var{x} is infinity (positive or
550negative), @code{logb} returns @math{@infinity{}}. If @var{x} is zero,
551@code{logb} returns @math{@infinity{}}. It does not signal.
55c14926
UD
552@end deftypefun
553
554@comment math.h
555@comment ISO
556@deftypefun int ilogb (double @var{x})
4260bc74
UD
557@comment math.h
558@comment ISO
55c14926 559@deftypefunx int ilogbf (float @var{x})
4260bc74
UD
560@comment math.h
561@comment ISO
55c14926
UD
562@deftypefunx int ilogbl (long double @var{x})
563These functions are equivalent to the corresponding @code{logb}
7a68c94a
UD
564functions except that they return signed integer values.
565@end deftypefun
566
567@noindent
568Since integers cannot represent infinity and NaN, @code{ilogb} instead
569returns an integer that can't be the exponent of a normal floating-point
570number. @file{math.h} defines constants so you can check for this.
571
572@comment math.h
573@comment ISO
574@deftypevr Macro int FP_ILOGB0
575@code{ilogb} returns this value if its argument is @code{0}. The
576numeric value is either @code{INT_MIN} or @code{-INT_MAX}.
577
ec751a23 578This macro is defined in @w{ISO C99}.
7a68c94a
UD
579@end deftypevr
580
581@comment math.h
582@comment ISO
583@deftypevr Macro int FP_ILOGBNAN
584@code{ilogb} returns this value if its argument is @code{NaN}. The
585numeric value is either @code{INT_MIN} or @code{INT_MAX}.
586
ec751a23 587This macro is defined in @w{ISO C99}.
7a68c94a
UD
588@end deftypevr
589
590These values are system specific. They might even be the same. The
591proper way to test the result of @code{ilogb} is as follows:
55c14926
UD
592
593@smallexample
594i = ilogb (f);
595if (i == FP_ILOGB0 || i == FP_ILOGBNAN)
596 @{
597 if (isnan (f))
598 @{
599 /* @r{Handle NaN.} */
600 @}
601 else if (f == 0.0)
602 @{
603 /* @r{Handle 0.0.} */
604 @}
605 else
606 @{
607 /* @r{Some other value with large exponent,}
608 @r{perhaps +Inf.} */
609 @}
610 @}
611@end smallexample
612
28f540f4 613@comment math.h
f65fd747 614@comment ISO
28f540f4 615@deftypefun double pow (double @var{base}, double @var{power})
4260bc74
UD
616@comment math.h
617@comment ISO
779ae82e 618@deftypefunx float powf (float @var{base}, float @var{power})
4260bc74
UD
619@comment math.h
620@comment ISO
779ae82e 621@deftypefunx {long double} powl (long double @var{base}, long double @var{power})
b4012b75 622These are general exponentiation functions, returning @var{base} raised
28f540f4
RM
623to @var{power}.
624
7a68c94a
UD
625Mathematically, @code{pow} would return a complex number when @var{base}
626is negative and @var{power} is not an integral value. @code{pow} can't
627do that, so instead it signals a domain error. @code{pow} may also
628underflow or overflow the destination type.
28f540f4
RM
629@end deftypefun
630
631@cindex square root function
632@comment math.h
f65fd747 633@comment ISO
28f540f4 634@deftypefun double sqrt (double @var{x})
4260bc74
UD
635@comment math.h
636@comment ISO
779ae82e 637@deftypefunx float sqrtf (float @var{x})
4260bc74
UD
638@comment math.h
639@comment ISO
779ae82e 640@deftypefunx {long double} sqrtl (long double @var{x})
b4012b75 641These functions return the nonnegative square root of @var{x}.
28f540f4 642
7a68c94a
UD
643If @var{x} is negative, @code{sqrt} signals a domain error.
644Mathematically, it should return a complex number.
28f540f4
RM
645@end deftypefun
646
647@cindex cube root function
648@comment math.h
649@comment BSD
650@deftypefun double cbrt (double @var{x})
4260bc74
UD
651@comment math.h
652@comment BSD
779ae82e 653@deftypefunx float cbrtf (float @var{x})
4260bc74
UD
654@comment math.h
655@comment BSD
779ae82e 656@deftypefunx {long double} cbrtl (long double @var{x})
b4012b75 657These functions return the cube root of @var{x}. They cannot
28f540f4
RM
658fail; every representable real value has a representable real cube root.
659@end deftypefun
660
661@comment math.h
b4012b75 662@comment ISO
28f540f4 663@deftypefun double hypot (double @var{x}, double @var{y})
4260bc74
UD
664@comment math.h
665@comment ISO
779ae82e 666@deftypefunx float hypotf (float @var{x}, float @var{y})
4260bc74
UD
667@comment math.h
668@comment ISO
779ae82e 669@deftypefunx {long double} hypotl (long double @var{x}, long double @var{y})
b4012b75 670These functions return @code{sqrt (@var{x}*@var{x} +
7a68c94a 671@var{y}*@var{y})}. This is the length of the hypotenuse of a right
28f540f4 672triangle with sides of length @var{x} and @var{y}, or the distance
7a68c94a
UD
673of the point (@var{x}, @var{y}) from the origin. Using this function
674instead of the direct formula is wise, since the error is
b4012b75 675much smaller. See also the function @code{cabs} in @ref{Absolute Value}.
28f540f4
RM
676@end deftypefun
677
678@comment math.h
b4012b75 679@comment ISO
28f540f4 680@deftypefun double expm1 (double @var{x})
4260bc74
UD
681@comment math.h
682@comment ISO
779ae82e 683@deftypefunx float expm1f (float @var{x})
4260bc74
UD
684@comment math.h
685@comment ISO
779ae82e 686@deftypefunx {long double} expm1l (long double @var{x})
b4012b75 687These functions return a value equivalent to @code{exp (@var{x}) - 1}.
7a68c94a 688They are computed in a way that is accurate even if @var{x} is
04b9968b 689near zero---a case where @code{exp (@var{x}) - 1} would be inaccurate owing
28f540f4
RM
690to subtraction of two numbers that are nearly equal.
691@end deftypefun
692
693@comment math.h
b4012b75 694@comment ISO
28f540f4 695@deftypefun double log1p (double @var{x})
4260bc74
UD
696@comment math.h
697@comment ISO
779ae82e 698@deftypefunx float log1pf (float @var{x})
4260bc74
UD
699@comment math.h
700@comment ISO
779ae82e 701@deftypefunx {long double} log1pl (long double @var{x})
7a68c94a
UD
702These functions returns a value equivalent to @w{@code{log (1 + @var{x})}}.
703They are computed in a way that is accurate even if @var{x} is
28f540f4
RM
704near zero.
705@end deftypefun
706
b4012b75
UD
707@cindex complex exponentiation functions
708@cindex complex logarithm functions
709
ec751a23 710@w{ISO C99} defines complex variants of some of the exponentiation and
7a68c94a 711logarithm functions.
b4012b75
UD
712
713@comment complex.h
714@comment ISO
715@deftypefun {complex double} cexp (complex double @var{z})
4260bc74
UD
716@comment complex.h
717@comment ISO
779ae82e 718@deftypefunx {complex float} cexpf (complex float @var{z})
4260bc74
UD
719@comment complex.h
720@comment ISO
779ae82e 721@deftypefunx {complex long double} cexpl (complex long double @var{z})
7a68c94a
UD
722These functions return @code{e} (the base of natural
723logarithms) raised to the power of @var{z}.
04b9968b 724Mathematically, this corresponds to the value
b4012b75 725
779ae82e
UD
726@ifinfo
727@math{exp (z) = exp (creal (z)) * (cos (cimag (z)) + I * sin (cimag (z)))}
728@end ifinfo
779ae82e 729@tex
7a68c94a 730$$\exp(z) = e^z = e^{{\rm Re}\,z} (\cos ({\rm Im}\,z) + i \sin ({\rm Im}\,z))$$
779ae82e 731@end tex
b4012b75
UD
732@end deftypefun
733
734@comment complex.h
735@comment ISO
736@deftypefun {complex double} clog (complex double @var{z})
4260bc74
UD
737@comment complex.h
738@comment ISO
779ae82e 739@deftypefunx {complex float} clogf (complex float @var{z})
4260bc74
UD
740@comment complex.h
741@comment ISO
779ae82e 742@deftypefunx {complex long double} clogl (complex long double @var{z})
7a68c94a 743These functions return the natural logarithm of @var{z}.
04b9968b 744Mathematically, this corresponds to the value
b4012b75 745
779ae82e
UD
746@ifinfo
747@math{log (z) = log (cabs (z)) + I * carg (z)}
748@end ifinfo
779ae82e 749@tex
7a68c94a 750$$\log(z) = \log |z| + i \arg z$$
779ae82e 751@end tex
7a68c94a
UD
752
753@noindent
754@code{clog} has a pole at 0, and will signal overflow if @var{z} equals
755or is very close to 0. It is well-defined for all other values of
756@var{z}.
b4012b75
UD
757@end deftypefun
758
dfd2257a
UD
759
760@comment complex.h
761@comment GNU
762@deftypefun {complex double} clog10 (complex double @var{z})
4260bc74
UD
763@comment complex.h
764@comment GNU
dfd2257a 765@deftypefunx {complex float} clog10f (complex float @var{z})
4260bc74
UD
766@comment complex.h
767@comment GNU
dfd2257a
UD
768@deftypefunx {complex long double} clog10l (complex long double @var{z})
769These functions return the base 10 logarithm of the complex value
04b9968b 770@var{z}. Mathematically, this corresponds to the value
dfd2257a
UD
771
772@ifinfo
773@math{log (z) = log10 (cabs (z)) + I * carg (z)}
774@end ifinfo
dfd2257a 775@tex
7a68c94a 776$$\log_{10}(z) = \log_{10}|z| + i \arg z$$
dfd2257a 777@end tex
dfd2257a 778
7a68c94a 779These functions are GNU extensions.
dfd2257a
UD
780@end deftypefun
781
b4012b75
UD
782@comment complex.h
783@comment ISO
784@deftypefun {complex double} csqrt (complex double @var{z})
4260bc74
UD
785@comment complex.h
786@comment ISO
779ae82e 787@deftypefunx {complex float} csqrtf (complex float @var{z})
4260bc74
UD
788@comment complex.h
789@comment ISO
779ae82e 790@deftypefunx {complex long double} csqrtl (complex long double @var{z})
7a68c94a
UD
791These functions return the complex square root of the argument @var{z}. Unlike
792the real-valued functions, they are defined for all values of @var{z}.
b4012b75
UD
793@end deftypefun
794
795@comment complex.h
796@comment ISO
797@deftypefun {complex double} cpow (complex double @var{base}, complex double @var{power})
4260bc74
UD
798@comment complex.h
799@comment ISO
779ae82e 800@deftypefunx {complex float} cpowf (complex float @var{base}, complex float @var{power})
4260bc74
UD
801@comment complex.h
802@comment ISO
779ae82e 803@deftypefunx {complex long double} cpowl (complex long double @var{base}, complex long double @var{power})
7a68c94a
UD
804These functions return @var{base} raised to the power of
805@var{power}. This is equivalent to @w{@code{cexp (y * clog (x))}}
b4012b75
UD
806@end deftypefun
807
28f540f4
RM
808@node Hyperbolic Functions
809@section Hyperbolic Functions
810@cindex hyperbolic functions
811
812The functions in this section are related to the exponential functions;
813see @ref{Exponents and Logarithms}.
814
815@comment math.h
f65fd747 816@comment ISO
28f540f4 817@deftypefun double sinh (double @var{x})
4260bc74
UD
818@comment math.h
819@comment ISO
779ae82e 820@deftypefunx float sinhf (float @var{x})
4260bc74
UD
821@comment math.h
822@comment ISO
779ae82e 823@deftypefunx {long double} sinhl (long double @var{x})
b4012b75 824These functions return the hyperbolic sine of @var{x}, defined
7a68c94a
UD
825mathematically as @w{@code{(exp (@var{x}) - exp (-@var{x})) / 2}}. They
826may signal overflow if @var{x} is too large.
28f540f4
RM
827@end deftypefun
828
829@comment math.h
f65fd747 830@comment ISO
28f540f4 831@deftypefun double cosh (double @var{x})
4260bc74
UD
832@comment math.h
833@comment ISO
779ae82e 834@deftypefunx float coshf (float @var{x})
4260bc74
UD
835@comment math.h
836@comment ISO
779ae82e 837@deftypefunx {long double} coshl (long double @var{x})
b4012b75
UD
838These function return the hyperbolic cosine of @var{x},
839defined mathematically as @w{@code{(exp (@var{x}) + exp (-@var{x})) / 2}}.
7a68c94a 840They may signal overflow if @var{x} is too large.
28f540f4
RM
841@end deftypefun
842
843@comment math.h
f65fd747 844@comment ISO
28f540f4 845@deftypefun double tanh (double @var{x})
4260bc74
UD
846@comment math.h
847@comment ISO
779ae82e 848@deftypefunx float tanhf (float @var{x})
4260bc74
UD
849@comment math.h
850@comment ISO
779ae82e 851@deftypefunx {long double} tanhl (long double @var{x})
7a68c94a
UD
852These functions return the hyperbolic tangent of @var{x},
853defined mathematically as @w{@code{sinh (@var{x}) / cosh (@var{x})}}.
854They may signal overflow if @var{x} is too large.
28f540f4
RM
855@end deftypefun
856
b4012b75
UD
857@cindex hyperbolic functions
858
7a68c94a
UD
859There are counterparts for the hyperbolic functions which take
860complex arguments.
b4012b75
UD
861
862@comment complex.h
863@comment ISO
864@deftypefun {complex double} csinh (complex double @var{z})
4260bc74
UD
865@comment complex.h
866@comment ISO
779ae82e 867@deftypefunx {complex float} csinhf (complex float @var{z})
4260bc74
UD
868@comment complex.h
869@comment ISO
779ae82e 870@deftypefunx {complex long double} csinhl (complex long double @var{z})
b4012b75 871These functions return the complex hyperbolic sine of @var{z}, defined
7a68c94a 872mathematically as @w{@code{(exp (@var{z}) - exp (-@var{z})) / 2}}.
b4012b75
UD
873@end deftypefun
874
875@comment complex.h
876@comment ISO
877@deftypefun {complex double} ccosh (complex double @var{z})
4260bc74
UD
878@comment complex.h
879@comment ISO
779ae82e 880@deftypefunx {complex float} ccoshf (complex float @var{z})
4260bc74
UD
881@comment complex.h
882@comment ISO
779ae82e 883@deftypefunx {complex long double} ccoshl (complex long double @var{z})
b4012b75 884These functions return the complex hyperbolic cosine of @var{z}, defined
7a68c94a 885mathematically as @w{@code{(exp (@var{z}) + exp (-@var{z})) / 2}}.
b4012b75
UD
886@end deftypefun
887
888@comment complex.h
889@comment ISO
890@deftypefun {complex double} ctanh (complex double @var{z})
4260bc74
UD
891@comment complex.h
892@comment ISO
779ae82e 893@deftypefunx {complex float} ctanhf (complex float @var{z})
4260bc74
UD
894@comment complex.h
895@comment ISO
779ae82e 896@deftypefunx {complex long double} ctanhl (complex long double @var{z})
7a68c94a
UD
897These functions return the complex hyperbolic tangent of @var{z},
898defined mathematically as @w{@code{csinh (@var{z}) / ccosh (@var{z})}}.
b4012b75
UD
899@end deftypefun
900
901
28f540f4
RM
902@cindex inverse hyperbolic functions
903
904@comment math.h
b4012b75 905@comment ISO
28f540f4 906@deftypefun double asinh (double @var{x})
4260bc74
UD
907@comment math.h
908@comment ISO
779ae82e 909@deftypefunx float asinhf (float @var{x})
4260bc74
UD
910@comment math.h
911@comment ISO
779ae82e 912@deftypefunx {long double} asinhl (long double @var{x})
b4012b75 913These functions return the inverse hyperbolic sine of @var{x}---the
28f540f4
RM
914value whose hyperbolic sine is @var{x}.
915@end deftypefun
916
917@comment math.h
b4012b75 918@comment ISO
28f540f4 919@deftypefun double acosh (double @var{x})
4260bc74
UD
920@comment math.h
921@comment ISO
779ae82e 922@deftypefunx float acoshf (float @var{x})
4260bc74
UD
923@comment math.h
924@comment ISO
779ae82e 925@deftypefunx {long double} acoshl (long double @var{x})
b4012b75 926These functions return the inverse hyperbolic cosine of @var{x}---the
28f540f4 927value whose hyperbolic cosine is @var{x}. If @var{x} is less than
7a68c94a 928@code{1}, @code{acosh} signals a domain error.
28f540f4
RM
929@end deftypefun
930
931@comment math.h
b4012b75 932@comment ISO
28f540f4 933@deftypefun double atanh (double @var{x})
4260bc74
UD
934@comment math.h
935@comment ISO
779ae82e 936@deftypefunx float atanhf (float @var{x})
4260bc74
UD
937@comment math.h
938@comment ISO
779ae82e 939@deftypefunx {long double} atanhl (long double @var{x})
b4012b75 940These functions return the inverse hyperbolic tangent of @var{x}---the
28f540f4 941value whose hyperbolic tangent is @var{x}. If the absolute value of
7a68c94a
UD
942@var{x} is greater than @code{1}, @code{atanh} signals a domain error;
943if it is equal to 1, @code{atanh} returns infinity.
28f540f4
RM
944@end deftypefun
945
b4012b75
UD
946@cindex inverse complex hyperbolic functions
947
948@comment complex.h
949@comment ISO
950@deftypefun {complex double} casinh (complex double @var{z})
4260bc74
UD
951@comment complex.h
952@comment ISO
779ae82e 953@deftypefunx {complex float} casinhf (complex float @var{z})
4260bc74
UD
954@comment complex.h
955@comment ISO
779ae82e 956@deftypefunx {complex long double} casinhl (complex long double @var{z})
b4012b75
UD
957These functions return the inverse complex hyperbolic sine of
958@var{z}---the value whose complex hyperbolic sine is @var{z}.
959@end deftypefun
960
961@comment complex.h
962@comment ISO
963@deftypefun {complex double} cacosh (complex double @var{z})
4260bc74
UD
964@comment complex.h
965@comment ISO
779ae82e 966@deftypefunx {complex float} cacoshf (complex float @var{z})
4260bc74
UD
967@comment complex.h
968@comment ISO
779ae82e 969@deftypefunx {complex long double} cacoshl (complex long double @var{z})
b4012b75
UD
970These functions return the inverse complex hyperbolic cosine of
971@var{z}---the value whose complex hyperbolic cosine is @var{z}. Unlike
7a68c94a 972the real-valued functions, there are no restrictions on the value of @var{z}.
b4012b75
UD
973@end deftypefun
974
975@comment complex.h
976@comment ISO
977@deftypefun {complex double} catanh (complex double @var{z})
4260bc74
UD
978@comment complex.h
979@comment ISO
779ae82e 980@deftypefunx {complex float} catanhf (complex float @var{z})
4260bc74
UD
981@comment complex.h
982@comment ISO
779ae82e 983@deftypefunx {complex long double} catanhl (complex long double @var{z})
b4012b75
UD
984These functions return the inverse complex hyperbolic tangent of
985@var{z}---the value whose complex hyperbolic tangent is @var{z}. Unlike
7a68c94a
UD
986the real-valued functions, there are no restrictions on the value of
987@var{z}.
b4012b75
UD
988@end deftypefun
989
7a68c94a
UD
990@node Special Functions
991@section Special Functions
992@cindex special functions
993@cindex Bessel functions
994@cindex gamma function
995
04b9968b 996These are some more exotic mathematical functions which are sometimes
7a68c94a
UD
997useful. Currently they only have real-valued versions.
998
999@comment math.h
1000@comment SVID
1001@deftypefun double erf (double @var{x})
4260bc74
UD
1002@comment math.h
1003@comment SVID
7a68c94a 1004@deftypefunx float erff (float @var{x})
4260bc74
UD
1005@comment math.h
1006@comment SVID
7a68c94a
UD
1007@deftypefunx {long double} erfl (long double @var{x})
1008@code{erf} returns the error function of @var{x}. The error
1009function is defined as
1010@tex
1011$$\hbox{erf}(x) = {2\over\sqrt{\pi}}\cdot\int_0^x e^{-t^2} \hbox{d}t$$
1012@end tex
1013@ifnottex
1014@smallexample
1015erf (x) = 2/sqrt(pi) * integral from 0 to x of exp(-t^2) dt
1016@end smallexample
1017@end ifnottex
1018@end deftypefun
1019
1020@comment math.h
1021@comment SVID
1022@deftypefun double erfc (double @var{x})
4260bc74
UD
1023@comment math.h
1024@comment SVID
7a68c94a 1025@deftypefunx float erfcf (float @var{x})
4260bc74
UD
1026@comment math.h
1027@comment SVID
7a68c94a
UD
1028@deftypefunx {long double} erfcl (long double @var{x})
1029@code{erfc} returns @code{1.0 - erf(@var{x})}, but computed in a
1030fashion that avoids round-off error when @var{x} is large.
1031@end deftypefun
1032
1033@comment math.h
1034@comment SVID
1035@deftypefun double lgamma (double @var{x})
4260bc74
UD
1036@comment math.h
1037@comment SVID
7a68c94a 1038@deftypefunx float lgammaf (float @var{x})
4260bc74
UD
1039@comment math.h
1040@comment SVID
7a68c94a
UD
1041@deftypefunx {long double} lgammal (long double @var{x})
1042@code{lgamma} returns the natural logarithm of the absolute value of
1043the gamma function of @var{x}. The gamma function is defined as
1044@tex
1045$$\Gamma(x) = \int_0^\infty t^{x-1} e^{-t} \hbox{d}t$$
1046@end tex
1047@ifnottex
1048@smallexample
1049gamma (x) = integral from 0 to @infinity{} of t^(x-1) e^-t dt
1050@end smallexample
1051@end ifnottex
1052
1053@vindex signgam
1054The sign of the gamma function is stored in the global variable
1055@var{signgam}, which is declared in @file{math.h}. It is @code{1} if
04b9968b 1056the intermediate result was positive or zero, or @code{-1} if it was
7a68c94a
UD
1057negative.
1058
e852e889
UD
1059To compute the real gamma function you can use the @code{tgamma}
1060function or you can compute the values as follows:
7a68c94a
UD
1061@smallexample
1062lgam = lgamma(x);
1063gam = signgam*exp(lgam);
1064@end smallexample
1065
04b9968b 1066The gamma function has singularities at the non-positive integers.
7a68c94a
UD
1067@code{lgamma} will raise the zero divide exception if evaluated at a
1068singularity.
1069@end deftypefun
1070
1071@comment math.h
1072@comment XPG
07435eb4 1073@deftypefun double lgamma_r (double @var{x}, int *@var{signp})
4260bc74
UD
1074@comment math.h
1075@comment XPG
07435eb4 1076@deftypefunx float lgammaf_r (float @var{x}, int *@var{signp})
4260bc74
UD
1077@comment math.h
1078@comment XPG
07435eb4 1079@deftypefunx {long double} lgammal_r (long double @var{x}, int *@var{signp})
7a68c94a
UD
1080@code{lgamma_r} is just like @code{lgamma}, but it stores the sign of
1081the intermediate result in the variable pointed to by @var{signp}
04b9968b 1082instead of in the @var{signgam} global. This means it is reentrant.
7a68c94a
UD
1083@end deftypefun
1084
7a68c94a
UD
1085@comment math.h
1086@comment SVID
1087@deftypefun double gamma (double @var{x})
4260bc74
UD
1088@comment math.h
1089@comment SVID
7a68c94a 1090@deftypefunx float gammaf (float @var{x})
4260bc74
UD
1091@comment math.h
1092@comment SVID
7a68c94a 1093@deftypefunx {long double} gammal (long double @var{x})
e852e889
UD
1094These functions exist for compatibility reasons. They are equivalent to
1095@code{lgamma} etc. It is better to use @code{lgamma} since for one the
04b9968b 1096name reflects better the actual computation, moreover @code{lgamma} is
ec751a23 1097standardized in @w{ISO C99} while @code{gamma} is not.
e852e889
UD
1098@end deftypefun
1099
1100@comment math.h
ec751a23 1101@comment XPG, ISO
e852e889 1102@deftypefun double tgamma (double @var{x})
4260bc74 1103@comment math.h
ec751a23 1104@comment XPG, ISO
e852e889 1105@deftypefunx float tgammaf (float @var{x})
4260bc74 1106@comment math.h
ec751a23 1107@comment XPG, ISO
e852e889
UD
1108@deftypefunx {long double} tgammal (long double @var{x})
1109@code{tgamma} applies the gamma function to @var{x}. The gamma
1110function is defined as
1111@tex
1112$$\Gamma(x) = \int_0^\infty t^{x-1} e^{-t} \hbox{d}t$$
1113@end tex
1114@ifnottex
1115@smallexample
1116gamma (x) = integral from 0 to @infinity{} of t^(x-1) e^-t dt
1117@end smallexample
1118@end ifnottex
1119
ec751a23 1120This function was introduced in @w{ISO C99}.
7a68c94a 1121@end deftypefun
7a68c94a
UD
1122
1123@comment math.h
1124@comment SVID
1125@deftypefun double j0 (double @var{x})
4260bc74
UD
1126@comment math.h
1127@comment SVID
7a68c94a 1128@deftypefunx float j0f (float @var{x})
4260bc74
UD
1129@comment math.h
1130@comment SVID
7a68c94a
UD
1131@deftypefunx {long double} j0l (long double @var{x})
1132@code{j0} returns the Bessel function of the first kind of order 0 of
1133@var{x}. It may signal underflow if @var{x} is too large.
1134@end deftypefun
1135
1136@comment math.h
1137@comment SVID
1138@deftypefun double j1 (double @var{x})
4260bc74
UD
1139@comment math.h
1140@comment SVID
7a68c94a 1141@deftypefunx float j1f (float @var{x})
4260bc74
UD
1142@comment math.h
1143@comment SVID
7a68c94a
UD
1144@deftypefunx {long double} j1l (long double @var{x})
1145@code{j1} returns the Bessel function of the first kind of order 1 of
1146@var{x}. It may signal underflow if @var{x} is too large.
1147@end deftypefun
1148
1149@comment math.h
1150@comment SVID
1151@deftypefun double jn (int n, double @var{x})
4260bc74
UD
1152@comment math.h
1153@comment SVID
7a68c94a 1154@deftypefunx float jnf (int n, float @var{x})
4260bc74
UD
1155@comment math.h
1156@comment SVID
7a68c94a
UD
1157@deftypefunx {long double} jnl (int n, long double @var{x})
1158@code{jn} returns the Bessel function of the first kind of order
1159@var{n} of @var{x}. It may signal underflow if @var{x} is too large.
1160@end deftypefun
1161
1162@comment math.h
1163@comment SVID
1164@deftypefun double y0 (double @var{x})
4260bc74
UD
1165@comment math.h
1166@comment SVID
7a68c94a 1167@deftypefunx float y0f (float @var{x})
4260bc74
UD
1168@comment math.h
1169@comment SVID
7a68c94a
UD
1170@deftypefunx {long double} y0l (long double @var{x})
1171@code{y0} returns the Bessel function of the second kind of order 0 of
1172@var{x}. It may signal underflow if @var{x} is too large. If @var{x}
1173is negative, @code{y0} signals a domain error; if it is zero,
1174@code{y0} signals overflow and returns @math{-@infinity}.
1175@end deftypefun
1176
1177@comment math.h
1178@comment SVID
1179@deftypefun double y1 (double @var{x})
4260bc74
UD
1180@comment math.h
1181@comment SVID
7a68c94a 1182@deftypefunx float y1f (float @var{x})
4260bc74
UD
1183@comment math.h
1184@comment SVID
7a68c94a
UD
1185@deftypefunx {long double} y1l (long double @var{x})
1186@code{y1} returns the Bessel function of the second kind of order 1 of
1187@var{x}. It may signal underflow if @var{x} is too large. If @var{x}
1188is negative, @code{y1} signals a domain error; if it is zero,
1189@code{y1} signals overflow and returns @math{-@infinity}.
1190@end deftypefun
1191
1192@comment math.h
1193@comment SVID
1194@deftypefun double yn (int n, double @var{x})
4260bc74
UD
1195@comment math.h
1196@comment SVID
7a68c94a 1197@deftypefunx float ynf (int n, float @var{x})
4260bc74
UD
1198@comment math.h
1199@comment SVID
7a68c94a
UD
1200@deftypefunx {long double} ynl (int n, long double @var{x})
1201@code{yn} returns the Bessel function of the second kind of order @var{n} of
1202@var{x}. It may signal underflow if @var{x} is too large. If @var{x}
1203is negative, @code{yn} signals a domain error; if it is zero,
1204@code{yn} signals overflow and returns @math{-@infinity}.
1205@end deftypefun
55c14926 1206
aaa1276e
UD
1207@node Errors in Math Functions
1208@section Known Maximum Errors in Math Functions
1209@cindex math errors
1210@cindex ulps
1211
1212This section lists the known errors of the functions in the math
1213library. Errors are measured in ``units of the last place''. This is a
1214measure for the relative error. For a number @math{z} with the
1215representation @math{d.d@dots{}d@mul{}2^e} (we assume IEEE
1216floating-point numbers with base 2) the ULP is represented by
1217
1218@tex
ec751a23 1219$${|d.d\dots d - (z/2^e)|}\over {2^{p-1}}$$
aaa1276e
UD
1220@end tex
1221@ifnottex
1222@smallexample
1223|d.d...d - (z / 2^e)| / 2^(p - 1)
1224@end smallexample
1225@end ifnottex
1226
1227@noindent
1228where @math{p} is the number of bits in the mantissa of the
1229floating-point number representation. Ideally the error for all
1230functions is always less than 0.5ulps. Using rounding bits this is also
1231possible and normally implemented for the basic operations. To achieve
1232the same for the complex math functions requires a lot more work and
1233this was not spend so far.
1234
1235Therefore many of the functions in the math library have errors. The
1236table lists the maximum error for each function which is exposed by one
1237of the existing tests in the test suite. It is tried to cover as much
1238as possible and really list the maximum error (or at least a ballpark
1239figure) but this is often not achieved due to the large search space.
1240
1241The table lists the ULP values for different architectures. Different
1242architectures have different results since their hardware support for
1243floating-point operations varies and also the existing hardware support
1244is different.
1245
1246@include libm-err.texi
1247
28f540f4
RM
1248@node Pseudo-Random Numbers
1249@section Pseudo-Random Numbers
1250@cindex random numbers
1251@cindex pseudo-random numbers
1252@cindex seed (for random numbers)
1253
1254This section describes the GNU facilities for generating a series of
1255pseudo-random numbers. The numbers generated are not truly random;
7a68c94a
UD
1256typically, they form a sequence that repeats periodically, with a period
1257so large that you can ignore it for ordinary purposes. The random
1258number generator works by remembering a @dfn{seed} value which it uses
1259to compute the next random number and also to compute a new seed.
28f540f4
RM
1260
1261Although the generated numbers look unpredictable within one run of a
1262program, the sequence of numbers is @emph{exactly the same} from one run
1263to the next. This is because the initial seed is always the same. This
1264is convenient when you are debugging a program, but it is unhelpful if
7a68c94a
UD
1265you want the program to behave unpredictably. If you want a different
1266pseudo-random series each time your program runs, you must specify a
1267different seed each time. For ordinary purposes, basing the seed on the
1268current time works well.
28f540f4 1269
04b9968b 1270You can obtain repeatable sequences of numbers on a particular machine type
28f540f4
RM
1271by specifying the same initial seed value for the random number
1272generator. There is no standard meaning for a particular seed value;
1273the same seed, used in different C libraries or on different CPU types,
1274will give you different random numbers.
1275
f65fd747 1276The GNU library supports the standard @w{ISO C} random number functions
7a68c94a
UD
1277plus two other sets derived from BSD and SVID. The BSD and @w{ISO C}
1278functions provide identical, somewhat limited functionality. If only a
1279small number of random bits are required, we recommend you use the
1280@w{ISO C} interface, @code{rand} and @code{srand}. The SVID functions
1281provide a more flexible interface, which allows better random number
1282generator algorithms, provides more random bits (up to 48) per call, and
1283can provide random floating-point numbers. These functions are required
1284by the XPG standard and therefore will be present in all modern Unix
1285systems.
28f540f4
RM
1286
1287@menu
7a68c94a
UD
1288* ISO Random:: @code{rand} and friends.
1289* BSD Random:: @code{random} and friends.
1290* SVID Random:: @code{drand48} and friends.
28f540f4
RM
1291@end menu
1292
f65fd747
UD
1293@node ISO Random
1294@subsection ISO C Random Number Functions
28f540f4
RM
1295
1296This section describes the random number functions that are part of
f65fd747 1297the @w{ISO C} standard.
28f540f4
RM
1298
1299To use these facilities, you should include the header file
1300@file{stdlib.h} in your program.
1301@pindex stdlib.h
1302
1303@comment stdlib.h
f65fd747 1304@comment ISO
28f540f4 1305@deftypevr Macro int RAND_MAX
7a68c94a
UD
1306The value of this macro is an integer constant representing the largest
1307value the @code{rand} function can return. In the GNU library, it is
1308@code{2147483647}, which is the largest signed integer representable in
130932 bits. In other libraries, it may be as low as @code{32767}.
28f540f4
RM
1310@end deftypevr
1311
1312@comment stdlib.h
f65fd747 1313@comment ISO
ca34d7a7 1314@deftypefun int rand (void)
28f540f4 1315The @code{rand} function returns the next pseudo-random number in the
7a68c94a 1316series. The value ranges from @code{0} to @code{RAND_MAX}.
28f540f4
RM
1317@end deftypefun
1318
1319@comment stdlib.h
f65fd747 1320@comment ISO
28f540f4
RM
1321@deftypefun void srand (unsigned int @var{seed})
1322This function establishes @var{seed} as the seed for a new series of
1323pseudo-random numbers. If you call @code{rand} before a seed has been
1324established with @code{srand}, it uses the value @code{1} as a default
1325seed.
1326
7a68c94a
UD
1327To produce a different pseudo-random series each time your program is
1328run, do @code{srand (time (0))}.
28f540f4
RM
1329@end deftypefun
1330
7a68c94a
UD
1331POSIX.1 extended the C standard functions to support reproducible random
1332numbers in multi-threaded programs. However, the extension is badly
1333designed and unsuitable for serious work.
61eb22d3
UD
1334
1335@comment stdlib.h
1336@comment POSIX.1
1337@deftypefun int rand_r (unsigned int *@var{seed})
1338This function returns a random number in the range 0 to @code{RAND_MAX}
7a68c94a
UD
1339just as @code{rand} does. However, all its state is stored in the
1340@var{seed} argument. This means the RNG's state can only have as many
1341bits as the type @code{unsigned int} has. This is far too few to
1342provide a good RNG.
61eb22d3 1343
7a68c94a
UD
1344If your program requires a reentrant RNG, we recommend you use the
1345reentrant GNU extensions to the SVID random number generator. The
1346POSIX.1 interface should only be used when the GNU extensions are not
1347available.
61eb22d3
UD
1348@end deftypefun
1349
1350
28f540f4
RM
1351@node BSD Random
1352@subsection BSD Random Number Functions
1353
1354This section describes a set of random number generation functions that
1355are derived from BSD. There is no advantage to using these functions
1356with the GNU C library; we support them for BSD compatibility only.
1357
1358The prototypes for these functions are in @file{stdlib.h}.
1359@pindex stdlib.h
1360
1361@comment stdlib.h
1362@comment BSD
ca34d7a7 1363@deftypefun {int32_t} random (void)
28f540f4 1364This function returns the next pseudo-random number in the sequence.
7a68c94a 1365The value returned ranges from @code{0} to @code{RAND_MAX}.
ca34d7a7 1366
04b9968b
UD
1367@strong{Note:} Historically this function returned a @code{long int}
1368value. On 64-bit systems @code{long int} would have been larger than
1369programs expected, so @code{random} is now defined to return exactly 32
1370bits.
28f540f4
RM
1371@end deftypefun
1372
1373@comment stdlib.h
1374@comment BSD
1375@deftypefun void srandom (unsigned int @var{seed})
7a68c94a
UD
1376The @code{srandom} function sets the state of the random number
1377generator based on the integer @var{seed}. If you supply a @var{seed} value
28f540f4
RM
1378of @code{1}, this will cause @code{random} to reproduce the default set
1379of random numbers.
1380
7a68c94a
UD
1381To produce a different set of pseudo-random numbers each time your
1382program runs, do @code{srandom (time (0))}.
28f540f4
RM
1383@end deftypefun
1384
1385@comment stdlib.h
1386@comment BSD
1387@deftypefun {void *} initstate (unsigned int @var{seed}, void *@var{state}, size_t @var{size})
1388The @code{initstate} function is used to initialize the random number
1389generator state. The argument @var{state} is an array of @var{size}
7a68c94a
UD
1390bytes, used to hold the state information. It is initialized based on
1391@var{seed}. The size must be between 8 and 256 bytes, and should be a
1392power of two. The bigger the @var{state} array, the better.
28f540f4
RM
1393
1394The return value is the previous value of the state information array.
1395You can use this value later as an argument to @code{setstate} to
1396restore that state.
1397@end deftypefun
1398
1399@comment stdlib.h
1400@comment BSD
1401@deftypefun {void *} setstate (void *@var{state})
1402The @code{setstate} function restores the random number state
1403information @var{state}. The argument must have been the result of
2c6fe0bd 1404a previous call to @var{initstate} or @var{setstate}.
28f540f4
RM
1405
1406The return value is the previous value of the state information array.
f2ea0f5b 1407You can use this value later as an argument to @code{setstate} to
28f540f4
RM
1408restore that state.
1409@end deftypefun
b4012b75 1410
b4012b75
UD
1411@node SVID Random
1412@subsection SVID Random Number Function
1413
1414The C library on SVID systems contains yet another kind of random number
1415generator functions. They use a state of 48 bits of data. The user can
7a68c94a 1416choose among a collection of functions which return the random bits
b4012b75
UD
1417in different forms.
1418
04b9968b 1419Generally there are two kinds of function. The first uses a state of
b4012b75 1420the random number generator which is shared among several functions and
04b9968b
UD
1421by all threads of the process. The second requires the user to handle
1422the state.
b4012b75
UD
1423
1424All functions have in common that they use the same congruential
1425formula with the same constants. The formula is
1426
1427@smallexample
1428Y = (a * X + c) mod m
1429@end smallexample
1430
1431@noindent
1432where @var{X} is the state of the generator at the beginning and
1433@var{Y} the state at the end. @code{a} and @code{c} are constants
04b9968b 1434determining the way the generator works. By default they are
b4012b75
UD
1435
1436@smallexample
1437a = 0x5DEECE66D = 25214903917
1438c = 0xb = 11
1439@end smallexample
1440
1441@noindent
1442but they can also be changed by the user. @code{m} is of course 2^48
04b9968b 1443since the state consists of a 48-bit array.
b4012b75
UD
1444
1445
1446@comment stdlib.h
1447@comment SVID
55c14926 1448@deftypefun double drand48 (void)
b4012b75
UD
1449This function returns a @code{double} value in the range of @code{0.0}
1450to @code{1.0} (exclusive). The random bits are determined by the global
1451state of the random number generator in the C library.
1452
04b9968b 1453Since the @code{double} type according to @w{IEEE 754} has a 52-bit
b4012b75
UD
1454mantissa this means 4 bits are not initialized by the random number
1455generator. These are (of course) chosen to be the least significant
1456bits and they are initialized to @code{0}.
1457@end deftypefun
1458
1459@comment stdlib.h
1460@comment SVID
1461@deftypefun double erand48 (unsigned short int @var{xsubi}[3])
1462This function returns a @code{double} value in the range of @code{0.0}
04b9968b 1463to @code{1.0} (exclusive), similarly to @code{drand48}. The argument is
b4012b75
UD
1464an array describing the state of the random number generator.
1465
1466This function can be called subsequently since it updates the array to
1467guarantee random numbers. The array should have been initialized before
04b9968b 1468initial use to obtain reproducible results.
b4012b75
UD
1469@end deftypefun
1470
1471@comment stdlib.h
1472@comment SVID
55c14926 1473@deftypefun {long int} lrand48 (void)
04b9968b 1474The @code{lrand48} function returns an integer value in the range of
b4012b75 1475@code{0} to @code{2^31} (exclusive). Even if the size of the @code{long
04b9968b 1476int} type can take more than 32 bits, no higher numbers are returned.
b4012b75
UD
1477The random bits are determined by the global state of the random number
1478generator in the C library.
1479@end deftypefun
1480
1481@comment stdlib.h
1482@comment SVID
1483@deftypefun {long int} nrand48 (unsigned short int @var{xsubi}[3])
1484This function is similar to the @code{lrand48} function in that it
1485returns a number in the range of @code{0} to @code{2^31} (exclusive) but
1486the state of the random number generator used to produce the random bits
1487is determined by the array provided as the parameter to the function.
1488
04b9968b
UD
1489The numbers in the array are updated afterwards so that subsequent calls
1490to this function yield different results (as is expected of a random
1491number generator). The array should have been initialized before the
1492first call to obtain reproducible results.
b4012b75
UD
1493@end deftypefun
1494
1495@comment stdlib.h
1496@comment SVID
55c14926 1497@deftypefun {long int} mrand48 (void)
b4012b75
UD
1498The @code{mrand48} function is similar to @code{lrand48}. The only
1499difference is that the numbers returned are in the range @code{-2^31} to
1500@code{2^31} (exclusive).
1501@end deftypefun
1502
1503@comment stdlib.h
1504@comment SVID
1505@deftypefun {long int} jrand48 (unsigned short int @var{xsubi}[3])
1506The @code{jrand48} function is similar to @code{nrand48}. The only
1507difference is that the numbers returned are in the range @code{-2^31} to
1508@code{2^31} (exclusive). For the @code{xsubi} parameter the same
1509requirements are necessary.
1510@end deftypefun
1511
1512The internal state of the random number generator can be initialized in
04b9968b 1513several ways. The methods differ in the completeness of the
b4012b75
UD
1514information provided.
1515
1516@comment stdlib.h
1517@comment SVID
04b9968b 1518@deftypefun void srand48 (long int @var{seedval})
b4012b75 1519The @code{srand48} function sets the most significant 32 bits of the
04b9968b 1520internal state of the random number generator to the least
f2ea0f5b
UD
1521significant 32 bits of the @var{seedval} parameter. The lower 16 bits
1522are initialized to the value @code{0x330E}. Even if the @code{long
04b9968b 1523int} type contains more than 32 bits only the lower 32 bits are used.
b4012b75 1524
04b9968b
UD
1525Owing to this limitation, initialization of the state of this
1526function is not very useful. But it makes it easy to use a construct
b4012b75
UD
1527like @code{srand48 (time (0))}.
1528
1529A side-effect of this function is that the values @code{a} and @code{c}
1530from the internal state, which are used in the congruential formula,
1531are reset to the default values given above. This is of importance once
04b9968b 1532the user has called the @code{lcong48} function (see below).
b4012b75
UD
1533@end deftypefun
1534
1535@comment stdlib.h
1536@comment SVID
1537@deftypefun {unsigned short int *} seed48 (unsigned short int @var{seed16v}[3])
1538The @code{seed48} function initializes all 48 bits of the state of the
04b9968b 1539internal random number generator from the contents of the parameter
b4012b75
UD
1540@var{seed16v}. Here the lower 16 bits of the first element of
1541@var{see16v} initialize the least significant 16 bits of the internal
1542state, the lower 16 bits of @code{@var{seed16v}[1]} initialize the mid-order
154316 bits of the state and the 16 lower bits of @code{@var{seed16v}[2]}
1544initialize the most significant 16 bits of the state.
1545
1546Unlike @code{srand48} this function lets the user initialize all 48 bits
1547of the state.
1548
1549The value returned by @code{seed48} is a pointer to an array containing
1550the values of the internal state before the change. This might be
1551useful to restart the random number generator at a certain state.
04b9968b 1552Otherwise the value can simply be ignored.
b4012b75
UD
1553
1554As for @code{srand48}, the values @code{a} and @code{c} from the
1555congruential formula are reset to the default values.
1556@end deftypefun
1557
1558There is one more function to initialize the random number generator
04b9968b
UD
1559which enables you to specify even more information by allowing you to
1560change the parameters in the congruential formula.
b4012b75
UD
1561
1562@comment stdlib.h
1563@comment SVID
1564@deftypefun void lcong48 (unsigned short int @var{param}[7])
1565The @code{lcong48} function allows the user to change the complete state
1566of the random number generator. Unlike @code{srand48} and
1567@code{seed48}, this function also changes the constants in the
1568congruential formula.
1569
1570From the seven elements in the array @var{param} the least significant
157116 bits of the entries @code{@var{param}[0]} to @code{@var{param}[2]}
04b9968b 1572determine the initial state, the least significant 16 bits of
b4012b75 1573@code{@var{param}[3]} to @code{@var{param}[5]} determine the 48 bit
04b9968b 1574constant @code{a} and @code{@var{param}[6]} determines the 16-bit value
b4012b75
UD
1575@code{c}.
1576@end deftypefun
1577
1578All the above functions have in common that they use the global
1579parameters for the congruential formula. In multi-threaded programs it
1580might sometimes be useful to have different parameters in different
1581threads. For this reason all the above functions have a counterpart
1582which works on a description of the random number generator in the
1583user-supplied buffer instead of the global state.
1584
1585Please note that it is no problem if several threads use the global
1586state if all threads use the functions which take a pointer to an array
1587containing the state. The random numbers are computed following the
1588same loop but if the state in the array is different all threads will
04b9968b 1589obtain an individual random number generator.
b4012b75 1590
04b9968b
UD
1591The user-supplied buffer must be of type @code{struct drand48_data}.
1592This type should be regarded as opaque and not manipulated directly.
b4012b75
UD
1593
1594@comment stdlib.h
1595@comment GNU
1596@deftypefun int drand48_r (struct drand48_data *@var{buffer}, double *@var{result})
1597This function is equivalent to the @code{drand48} function with the
04b9968b
UD
1598difference that it does not modify the global random number generator
1599parameters but instead the parameters in the buffer supplied through the
1600pointer @var{buffer}. The random number is returned in the variable
1601pointed to by @var{result}.
b4012b75 1602
04b9968b 1603The return value of the function indicates whether the call succeeded.
b4012b75
UD
1604If the value is less than @code{0} an error occurred and @var{errno} is
1605set to indicate the problem.
1606
1607This function is a GNU extension and should not be used in portable
1608programs.
1609@end deftypefun
1610
1611@comment stdlib.h
1612@comment GNU
1613@deftypefun int erand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, double *@var{result})
04b9968b
UD
1614The @code{erand48_r} function works like @code{erand48}, but in addition
1615it takes an argument @var{buffer} which describes the random number
1616generator. The state of the random number generator is taken from the
1617@code{xsubi} array, the parameters for the congruential formula from the
1618global random number generator data. The random number is returned in
1619the variable pointed to by @var{result}.
b4012b75 1620
04b9968b 1621The return value is non-negative if the call succeeded.
b4012b75
UD
1622
1623This function is a GNU extension and should not be used in portable
1624programs.
1625@end deftypefun
1626
1627@comment stdlib.h
1628@comment GNU
1629@deftypefun int lrand48_r (struct drand48_data *@var{buffer}, double *@var{result})
04b9968b
UD
1630This function is similar to @code{lrand48}, but in addition it takes a
1631pointer to a buffer describing the state of the random number generator
1632just like @code{drand48}.
b4012b75
UD
1633
1634If the return value of the function is non-negative the variable pointed
1635to by @var{result} contains the result. Otherwise an error occurred.
1636
1637This function is a GNU extension and should not be used in portable
1638programs.
1639@end deftypefun
1640
1641@comment stdlib.h
1642@comment GNU
1643@deftypefun int nrand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, long int *@var{result})
1644The @code{nrand48_r} function works like @code{nrand48} in that it
04b9968b 1645produces a random number in the range @code{0} to @code{2^31}. But instead
b4012b75
UD
1646of using the global parameters for the congruential formula it uses the
1647information from the buffer pointed to by @var{buffer}. The state is
1648described by the values in @var{xsubi}.
1649
1650If the return value is non-negative the variable pointed to by
1651@var{result} contains the result.
1652
1653This function is a GNU extension and should not be used in portable
1654programs.
1655@end deftypefun
1656
1657@comment stdlib.h
1658@comment GNU
1659@deftypefun int mrand48_r (struct drand48_data *@var{buffer}, double *@var{result})
04b9968b
UD
1660This function is similar to @code{mrand48} but like the other reentrant
1661functions it uses the random number generator described by the value in
b4012b75
UD
1662the buffer pointed to by @var{buffer}.
1663
1664If the return value is non-negative the variable pointed to by
1665@var{result} contains the result.
1666
1667This function is a GNU extension and should not be used in portable
1668programs.
1669@end deftypefun
1670
1671@comment stdlib.h
1672@comment GNU
1673@deftypefun int jrand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, long int *@var{result})
04b9968b 1674The @code{jrand48_r} function is similar to @code{jrand48}. Like the
b4012b75
UD
1675other reentrant functions of this function family it uses the
1676congruential formula parameters from the buffer pointed to by
1677@var{buffer}.
1678
1679If the return value is non-negative the variable pointed to by
1680@var{result} contains the result.
1681
1682This function is a GNU extension and should not be used in portable
1683programs.
1684@end deftypefun
1685
04b9968b
UD
1686Before any of the above functions are used the buffer of type
1687@code{struct drand48_data} should be initialized. The easiest way to do
1688this is to fill the whole buffer with null bytes, e.g. by
b4012b75
UD
1689
1690@smallexample
1691memset (buffer, '\0', sizeof (struct drand48_data));
1692@end smallexample
1693
1694@noindent
f2ea0f5b 1695Using any of the reentrant functions of this family now will
b4012b75
UD
1696automatically initialize the random number generator to the default
1697values for the state and the parameters of the congruential formula.
1698
04b9968b 1699The other possibility is to use any of the functions which explicitly
b4012b75 1700initialize the buffer. Though it might be obvious how to initialize the
04b9968b 1701buffer from looking at the parameter to the function, it is highly
b4012b75
UD
1702recommended to use these functions since the result might not always be
1703what you expect.
1704
1705@comment stdlib.h
1706@comment GNU
1707@deftypefun int srand48_r (long int @var{seedval}, struct drand48_data *@var{buffer})
1708The description of the random number generator represented by the
04b9968b 1709information in @var{buffer} is initialized similarly to what the function
f2ea0f5b
UD
1710@code{srand48} does. The state is initialized from the parameter
1711@var{seedval} and the parameters for the congruential formula are
04b9968b 1712initialized to their default values.
b4012b75
UD
1713
1714If the return value is non-negative the function call succeeded.
1715
1716This function is a GNU extension and should not be used in portable
1717programs.
1718@end deftypefun
1719
1720@comment stdlib.h
1721@comment GNU
1722@deftypefun int seed48_r (unsigned short int @var{seed16v}[3], struct drand48_data *@var{buffer})
1723This function is similar to @code{srand48_r} but like @code{seed48} it
1724initializes all 48 bits of the state from the parameter @var{seed16v}.
1725
1726If the return value is non-negative the function call succeeded. It
1727does not return a pointer to the previous state of the random number
04b9968b
UD
1728generator like the @code{seed48} function does. If the user wants to
1729preserve the state for a later re-run s/he can copy the whole buffer
b4012b75
UD
1730pointed to by @var{buffer}.
1731
1732This function is a GNU extension and should not be used in portable
1733programs.
1734@end deftypefun
1735
1736@comment stdlib.h
1737@comment GNU
1738@deftypefun int lcong48_r (unsigned short int @var{param}[7], struct drand48_data *@var{buffer})
1739This function initializes all aspects of the random number generator
04b9968b
UD
1740described in @var{buffer} with the data in @var{param}. Here it is
1741especially true that the function does more than just copying the
1742contents of @var{param} and @var{buffer}. More work is required and
1743therefore it is important to use this function rather than initializing
1744the random number generator directly.
b4012b75
UD
1745
1746If the return value is non-negative the function call succeeded.
1747
1748This function is a GNU extension and should not be used in portable
1749programs.
1750@end deftypefun
7a68c94a
UD
1751
1752@node FP Function Optimizations
1753@section Is Fast Code or Small Code preferred?
1754@cindex Optimization
1755
04b9968b
UD
1756If an application uses many floating point functions it is often the case
1757that the cost of the function calls themselves is not negligible.
1758Modern processors can often execute the operations themselves
1759very fast, but the function call disrupts the instruction pipeline.
7a68c94a
UD
1760
1761For this reason the GNU C Library provides optimizations for many of the
04b9968b
UD
1762frequently-used math functions. When GNU CC is used and the user
1763activates the optimizer, several new inline functions and macros are
7a68c94a 1764defined. These new functions and macros have the same names as the
04b9968b 1765library functions and so are used instead of the latter. In the case of
7a68c94a 1766inline functions the compiler will decide whether it is reasonable to
04b9968b 1767use them, and this decision is usually correct.
7a68c94a 1768
04b9968b
UD
1769This means that no calls to the library functions may be necessary, and
1770can increase the speed of generated code significantly. The drawback is
1771that code size will increase, and the increase is not always negligible.
7a68c94a 1772
aa847ee5
UD
1773The speed increase has one drawback: the inline functions might not set
1774@code{errno} and might not have the same precission as the library
1775functions.
1776
7a68c94a
UD
1777In cases where the inline functions and macros are not wanted the symbol
1778@code{__NO_MATH_INLINES} should be defined before any system header is
04b9968b
UD
1779included. This will ensure that only library functions are used. Of
1780course, it can be determined for each file in the project whether
1781giving this option is preferable or not.
1782
1783Not all hardware implements the entire @w{IEEE 754} standard, and even
1784if it does there may be a substantial performance penalty for using some
1785of its features. For example, enabling traps on some processors forces
1786the FPU to run un-pipelined, which can more than double calculation time.
7a68c94a 1787@c ***Add explanation of -lieee, -mieee.