]> git.ipfire.org Git - thirdparty/glibc.git/blame - manual/math.texi
Add getentropy, getrandom, <sys/random.h> [BZ #17252]
[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 &middot;
5@set infty &infin;
6@set pie &pi;
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
d52b6462 30@node Mathematics, Arithmetic, Syslog, 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
c941736c 1094.4BSD; therefore they are only defined if
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
1f77f049
JM
114All values are of type @code{double}. As an extension, @theglibc{}
115also defines these constants with type @code{long double}. The
7a68c94a
UD
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
1f77f049 124on C++. It infringes on the user's name space, so @theglibc{}
7a68c94a
UD
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})
27aaa791 160@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 161These functions return the sine of @var{x}, where @var{x} is given in
28f540f4
RM
162radians. The return value is in the range @code{-1} to @code{1}.
163@end deftypefun
164
165@comment math.h
f65fd747 166@comment ISO
28f540f4 167@deftypefun double cos (double @var{x})
4260bc74
UD
168@comment math.h
169@comment ISO
779ae82e 170@deftypefunx float cosf (float @var{x})
4260bc74
UD
171@comment math.h
172@comment ISO
779ae82e 173@deftypefunx {long double} cosl (long double @var{x})
27aaa791 174@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 175These functions return the cosine of @var{x}, where @var{x} is given in
28f540f4
RM
176radians. The return value is in the range @code{-1} to @code{1}.
177@end deftypefun
178
179@comment math.h
f65fd747 180@comment ISO
28f540f4 181@deftypefun double tan (double @var{x})
4260bc74
UD
182@comment math.h
183@comment ISO
779ae82e 184@deftypefunx float tanf (float @var{x})
4260bc74
UD
185@comment math.h
186@comment ISO
779ae82e 187@deftypefunx {long double} tanl (long double @var{x})
27aaa791 188@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 189These functions return the tangent of @var{x}, where @var{x} is given in
28f540f4
RM
190radians.
191
28f540f4
RM
192Mathematically, the tangent function has singularities at odd multiples
193of pi/2. If the argument @var{x} is too close to one of these
7a68c94a 194singularities, @code{tan} will signal overflow.
28f540f4
RM
195@end deftypefun
196
7a68c94a
UD
197In many applications where @code{sin} and @code{cos} are used, the sine
198and cosine of the same angle are needed at the same time. It is more
199efficient to compute them simultaneously, so the library provides a
200function to do that.
b4012b75
UD
201
202@comment math.h
203@comment GNU
204@deftypefun void sincos (double @var{x}, double *@var{sinx}, double *@var{cosx})
4260bc74
UD
205@comment math.h
206@comment GNU
779ae82e 207@deftypefunx void sincosf (float @var{x}, float *@var{sinx}, float *@var{cosx})
4260bc74
UD
208@comment math.h
209@comment GNU
779ae82e 210@deftypefunx void sincosl (long double @var{x}, long double *@var{sinx}, long double *@var{cosx})
27aaa791 211@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 212These functions return the sine of @var{x} in @code{*@var{sinx}} and the
60843ffb 213cosine of @var{x} in @code{*@var{cosx}}, where @var{x} is given in
b4012b75
UD
214radians. Both values, @code{*@var{sinx}} and @code{*@var{cosx}}, are in
215the range of @code{-1} to @code{1}.
ca34d7a7 216
7a68c94a
UD
217This function is a GNU extension. Portable programs should be prepared
218to cope with its absence.
b4012b75
UD
219@end deftypefun
220
221@cindex complex trigonometric functions
222
ec751a23 223@w{ISO C99} defines variants of the trig functions which work on
1f77f049 224complex numbers. @Theglibc{} provides these functions, but they
7a68c94a
UD
225are only useful if your compiler supports the new complex types defined
226by the standard.
ec751a23 227@c XXX Change this when gcc is fixed. -zw
7a68c94a
UD
228(As of this writing GCC supports complex numbers, but there are bugs in
229the implementation.)
b4012b75
UD
230
231@comment complex.h
232@comment ISO
233@deftypefun {complex double} csin (complex double @var{z})
4260bc74
UD
234@comment complex.h
235@comment ISO
779ae82e 236@deftypefunx {complex float} csinf (complex float @var{z})
4260bc74
UD
237@comment complex.h
238@comment ISO
779ae82e 239@deftypefunx {complex long double} csinl (complex long double @var{z})
27aaa791
AO
240@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
241@c There are calls to nan* that could trigger @mtslocale if they didn't get
242@c empty strings.
7a68c94a 243These functions return the complex sine of @var{z}.
b4012b75
UD
244The mathematical definition of the complex sine is
245
4c78249d 246@ifnottex
779ae82e 247@math{sin (z) = 1/(2*i) * (exp (z*i) - exp (-z*i))}.
4c78249d 248@end ifnottex
779ae82e
UD
249@tex
250$$\sin(z) = {1\over 2i} (e^{zi} - e^{-zi})$$
251@end tex
b4012b75
UD
252@end deftypefun
253
254@comment complex.h
255@comment ISO
256@deftypefun {complex double} ccos (complex double @var{z})
4260bc74
UD
257@comment complex.h
258@comment ISO
779ae82e 259@deftypefunx {complex float} ccosf (complex float @var{z})
4260bc74
UD
260@comment complex.h
261@comment ISO
779ae82e 262@deftypefunx {complex long double} ccosl (complex long double @var{z})
27aaa791 263@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a 264These functions return the complex cosine of @var{z}.
b4012b75
UD
265The mathematical definition of the complex cosine is
266
4c78249d 267@ifnottex
779ae82e 268@math{cos (z) = 1/2 * (exp (z*i) + exp (-z*i))}
4c78249d 269@end ifnottex
779ae82e
UD
270@tex
271$$\cos(z) = {1\over 2} (e^{zi} + e^{-zi})$$
272@end tex
b4012b75
UD
273@end deftypefun
274
275@comment complex.h
276@comment ISO
277@deftypefun {complex double} ctan (complex double @var{z})
4260bc74
UD
278@comment complex.h
279@comment ISO
779ae82e 280@deftypefunx {complex float} ctanf (complex float @var{z})
4260bc74
UD
281@comment complex.h
282@comment ISO
779ae82e 283@deftypefunx {complex long double} ctanl (complex long double @var{z})
27aaa791 284@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a 285These functions return the complex tangent of @var{z}.
b4012b75
UD
286The mathematical definition of the complex tangent is
287
4c78249d 288@ifnottex
7a68c94a 289@math{tan (z) = -i * (exp (z*i) - exp (-z*i)) / (exp (z*i) + exp (-z*i))}
4c78249d 290@end ifnottex
779ae82e 291@tex
7a68c94a 292$$\tan(z) = -i \cdot {e^{zi} - e^{-zi}\over e^{zi} + e^{-zi}}$$
779ae82e 293@end tex
7a68c94a
UD
294
295@noindent
296The complex tangent has poles at @math{pi/2 + 2n}, where @math{n} is an
297integer. @code{ctan} may signal overflow if @var{z} is too close to a
298pole.
b4012b75
UD
299@end deftypefun
300
28f540f4
RM
301
302@node Inverse Trig Functions
303@section Inverse Trigonometric Functions
6d52618b 304@cindex inverse trigonometric functions
28f540f4 305
60843ffb 306These are the usual arcsine, arccosine and arctangent functions,
04b9968b 307which are the inverses of the sine, cosine and tangent functions
28f540f4
RM
308respectively.
309
310@comment math.h
f65fd747 311@comment ISO
28f540f4 312@deftypefun double asin (double @var{x})
4260bc74
UD
313@comment math.h
314@comment ISO
779ae82e 315@deftypefunx float asinf (float @var{x})
4260bc74
UD
316@comment math.h
317@comment ISO
779ae82e 318@deftypefunx {long double} asinl (long double @var{x})
27aaa791 319@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
60843ffb 320These functions compute the arcsine of @var{x}---that is, the value whose
28f540f4
RM
321sine is @var{x}. The value is in units of radians. Mathematically,
322there are infinitely many such values; the one actually returned is the
323one between @code{-pi/2} and @code{pi/2} (inclusive).
324
60843ffb 325The arcsine function is defined mathematically only
7a68c94a
UD
326over the domain @code{-1} to @code{1}. If @var{x} is outside the
327domain, @code{asin} signals a domain error.
28f540f4
RM
328@end deftypefun
329
330@comment math.h
f65fd747 331@comment ISO
28f540f4 332@deftypefun double acos (double @var{x})
4260bc74
UD
333@comment math.h
334@comment ISO
779ae82e 335@deftypefunx float acosf (float @var{x})
4260bc74
UD
336@comment math.h
337@comment ISO
779ae82e 338@deftypefunx {long double} acosl (long double @var{x})
27aaa791 339@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
60843ffb 340These functions compute the arccosine of @var{x}---that is, the value
28f540f4
RM
341whose cosine is @var{x}. The value is in units of radians.
342Mathematically, there are infinitely many such values; the one actually
343returned is the one between @code{0} and @code{pi} (inclusive).
344
60843ffb 345The arccosine function is defined mathematically only
7a68c94a
UD
346over the domain @code{-1} to @code{1}. If @var{x} is outside the
347domain, @code{acos} signals a domain error.
28f540f4
RM
348@end deftypefun
349
28f540f4 350@comment math.h
f65fd747 351@comment ISO
28f540f4 352@deftypefun double atan (double @var{x})
4260bc74
UD
353@comment math.h
354@comment ISO
779ae82e 355@deftypefunx float atanf (float @var{x})
4260bc74
UD
356@comment math.h
357@comment ISO
779ae82e 358@deftypefunx {long double} atanl (long double @var{x})
27aaa791 359@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
60843ffb 360These functions compute the arctangent of @var{x}---that is, the value
28f540f4
RM
361whose tangent is @var{x}. The value is in units of radians.
362Mathematically, there are infinitely many such values; the one actually
7a68c94a 363returned is the one between @code{-pi/2} and @code{pi/2} (inclusive).
28f540f4
RM
364@end deftypefun
365
366@comment math.h
f65fd747 367@comment ISO
28f540f4 368@deftypefun double atan2 (double @var{y}, double @var{x})
4260bc74
UD
369@comment math.h
370@comment ISO
779ae82e 371@deftypefunx float atan2f (float @var{y}, float @var{x})
4260bc74
UD
372@comment math.h
373@comment ISO
779ae82e 374@deftypefunx {long double} atan2l (long double @var{y}, long double @var{x})
27aaa791 375@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
60843ffb 376This function computes the arctangent of @var{y}/@var{x}, but the signs
7a68c94a
UD
377of both arguments are used to determine the quadrant of the result, and
378@var{x} is permitted to be zero. The return value is given in radians
379and is in the range @code{-pi} to @code{pi}, inclusive.
28f540f4
RM
380
381If @var{x} and @var{y} are coordinates of a point in the plane,
382@code{atan2} returns the signed angle between the line from the origin
383to that point and the x-axis. Thus, @code{atan2} is useful for
384converting Cartesian coordinates to polar coordinates. (To compute the
385radial coordinate, use @code{hypot}; see @ref{Exponents and
386Logarithms}.)
387
7a68c94a
UD
388@c This is experimentally true. Should it be so? -zw
389If both @var{x} and @var{y} are zero, @code{atan2} returns zero.
28f540f4
RM
390@end deftypefun
391
b4012b75 392@cindex inverse complex trigonometric functions
ec751a23 393@w{ISO C99} defines complex versions of the inverse trig functions.
b4012b75
UD
394
395@comment complex.h
396@comment ISO
397@deftypefun {complex double} casin (complex double @var{z})
4260bc74
UD
398@comment complex.h
399@comment ISO
779ae82e 400@deftypefunx {complex float} casinf (complex float @var{z})
4260bc74
UD
401@comment complex.h
402@comment ISO
779ae82e 403@deftypefunx {complex long double} casinl (complex long double @var{z})
27aaa791 404@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
60843ffb 405These functions compute the complex arcsine of @var{z}---that is, the
7a68c94a 406value whose sine is @var{z}. The value returned is in radians.
b4012b75 407
7a68c94a
UD
408Unlike the real-valued functions, @code{casin} is defined for all
409values of @var{z}.
b4012b75
UD
410@end deftypefun
411
412@comment complex.h
413@comment ISO
414@deftypefun {complex double} cacos (complex double @var{z})
4260bc74
UD
415@comment complex.h
416@comment ISO
779ae82e 417@deftypefunx {complex float} cacosf (complex float @var{z})
4260bc74
UD
418@comment complex.h
419@comment ISO
779ae82e 420@deftypefunx {complex long double} cacosl (complex long double @var{z})
27aaa791 421@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
60843ffb 422These functions compute the complex arccosine of @var{z}---that is, the
7a68c94a 423value whose cosine is @var{z}. The value returned is in radians.
b4012b75 424
7a68c94a
UD
425Unlike the real-valued functions, @code{cacos} is defined for all
426values of @var{z}.
b4012b75
UD
427@end deftypefun
428
429
430@comment complex.h
431@comment ISO
432@deftypefun {complex double} catan (complex double @var{z})
4260bc74
UD
433@comment complex.h
434@comment ISO
779ae82e 435@deftypefunx {complex float} catanf (complex float @var{z})
4260bc74
UD
436@comment complex.h
437@comment ISO
779ae82e 438@deftypefunx {complex long double} catanl (complex long double @var{z})
27aaa791 439@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
60843ffb 440These functions compute the complex arctangent of @var{z}---that is,
b4012b75
UD
441the value whose tangent is @var{z}. The value is in units of radians.
442@end deftypefun
443
28f540f4
RM
444
445@node Exponents and Logarithms
446@section Exponentiation and Logarithms
447@cindex exponentiation functions
448@cindex power functions
449@cindex logarithm functions
450
451@comment math.h
f65fd747 452@comment ISO
28f540f4 453@deftypefun double exp (double @var{x})
4260bc74
UD
454@comment math.h
455@comment ISO
779ae82e 456@deftypefunx float expf (float @var{x})
4260bc74
UD
457@comment math.h
458@comment ISO
779ae82e 459@deftypefunx {long double} expl (long double @var{x})
27aaa791 460@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
461These functions compute @code{e} (the base of natural logarithms) raised
462to the power @var{x}.
28f540f4 463
7a68c94a
UD
464If the magnitude of the result is too large to be representable,
465@code{exp} signals overflow.
28f540f4
RM
466@end deftypefun
467
b4012b75
UD
468@comment math.h
469@comment ISO
04a96fd4 470@deftypefun double exp2 (double @var{x})
4260bc74
UD
471@comment math.h
472@comment ISO
04a96fd4 473@deftypefunx float exp2f (float @var{x})
4260bc74
UD
474@comment math.h
475@comment ISO
04a96fd4 476@deftypefunx {long double} exp2l (long double @var{x})
27aaa791 477@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a 478These functions compute @code{2} raised to the power @var{x}.
04a96fd4 479Mathematically, @code{exp2 (x)} is the same as @code{exp (x * log (2))}.
b4012b75
UD
480@end deftypefun
481
482@comment math.h
412cb261 483@comment ISO
04a96fd4 484@deftypefun double exp10 (double @var{x})
4260bc74 485@comment math.h
412cb261 486@comment ISO
04a96fd4 487@deftypefunx float exp10f (float @var{x})
4260bc74 488@comment math.h
412cb261 489@comment ISO
04a96fd4 490@deftypefunx {long double} exp10l (long double @var{x})
4260bc74
UD
491@comment math.h
492@comment GNU
04a96fd4 493@deftypefunx double pow10 (double @var{x})
4260bc74
UD
494@comment math.h
495@comment GNU
04a96fd4 496@deftypefunx float pow10f (float @var{x})
4260bc74
UD
497@comment math.h
498@comment GNU
04a96fd4 499@deftypefunx {long double} pow10l (long double @var{x})
27aaa791 500@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
501These functions compute @code{10} raised to the power @var{x}.
502Mathematically, @code{exp10 (x)} is the same as @code{exp (x * log (10))}.
b4012b75 503
412cb261
JM
504The @code{exp10} functions are from TS 18661-4:2015; the @code{pow10}
505names are GNU extensions. The name @code{exp10} is
7a68c94a 506preferred, since it is analogous to @code{exp} and @code{exp2}.
b4012b75
UD
507@end deftypefun
508
509
28f540f4 510@comment math.h
f65fd747 511@comment ISO
28f540f4 512@deftypefun double log (double @var{x})
4260bc74
UD
513@comment math.h
514@comment ISO
f2ea0f5b 515@deftypefunx float logf (float @var{x})
4260bc74
UD
516@comment math.h
517@comment ISO
779ae82e 518@deftypefunx {long double} logl (long double @var{x})
27aaa791 519@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a 520These functions compute the natural logarithm of @var{x}. @code{exp (log
28f540f4
RM
521(@var{x}))} equals @var{x}, exactly in mathematics and approximately in
522C.
523
7a68c94a
UD
524If @var{x} is negative, @code{log} signals a domain error. If @var{x}
525is zero, it returns negative infinity; if @var{x} is too close to zero,
526it may signal overflow.
28f540f4
RM
527@end deftypefun
528
529@comment math.h
f65fd747 530@comment ISO
28f540f4 531@deftypefun double log10 (double @var{x})
4260bc74
UD
532@comment math.h
533@comment ISO
779ae82e 534@deftypefunx float log10f (float @var{x})
4260bc74
UD
535@comment math.h
536@comment ISO
779ae82e 537@deftypefunx {long double} log10l (long double @var{x})
27aaa791 538@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a 539These functions return the base-10 logarithm of @var{x}.
28f540f4 540@code{log10 (@var{x})} equals @code{log (@var{x}) / log (10)}.
7a68c94a 541
28f540f4
RM
542@end deftypefun
543
b4012b75
UD
544@comment math.h
545@comment ISO
546@deftypefun double log2 (double @var{x})
4260bc74
UD
547@comment math.h
548@comment ISO
779ae82e 549@deftypefunx float log2f (float @var{x})
4260bc74
UD
550@comment math.h
551@comment ISO
779ae82e 552@deftypefunx {long double} log2l (long double @var{x})
27aaa791 553@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a 554These functions return the base-2 logarithm of @var{x}.
b4012b75
UD
555@code{log2 (@var{x})} equals @code{log (@var{x}) / log (2)}.
556@end deftypefun
557
55c14926
UD
558@comment math.h
559@comment ISO
560@deftypefun double logb (double @var{x})
4260bc74
UD
561@comment math.h
562@comment ISO
55c14926 563@deftypefunx float logbf (float @var{x})
4260bc74
UD
564@comment math.h
565@comment ISO
55c14926 566@deftypefunx {long double} logbl (long double @var{x})
27aaa791 567@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
55c14926 568These functions extract the exponent of @var{x} and return it as a
7a68c94a
UD
569floating-point value. If @code{FLT_RADIX} is two, @code{logb} is equal
570to @code{floor (log2 (x))}, except it's probably faster.
55c14926 571
04b9968b 572If @var{x} is de-normalized, @code{logb} returns the exponent @var{x}
7a68c94a
UD
573would have if it were normalized. If @var{x} is infinity (positive or
574negative), @code{logb} returns @math{@infinity{}}. If @var{x} is zero,
575@code{logb} returns @math{@infinity{}}. It does not signal.
55c14926
UD
576@end deftypefun
577
578@comment math.h
579@comment ISO
580@deftypefun int ilogb (double @var{x})
4260bc74
UD
581@comment math.h
582@comment ISO
55c14926 583@deftypefunx int ilogbf (float @var{x})
4260bc74
UD
584@comment math.h
585@comment ISO
55c14926 586@deftypefunx int ilogbl (long double @var{x})
55a38f82
JM
587@comment math.h
588@comment ISO
589@deftypefunx {long int} llogb (double @var{x})
590@comment math.h
591@comment ISO
592@deftypefunx {long int} llogbf (float @var{x})
593@comment math.h
594@comment ISO
595@deftypefunx {long int} llogbl (long double @var{x})
27aaa791 596@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
55c14926 597These functions are equivalent to the corresponding @code{logb}
55a38f82
JM
598functions except that they return signed integer values. The
599@code{ilogb} functions are from ISO C99; the @code{llogb} functions
600are from TS 18661-1:2014.
7a68c94a
UD
601@end deftypefun
602
603@noindent
604Since integers cannot represent infinity and NaN, @code{ilogb} instead
605returns an integer that can't be the exponent of a normal floating-point
606number. @file{math.h} defines constants so you can check for this.
607
608@comment math.h
609@comment ISO
610@deftypevr Macro int FP_ILOGB0
611@code{ilogb} returns this value if its argument is @code{0}. The
612numeric value is either @code{INT_MIN} or @code{-INT_MAX}.
613
ec751a23 614This macro is defined in @w{ISO C99}.
7a68c94a
UD
615@end deftypevr
616
55a38f82
JM
617@comment math.h
618@comment ISO
619@deftypevr Macro {long int} FP_LLOGB0
620@code{llogb} returns this value if its argument is @code{0}. The
621numeric value is either @code{LONG_MIN} or @code{-LONG_MAX}.
622
623This macro is defined in TS 18661-1:2014.
624@end deftypevr
625
7a68c94a
UD
626@comment math.h
627@comment ISO
628@deftypevr Macro int FP_ILOGBNAN
629@code{ilogb} returns this value if its argument is @code{NaN}. The
630numeric value is either @code{INT_MIN} or @code{INT_MAX}.
631
ec751a23 632This macro is defined in @w{ISO C99}.
7a68c94a
UD
633@end deftypevr
634
55a38f82
JM
635@comment math.h
636@comment ISO
637@deftypevr Macro {long int} FP_LLOGBNAN
638@code{llogb} returns this value if its argument is @code{NaN}. The
639numeric value is either @code{LONG_MIN} or @code{LONG_MAX}.
640
641This macro is defined in TS 18661-1:2014.
642@end deftypevr
643
7a68c94a
UD
644These values are system specific. They might even be the same. The
645proper way to test the result of @code{ilogb} is as follows:
55c14926
UD
646
647@smallexample
648i = ilogb (f);
649if (i == FP_ILOGB0 || i == FP_ILOGBNAN)
650 @{
651 if (isnan (f))
652 @{
653 /* @r{Handle NaN.} */
654 @}
655 else if (f == 0.0)
656 @{
657 /* @r{Handle 0.0.} */
658 @}
659 else
660 @{
661 /* @r{Some other value with large exponent,}
662 @r{perhaps +Inf.} */
663 @}
664 @}
665@end smallexample
666
28f540f4 667@comment math.h
f65fd747 668@comment ISO
28f540f4 669@deftypefun double pow (double @var{base}, double @var{power})
4260bc74
UD
670@comment math.h
671@comment ISO
779ae82e 672@deftypefunx float powf (float @var{base}, float @var{power})
4260bc74
UD
673@comment math.h
674@comment ISO
779ae82e 675@deftypefunx {long double} powl (long double @var{base}, long double @var{power})
27aaa791 676@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 677These are general exponentiation functions, returning @var{base} raised
28f540f4
RM
678to @var{power}.
679
7a68c94a
UD
680Mathematically, @code{pow} would return a complex number when @var{base}
681is negative and @var{power} is not an integral value. @code{pow} can't
682do that, so instead it signals a domain error. @code{pow} may also
683underflow or overflow the destination type.
28f540f4
RM
684@end deftypefun
685
686@cindex square root function
687@comment math.h
f65fd747 688@comment ISO
28f540f4 689@deftypefun double sqrt (double @var{x})
4260bc74
UD
690@comment math.h
691@comment ISO
779ae82e 692@deftypefunx float sqrtf (float @var{x})
4260bc74
UD
693@comment math.h
694@comment ISO
779ae82e 695@deftypefunx {long double} sqrtl (long double @var{x})
27aaa791 696@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 697These functions return the nonnegative square root of @var{x}.
28f540f4 698
7a68c94a
UD
699If @var{x} is negative, @code{sqrt} signals a domain error.
700Mathematically, it should return a complex number.
28f540f4
RM
701@end deftypefun
702
703@cindex cube root function
704@comment math.h
705@comment BSD
706@deftypefun double cbrt (double @var{x})
4260bc74
UD
707@comment math.h
708@comment BSD
779ae82e 709@deftypefunx float cbrtf (float @var{x})
4260bc74
UD
710@comment math.h
711@comment BSD
779ae82e 712@deftypefunx {long double} cbrtl (long double @var{x})
27aaa791 713@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 714These functions return the cube root of @var{x}. They cannot
28f540f4
RM
715fail; every representable real value has a representable real cube root.
716@end deftypefun
717
718@comment math.h
b4012b75 719@comment ISO
28f540f4 720@deftypefun double hypot (double @var{x}, double @var{y})
4260bc74
UD
721@comment math.h
722@comment ISO
779ae82e 723@deftypefunx float hypotf (float @var{x}, float @var{y})
4260bc74
UD
724@comment math.h
725@comment ISO
779ae82e 726@deftypefunx {long double} hypotl (long double @var{x}, long double @var{y})
27aaa791 727@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 728These functions return @code{sqrt (@var{x}*@var{x} +
7a68c94a 729@var{y}*@var{y})}. This is the length of the hypotenuse of a right
28f540f4 730triangle with sides of length @var{x} and @var{y}, or the distance
7a68c94a
UD
731of the point (@var{x}, @var{y}) from the origin. Using this function
732instead of the direct formula is wise, since the error is
b4012b75 733much smaller. See also the function @code{cabs} in @ref{Absolute Value}.
28f540f4
RM
734@end deftypefun
735
736@comment math.h
b4012b75 737@comment ISO
28f540f4 738@deftypefun double expm1 (double @var{x})
4260bc74
UD
739@comment math.h
740@comment ISO
779ae82e 741@deftypefunx float expm1f (float @var{x})
4260bc74
UD
742@comment math.h
743@comment ISO
779ae82e 744@deftypefunx {long double} expm1l (long double @var{x})
27aaa791 745@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 746These functions return a value equivalent to @code{exp (@var{x}) - 1}.
7a68c94a 747They are computed in a way that is accurate even if @var{x} is
04b9968b 748near zero---a case where @code{exp (@var{x}) - 1} would be inaccurate owing
28f540f4
RM
749to subtraction of two numbers that are nearly equal.
750@end deftypefun
751
752@comment math.h
b4012b75 753@comment ISO
28f540f4 754@deftypefun double log1p (double @var{x})
4260bc74
UD
755@comment math.h
756@comment ISO
779ae82e 757@deftypefunx float log1pf (float @var{x})
4260bc74
UD
758@comment math.h
759@comment ISO
779ae82e 760@deftypefunx {long double} log1pl (long double @var{x})
27aaa791 761@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
60843ffb 762These functions return a value equivalent to @w{@code{log (1 + @var{x})}}.
7a68c94a 763They are computed in a way that is accurate even if @var{x} is
28f540f4
RM
764near zero.
765@end deftypefun
766
b4012b75
UD
767@cindex complex exponentiation functions
768@cindex complex logarithm functions
769
ec751a23 770@w{ISO C99} defines complex variants of some of the exponentiation and
7a68c94a 771logarithm functions.
b4012b75
UD
772
773@comment complex.h
774@comment ISO
775@deftypefun {complex double} cexp (complex double @var{z})
4260bc74
UD
776@comment complex.h
777@comment ISO
779ae82e 778@deftypefunx {complex float} cexpf (complex float @var{z})
4260bc74
UD
779@comment complex.h
780@comment ISO
779ae82e 781@deftypefunx {complex long double} cexpl (complex long double @var{z})
27aaa791 782@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
783These functions return @code{e} (the base of natural
784logarithms) raised to the power of @var{z}.
04b9968b 785Mathematically, this corresponds to the value
b4012b75 786
4c78249d 787@ifnottex
779ae82e 788@math{exp (z) = exp (creal (z)) * (cos (cimag (z)) + I * sin (cimag (z)))}
4c78249d 789@end ifnottex
779ae82e 790@tex
7a68c94a 791$$\exp(z) = e^z = e^{{\rm Re}\,z} (\cos ({\rm Im}\,z) + i \sin ({\rm Im}\,z))$$
779ae82e 792@end tex
b4012b75
UD
793@end deftypefun
794
795@comment complex.h
796@comment ISO
797@deftypefun {complex double} clog (complex double @var{z})
4260bc74
UD
798@comment complex.h
799@comment ISO
779ae82e 800@deftypefunx {complex float} clogf (complex float @var{z})
4260bc74
UD
801@comment complex.h
802@comment ISO
779ae82e 803@deftypefunx {complex long double} clogl (complex long double @var{z})
27aaa791 804@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a 805These functions return the natural logarithm of @var{z}.
04b9968b 806Mathematically, this corresponds to the value
b4012b75 807
4c78249d 808@ifnottex
779ae82e 809@math{log (z) = log (cabs (z)) + I * carg (z)}
4c78249d 810@end ifnottex
779ae82e 811@tex
7a68c94a 812$$\log(z) = \log |z| + i \arg z$$
779ae82e 813@end tex
7a68c94a
UD
814
815@noindent
816@code{clog} has a pole at 0, and will signal overflow if @var{z} equals
817or is very close to 0. It is well-defined for all other values of
818@var{z}.
b4012b75
UD
819@end deftypefun
820
dfd2257a
UD
821
822@comment complex.h
823@comment GNU
824@deftypefun {complex double} clog10 (complex double @var{z})
4260bc74
UD
825@comment complex.h
826@comment GNU
dfd2257a 827@deftypefunx {complex float} clog10f (complex float @var{z})
4260bc74
UD
828@comment complex.h
829@comment GNU
dfd2257a 830@deftypefunx {complex long double} clog10l (complex long double @var{z})
27aaa791 831@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
dfd2257a 832These functions return the base 10 logarithm of the complex value
cf822e3c 833@var{z}. Mathematically, this corresponds to the value
dfd2257a 834
4c78249d 835@ifnottex
6adaeadf 836@math{log10 (z) = log10 (cabs (z)) + I * carg (z) / log (10)}
4c78249d 837@end ifnottex
dfd2257a 838@tex
6adaeadf 839$$\log_{10}(z) = \log_{10}|z| + i \arg z / \log (10)$$
dfd2257a 840@end tex
dfd2257a 841
7a68c94a 842These functions are GNU extensions.
dfd2257a
UD
843@end deftypefun
844
b4012b75
UD
845@comment complex.h
846@comment ISO
847@deftypefun {complex double} csqrt (complex double @var{z})
4260bc74
UD
848@comment complex.h
849@comment ISO
779ae82e 850@deftypefunx {complex float} csqrtf (complex float @var{z})
4260bc74
UD
851@comment complex.h
852@comment ISO
779ae82e 853@deftypefunx {complex long double} csqrtl (complex long double @var{z})
27aaa791 854@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
855These functions return the complex square root of the argument @var{z}. Unlike
856the real-valued functions, they are defined for all values of @var{z}.
b4012b75
UD
857@end deftypefun
858
859@comment complex.h
860@comment ISO
861@deftypefun {complex double} cpow (complex double @var{base}, complex double @var{power})
4260bc74
UD
862@comment complex.h
863@comment ISO
779ae82e 864@deftypefunx {complex float} cpowf (complex float @var{base}, complex float @var{power})
4260bc74
UD
865@comment complex.h
866@comment ISO
779ae82e 867@deftypefunx {complex long double} cpowl (complex long double @var{base}, complex long double @var{power})
27aaa791 868@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
869These functions return @var{base} raised to the power of
870@var{power}. This is equivalent to @w{@code{cexp (y * clog (x))}}
b4012b75
UD
871@end deftypefun
872
28f540f4
RM
873@node Hyperbolic Functions
874@section Hyperbolic Functions
875@cindex hyperbolic functions
876
877The functions in this section are related to the exponential functions;
878see @ref{Exponents and Logarithms}.
879
880@comment math.h
f65fd747 881@comment ISO
28f540f4 882@deftypefun double sinh (double @var{x})
4260bc74
UD
883@comment math.h
884@comment ISO
779ae82e 885@deftypefunx float sinhf (float @var{x})
4260bc74
UD
886@comment math.h
887@comment ISO
779ae82e 888@deftypefunx {long double} sinhl (long double @var{x})
27aaa791 889@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 890These functions return the hyperbolic sine of @var{x}, defined
7a68c94a
UD
891mathematically as @w{@code{(exp (@var{x}) - exp (-@var{x})) / 2}}. They
892may signal overflow if @var{x} is too large.
28f540f4
RM
893@end deftypefun
894
895@comment math.h
f65fd747 896@comment ISO
28f540f4 897@deftypefun double cosh (double @var{x})
4260bc74
UD
898@comment math.h
899@comment ISO
779ae82e 900@deftypefunx float coshf (float @var{x})
4260bc74
UD
901@comment math.h
902@comment ISO
779ae82e 903@deftypefunx {long double} coshl (long double @var{x})
27aaa791 904@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
60843ffb 905These functions return the hyperbolic cosine of @var{x},
b4012b75 906defined mathematically as @w{@code{(exp (@var{x}) + exp (-@var{x})) / 2}}.
7a68c94a 907They may signal overflow if @var{x} is too large.
28f540f4
RM
908@end deftypefun
909
910@comment math.h
f65fd747 911@comment ISO
28f540f4 912@deftypefun double tanh (double @var{x})
4260bc74
UD
913@comment math.h
914@comment ISO
779ae82e 915@deftypefunx float tanhf (float @var{x})
4260bc74
UD
916@comment math.h
917@comment ISO
779ae82e 918@deftypefunx {long double} tanhl (long double @var{x})
27aaa791 919@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
920These functions return the hyperbolic tangent of @var{x},
921defined mathematically as @w{@code{sinh (@var{x}) / cosh (@var{x})}}.
922They may signal overflow if @var{x} is too large.
28f540f4
RM
923@end deftypefun
924
b4012b75
UD
925@cindex hyperbolic functions
926
7a68c94a
UD
927There are counterparts for the hyperbolic functions which take
928complex arguments.
b4012b75
UD
929
930@comment complex.h
931@comment ISO
932@deftypefun {complex double} csinh (complex double @var{z})
4260bc74
UD
933@comment complex.h
934@comment ISO
779ae82e 935@deftypefunx {complex float} csinhf (complex float @var{z})
4260bc74
UD
936@comment complex.h
937@comment ISO
779ae82e 938@deftypefunx {complex long double} csinhl (complex long double @var{z})
27aaa791 939@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 940These functions return the complex hyperbolic sine of @var{z}, defined
7a68c94a 941mathematically as @w{@code{(exp (@var{z}) - exp (-@var{z})) / 2}}.
b4012b75
UD
942@end deftypefun
943
944@comment complex.h
945@comment ISO
946@deftypefun {complex double} ccosh (complex double @var{z})
4260bc74
UD
947@comment complex.h
948@comment ISO
779ae82e 949@deftypefunx {complex float} ccoshf (complex float @var{z})
4260bc74
UD
950@comment complex.h
951@comment ISO
779ae82e 952@deftypefunx {complex long double} ccoshl (complex long double @var{z})
27aaa791 953@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 954These functions return the complex hyperbolic cosine of @var{z}, defined
7a68c94a 955mathematically as @w{@code{(exp (@var{z}) + exp (-@var{z})) / 2}}.
b4012b75
UD
956@end deftypefun
957
958@comment complex.h
959@comment ISO
960@deftypefun {complex double} ctanh (complex double @var{z})
4260bc74
UD
961@comment complex.h
962@comment ISO
779ae82e 963@deftypefunx {complex float} ctanhf (complex float @var{z})
4260bc74
UD
964@comment complex.h
965@comment ISO
779ae82e 966@deftypefunx {complex long double} ctanhl (complex long double @var{z})
27aaa791 967@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
968These functions return the complex hyperbolic tangent of @var{z},
969defined mathematically as @w{@code{csinh (@var{z}) / ccosh (@var{z})}}.
b4012b75
UD
970@end deftypefun
971
972
28f540f4
RM
973@cindex inverse hyperbolic functions
974
975@comment math.h
b4012b75 976@comment ISO
28f540f4 977@deftypefun double asinh (double @var{x})
4260bc74
UD
978@comment math.h
979@comment ISO
779ae82e 980@deftypefunx float asinhf (float @var{x})
4260bc74
UD
981@comment math.h
982@comment ISO
779ae82e 983@deftypefunx {long double} asinhl (long double @var{x})
27aaa791 984@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 985These functions return the inverse hyperbolic sine of @var{x}---the
28f540f4
RM
986value whose hyperbolic sine is @var{x}.
987@end deftypefun
988
989@comment math.h
b4012b75 990@comment ISO
28f540f4 991@deftypefun double acosh (double @var{x})
4260bc74
UD
992@comment math.h
993@comment ISO
779ae82e 994@deftypefunx float acoshf (float @var{x})
4260bc74
UD
995@comment math.h
996@comment ISO
779ae82e 997@deftypefunx {long double} acoshl (long double @var{x})
27aaa791 998@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 999These functions return the inverse hyperbolic cosine of @var{x}---the
28f540f4 1000value whose hyperbolic cosine is @var{x}. If @var{x} is less than
7a68c94a 1001@code{1}, @code{acosh} signals a domain error.
28f540f4
RM
1002@end deftypefun
1003
1004@comment math.h
b4012b75 1005@comment ISO
28f540f4 1006@deftypefun double atanh (double @var{x})
4260bc74
UD
1007@comment math.h
1008@comment ISO
779ae82e 1009@deftypefunx float atanhf (float @var{x})
4260bc74
UD
1010@comment math.h
1011@comment ISO
779ae82e 1012@deftypefunx {long double} atanhl (long double @var{x})
27aaa791 1013@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75 1014These functions return the inverse hyperbolic tangent of @var{x}---the
28f540f4 1015value whose hyperbolic tangent is @var{x}. If the absolute value of
7a68c94a
UD
1016@var{x} is greater than @code{1}, @code{atanh} signals a domain error;
1017if it is equal to 1, @code{atanh} returns infinity.
28f540f4
RM
1018@end deftypefun
1019
b4012b75
UD
1020@cindex inverse complex hyperbolic functions
1021
1022@comment complex.h
1023@comment ISO
1024@deftypefun {complex double} casinh (complex double @var{z})
4260bc74
UD
1025@comment complex.h
1026@comment ISO
779ae82e 1027@deftypefunx {complex float} casinhf (complex float @var{z})
4260bc74
UD
1028@comment complex.h
1029@comment ISO
779ae82e 1030@deftypefunx {complex long double} casinhl (complex long double @var{z})
27aaa791 1031@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75
UD
1032These functions return the inverse complex hyperbolic sine of
1033@var{z}---the value whose complex hyperbolic sine is @var{z}.
1034@end deftypefun
1035
1036@comment complex.h
1037@comment ISO
1038@deftypefun {complex double} cacosh (complex double @var{z})
4260bc74
UD
1039@comment complex.h
1040@comment ISO
779ae82e 1041@deftypefunx {complex float} cacoshf (complex float @var{z})
4260bc74
UD
1042@comment complex.h
1043@comment ISO
779ae82e 1044@deftypefunx {complex long double} cacoshl (complex long double @var{z})
27aaa791 1045@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75
UD
1046These functions return the inverse complex hyperbolic cosine of
1047@var{z}---the value whose complex hyperbolic cosine is @var{z}. Unlike
7a68c94a 1048the real-valued functions, there are no restrictions on the value of @var{z}.
b4012b75
UD
1049@end deftypefun
1050
1051@comment complex.h
1052@comment ISO
1053@deftypefun {complex double} catanh (complex double @var{z})
4260bc74
UD
1054@comment complex.h
1055@comment ISO
779ae82e 1056@deftypefunx {complex float} catanhf (complex float @var{z})
4260bc74
UD
1057@comment complex.h
1058@comment ISO
779ae82e 1059@deftypefunx {complex long double} catanhl (complex long double @var{z})
27aaa791 1060@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
b4012b75
UD
1061These functions return the inverse complex hyperbolic tangent of
1062@var{z}---the value whose complex hyperbolic tangent is @var{z}. Unlike
7a68c94a
UD
1063the real-valued functions, there are no restrictions on the value of
1064@var{z}.
b4012b75
UD
1065@end deftypefun
1066
7a68c94a
UD
1067@node Special Functions
1068@section Special Functions
1069@cindex special functions
1070@cindex Bessel functions
1071@cindex gamma function
1072
04b9968b 1073These are some more exotic mathematical functions which are sometimes
7a68c94a
UD
1074useful. Currently they only have real-valued versions.
1075
1076@comment math.h
1077@comment SVID
1078@deftypefun double erf (double @var{x})
4260bc74
UD
1079@comment math.h
1080@comment SVID
7a68c94a 1081@deftypefunx float erff (float @var{x})
4260bc74
UD
1082@comment math.h
1083@comment SVID
7a68c94a 1084@deftypefunx {long double} erfl (long double @var{x})
27aaa791 1085@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
1086@code{erf} returns the error function of @var{x}. The error
1087function is defined as
1088@tex
1089$$\hbox{erf}(x) = {2\over\sqrt{\pi}}\cdot\int_0^x e^{-t^2} \hbox{d}t$$
1090@end tex
1091@ifnottex
1092@smallexample
1093erf (x) = 2/sqrt(pi) * integral from 0 to x of exp(-t^2) dt
1094@end smallexample
1095@end ifnottex
1096@end deftypefun
1097
1098@comment math.h
1099@comment SVID
1100@deftypefun double erfc (double @var{x})
4260bc74
UD
1101@comment math.h
1102@comment SVID
7a68c94a 1103@deftypefunx float erfcf (float @var{x})
4260bc74
UD
1104@comment math.h
1105@comment SVID
7a68c94a 1106@deftypefunx {long double} erfcl (long double @var{x})
27aaa791 1107@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
1108@code{erfc} returns @code{1.0 - erf(@var{x})}, but computed in a
1109fashion that avoids round-off error when @var{x} is large.
1110@end deftypefun
1111
1112@comment math.h
1113@comment SVID
1114@deftypefun double lgamma (double @var{x})
4260bc74
UD
1115@comment math.h
1116@comment SVID
7a68c94a 1117@deftypefunx float lgammaf (float @var{x})
4260bc74
UD
1118@comment math.h
1119@comment SVID
7a68c94a 1120@deftypefunx {long double} lgammal (long double @var{x})
27aaa791 1121@safety{@prelim{}@mtunsafe{@mtasurace{:signgam}}@asunsafe{}@acsafe{}}
7a68c94a
UD
1122@code{lgamma} returns the natural logarithm of the absolute value of
1123the gamma function of @var{x}. The gamma function is defined as
1124@tex
1125$$\Gamma(x) = \int_0^\infty t^{x-1} e^{-t} \hbox{d}t$$
1126@end tex
1127@ifnottex
1128@smallexample
1129gamma (x) = integral from 0 to @infinity{} of t^(x-1) e^-t dt
1130@end smallexample
1131@end ifnottex
1132
1133@vindex signgam
1134The sign of the gamma function is stored in the global variable
1135@var{signgam}, which is declared in @file{math.h}. It is @code{1} if
04b9968b 1136the intermediate result was positive or zero, or @code{-1} if it was
7a68c94a
UD
1137negative.
1138
e852e889
UD
1139To compute the real gamma function you can use the @code{tgamma}
1140function or you can compute the values as follows:
7a68c94a
UD
1141@smallexample
1142lgam = lgamma(x);
1143gam = signgam*exp(lgam);
1144@end smallexample
1145
04b9968b 1146The gamma function has singularities at the non-positive integers.
7a68c94a
UD
1147@code{lgamma} will raise the zero divide exception if evaluated at a
1148singularity.
1149@end deftypefun
1150
1151@comment math.h
1152@comment XPG
07435eb4 1153@deftypefun double lgamma_r (double @var{x}, int *@var{signp})
4260bc74
UD
1154@comment math.h
1155@comment XPG
07435eb4 1156@deftypefunx float lgammaf_r (float @var{x}, int *@var{signp})
4260bc74
UD
1157@comment math.h
1158@comment XPG
07435eb4 1159@deftypefunx {long double} lgammal_r (long double @var{x}, int *@var{signp})
27aaa791 1160@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
1161@code{lgamma_r} is just like @code{lgamma}, but it stores the sign of
1162the intermediate result in the variable pointed to by @var{signp}
04b9968b 1163instead of in the @var{signgam} global. This means it is reentrant.
7a68c94a
UD
1164@end deftypefun
1165
7a68c94a
UD
1166@comment math.h
1167@comment SVID
1168@deftypefun double gamma (double @var{x})
4260bc74
UD
1169@comment math.h
1170@comment SVID
7a68c94a 1171@deftypefunx float gammaf (float @var{x})
4260bc74
UD
1172@comment math.h
1173@comment SVID
7a68c94a 1174@deftypefunx {long double} gammal (long double @var{x})
27aaa791 1175@safety{@prelim{}@mtunsafe{@mtasurace{:signgam}}@asunsafe{}@acsafe{}}
e852e889
UD
1176These functions exist for compatibility reasons. They are equivalent to
1177@code{lgamma} etc. It is better to use @code{lgamma} since for one the
60843ffb 1178name reflects better the actual computation, and moreover @code{lgamma} is
ec751a23 1179standardized in @w{ISO C99} while @code{gamma} is not.
e852e889
UD
1180@end deftypefun
1181
1182@comment math.h
ec751a23 1183@comment XPG, ISO
e852e889 1184@deftypefun double tgamma (double @var{x})
4260bc74 1185@comment math.h
ec751a23 1186@comment XPG, ISO
e852e889 1187@deftypefunx float tgammaf (float @var{x})
4260bc74 1188@comment math.h
ec751a23 1189@comment XPG, ISO
e852e889 1190@deftypefunx {long double} tgammal (long double @var{x})
27aaa791 1191@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
e852e889
UD
1192@code{tgamma} applies the gamma function to @var{x}. The gamma
1193function is defined as
1194@tex
1195$$\Gamma(x) = \int_0^\infty t^{x-1} e^{-t} \hbox{d}t$$
1196@end tex
1197@ifnottex
1198@smallexample
1199gamma (x) = integral from 0 to @infinity{} of t^(x-1) e^-t dt
1200@end smallexample
1201@end ifnottex
1202
ec751a23 1203This function was introduced in @w{ISO C99}.
7a68c94a 1204@end deftypefun
7a68c94a
UD
1205
1206@comment math.h
1207@comment SVID
1208@deftypefun double j0 (double @var{x})
4260bc74
UD
1209@comment math.h
1210@comment SVID
7a68c94a 1211@deftypefunx float j0f (float @var{x})
4260bc74
UD
1212@comment math.h
1213@comment SVID
7a68c94a 1214@deftypefunx {long double} j0l (long double @var{x})
27aaa791 1215@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
1216@code{j0} returns the Bessel function of the first kind of order 0 of
1217@var{x}. It may signal underflow if @var{x} is too large.
1218@end deftypefun
1219
1220@comment math.h
1221@comment SVID
1222@deftypefun double j1 (double @var{x})
4260bc74
UD
1223@comment math.h
1224@comment SVID
7a68c94a 1225@deftypefunx float j1f (float @var{x})
4260bc74
UD
1226@comment math.h
1227@comment SVID
7a68c94a 1228@deftypefunx {long double} j1l (long double @var{x})
27aaa791 1229@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
1230@code{j1} returns the Bessel function of the first kind of order 1 of
1231@var{x}. It may signal underflow if @var{x} is too large.
1232@end deftypefun
1233
1234@comment math.h
1235@comment SVID
cc6e48bc 1236@deftypefun double jn (int @var{n}, double @var{x})
4260bc74
UD
1237@comment math.h
1238@comment SVID
cc6e48bc 1239@deftypefunx float jnf (int @var{n}, float @var{x})
4260bc74
UD
1240@comment math.h
1241@comment SVID
cc6e48bc 1242@deftypefunx {long double} jnl (int @var{n}, long double @var{x})
27aaa791 1243@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
1244@code{jn} returns the Bessel function of the first kind of order
1245@var{n} of @var{x}. It may signal underflow if @var{x} is too large.
1246@end deftypefun
1247
1248@comment math.h
1249@comment SVID
1250@deftypefun double y0 (double @var{x})
4260bc74
UD
1251@comment math.h
1252@comment SVID
7a68c94a 1253@deftypefunx float y0f (float @var{x})
4260bc74
UD
1254@comment math.h
1255@comment SVID
7a68c94a 1256@deftypefunx {long double} y0l (long double @var{x})
27aaa791 1257@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
1258@code{y0} returns the Bessel function of the second kind of order 0 of
1259@var{x}. It may signal underflow if @var{x} is too large. If @var{x}
1260is negative, @code{y0} signals a domain error; if it is zero,
1261@code{y0} signals overflow and returns @math{-@infinity}.
1262@end deftypefun
1263
1264@comment math.h
1265@comment SVID
1266@deftypefun double y1 (double @var{x})
4260bc74
UD
1267@comment math.h
1268@comment SVID
7a68c94a 1269@deftypefunx float y1f (float @var{x})
4260bc74
UD
1270@comment math.h
1271@comment SVID
7a68c94a 1272@deftypefunx {long double} y1l (long double @var{x})
27aaa791 1273@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
1274@code{y1} returns the Bessel function of the second kind of order 1 of
1275@var{x}. It may signal underflow if @var{x} is too large. If @var{x}
1276is negative, @code{y1} signals a domain error; if it is zero,
1277@code{y1} signals overflow and returns @math{-@infinity}.
1278@end deftypefun
1279
1280@comment math.h
1281@comment SVID
cc6e48bc 1282@deftypefun double yn (int @var{n}, double @var{x})
4260bc74
UD
1283@comment math.h
1284@comment SVID
cc6e48bc 1285@deftypefunx float ynf (int @var{n}, float @var{x})
4260bc74
UD
1286@comment math.h
1287@comment SVID
cc6e48bc 1288@deftypefunx {long double} ynl (int @var{n}, long double @var{x})
27aaa791 1289@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
7a68c94a
UD
1290@code{yn} returns the Bessel function of the second kind of order @var{n} of
1291@var{x}. It may signal underflow if @var{x} is too large. If @var{x}
1292is negative, @code{yn} signals a domain error; if it is zero,
1293@code{yn} signals overflow and returns @math{-@infinity}.
1294@end deftypefun
55c14926 1295
aaa1276e
UD
1296@node Errors in Math Functions
1297@section Known Maximum Errors in Math Functions
1298@cindex math errors
1299@cindex ulps
1300
1301This section lists the known errors of the functions in the math
1302library. Errors are measured in ``units of the last place''. This is a
1303measure for the relative error. For a number @math{z} with the
1304representation @math{d.d@dots{}d@mul{}2^e} (we assume IEEE
1305floating-point numbers with base 2) the ULP is represented by
1306
1307@tex
ec751a23 1308$${|d.d\dots d - (z/2^e)|}\over {2^{p-1}}$$
aaa1276e
UD
1309@end tex
1310@ifnottex
1311@smallexample
1312|d.d...d - (z / 2^e)| / 2^(p - 1)
1313@end smallexample
1314@end ifnottex
1315
1316@noindent
1317where @math{p} is the number of bits in the mantissa of the
1318floating-point number representation. Ideally the error for all
7475aef5
JM
1319functions is always less than 0.5ulps in round-to-nearest mode. Using
1320rounding bits this is also
1321possible and normally implemented for the basic operations. Except
1322for certain functions such as @code{sqrt}, @code{fma} and @code{rint}
1323whose results are fully specified by reference to corresponding IEEE
1324754 floating-point operations, and conversions between strings and
1325floating point, @theglibc{} does not aim for correctly rounded results
1326for functions in the math library, and does not aim for correctness in
1327whether ``inexact'' exceptions are raised. Instead, the goals for
1328accuracy of functions without fully specified results are as follows;
1329some functions have bugs meaning they do not meet these goals in all
60843ffb 1330cases. In the future, @theglibc{} may provide some other correctly
7475aef5
JM
1331rounding functions under the names such as @code{crsin} proposed for
1332an extension to ISO C.
1333
1334@itemize @bullet
1335
1336@item
1337Each function with a floating-point result behaves as if it computes
1338an infinite-precision result that is within a few ulp (in both real
1339and complex parts, for functions with complex results) of the
1340mathematically correct value of the function (interpreted together
1341with ISO C or POSIX semantics for the function in question) at the
1342exact value passed as the input. Exceptions are raised appropriately
1343for this value and in accordance with IEEE 754 / ISO C / POSIX
1344semantics, and it is then rounded according to the current rounding
1345direction to the result that is returned to the user. @code{errno}
18a218b7
JM
1346may also be set (@pxref{Math Error Reporting}). (The ``inexact''
1347exception may be raised, or not raised, even if this is inconsistent
1348with the infinite-precision value.)
7475aef5
JM
1349
1350@item
1351For the IBM @code{long double} format, as used on PowerPC GNU/Linux,
1352the accuracy goal is weaker for input values not exactly representable
1353in 106 bits of precision; it is as if the input value is some value
1354within 0.5ulp of the value actually passed, where ``ulp'' is
1355interpreted in terms of a fixed-precision 106-bit mantissa, but not
1356necessarily the exact value actually passed with discontiguous
1357mantissa bits.
1358
b55b28e6
JM
1359@item
1360For the IBM @code{long double} format, functions whose results are
1361fully specified by reference to corresponding IEEE 754 floating-point
1362operations have the same accuracy goals as other functions, but with
1363the error bound being the same as that for division (3ulp).
1364Furthermore, ``inexact'' and ``underflow'' exceptions may be raised
1365for all functions for any inputs, even where such exceptions are
1366inconsistent with the returned value, since the underlying
1367floating-point arithmetic has that property.
1368
7475aef5
JM
1369@item
1370Functions behave as if the infinite-precision result computed is zero,
1371infinity or NaN if and only if that is the mathematically correct
1372infinite-precision result. They behave as if the infinite-precision
1373result computed always has the same sign as the mathematically correct
1374result.
1375
1376@item
1377If the mathematical result is more than a few ulp above the overflow
1378threshold for the current rounding direction, the value returned is
1379the appropriate overflow value for the current rounding direction,
1380with the overflow exception raised.
1381
1382@item
1383If the mathematical result has magnitude well below half the least
1384subnormal magnitude, the returned value is either zero or the least
1385subnormal (in each case, with the correct sign), according to the
1386current rounding direction and with the underflow exception raised.
1387
1388@item
18a218b7
JM
1389Where the mathematical result underflows (before rounding) and is not
1390exactly representable as a floating-point value, the function does not
1391behave as if the computed infinite-precision result is an exact value
1392in the subnormal range. This means that the underflow exception is
1393raised other than possibly for cases where the mathematical result is
1394very close to the underflow threshold and the function behaves as if
1395it computes an infinite-precision result that does not underflow. (So
1396there may be spurious underflow exceptions in cases where the
1397underflowing result is exact, but not missing underflow exceptions in
1398cases where it is inexact.)
7475aef5
JM
1399
1400@item
1401@Theglibc{} does not aim for functions to satisfy other properties of
1402the underlying mathematical function, such as monotonicity, where not
1403implied by the above goals.
1404
1405@item
1406All the above applies to both real and complex parts, for complex
1407functions.
1408
1409@end itemize
aaa1276e
UD
1410
1411Therefore many of the functions in the math library have errors. The
1412table lists the maximum error for each function which is exposed by one
41713d4e
AJ
1413of the existing tests in the test suite. The table tries to cover as much
1414as possible and list the actual maximum error (or at least a ballpark
aaa1276e
UD
1415figure) but this is often not achieved due to the large search space.
1416
1417The table lists the ULP values for different architectures. Different
1418architectures have different results since their hardware support for
1419floating-point operations varies and also the existing hardware support
1420is different.
1421
41713d4e
AJ
1422@page
1423@c This multitable does not fit on a single page
aaa1276e
UD
1424@include libm-err.texi
1425
28f540f4
RM
1426@node Pseudo-Random Numbers
1427@section Pseudo-Random Numbers
1428@cindex random numbers
1429@cindex pseudo-random numbers
1430@cindex seed (for random numbers)
1431
1432This section describes the GNU facilities for generating a series of
1433pseudo-random numbers. The numbers generated are not truly random;
7a68c94a
UD
1434typically, they form a sequence that repeats periodically, with a period
1435so large that you can ignore it for ordinary purposes. The random
1436number generator works by remembering a @dfn{seed} value which it uses
1437to compute the next random number and also to compute a new seed.
28f540f4
RM
1438
1439Although the generated numbers look unpredictable within one run of a
1440program, the sequence of numbers is @emph{exactly the same} from one run
1441to the next. This is because the initial seed is always the same. This
1442is convenient when you are debugging a program, but it is unhelpful if
7a68c94a
UD
1443you want the program to behave unpredictably. If you want a different
1444pseudo-random series each time your program runs, you must specify a
1445different seed each time. For ordinary purposes, basing the seed on the
92dcaa3e
FW
1446current time works well. For random numbers in cryptography,
1447@pxref{Unpredictable Bytes}.
28f540f4 1448
04b9968b 1449You can obtain repeatable sequences of numbers on a particular machine type
28f540f4
RM
1450by specifying the same initial seed value for the random number
1451generator. There is no standard meaning for a particular seed value;
1452the same seed, used in different C libraries or on different CPU types,
1453will give you different random numbers.
1454
1f77f049 1455@Theglibc{} supports the standard @w{ISO C} random number functions
7a68c94a
UD
1456plus two other sets derived from BSD and SVID. The BSD and @w{ISO C}
1457functions provide identical, somewhat limited functionality. If only a
1458small number of random bits are required, we recommend you use the
1459@w{ISO C} interface, @code{rand} and @code{srand}. The SVID functions
1460provide a more flexible interface, which allows better random number
1461generator algorithms, provides more random bits (up to 48) per call, and
1462can provide random floating-point numbers. These functions are required
1463by the XPG standard and therefore will be present in all modern Unix
1464systems.
28f540f4
RM
1465
1466@menu
7a68c94a
UD
1467* ISO Random:: @code{rand} and friends.
1468* BSD Random:: @code{random} and friends.
1469* SVID Random:: @code{drand48} and friends.
28f540f4
RM
1470@end menu
1471
f65fd747
UD
1472@node ISO Random
1473@subsection ISO C Random Number Functions
28f540f4
RM
1474
1475This section describes the random number functions that are part of
f65fd747 1476the @w{ISO C} standard.
28f540f4
RM
1477
1478To use these facilities, you should include the header file
1479@file{stdlib.h} in your program.
1480@pindex stdlib.h
1481
1482@comment stdlib.h
f65fd747 1483@comment ISO
28f540f4 1484@deftypevr Macro int RAND_MAX
7a68c94a 1485The value of this macro is an integer constant representing the largest
1f77f049 1486value the @code{rand} function can return. In @theglibc{}, it is
7a68c94a
UD
1487@code{2147483647}, which is the largest signed integer representable in
148832 bits. In other libraries, it may be as low as @code{32767}.
28f540f4
RM
1489@end deftypevr
1490
1491@comment stdlib.h
f65fd747 1492@comment ISO
ca34d7a7 1493@deftypefun int rand (void)
27aaa791
AO
1494@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
1495@c Just calls random.
28f540f4 1496The @code{rand} function returns the next pseudo-random number in the
7a68c94a 1497series. The value ranges from @code{0} to @code{RAND_MAX}.
28f540f4
RM
1498@end deftypefun
1499
1500@comment stdlib.h
f65fd747 1501@comment ISO
28f540f4 1502@deftypefun void srand (unsigned int @var{seed})
27aaa791
AO
1503@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
1504@c Alias to srandom.
28f540f4
RM
1505This function establishes @var{seed} as the seed for a new series of
1506pseudo-random numbers. If you call @code{rand} before a seed has been
1507established with @code{srand}, it uses the value @code{1} as a default
1508seed.
1509
7a68c94a
UD
1510To produce a different pseudo-random series each time your program is
1511run, do @code{srand (time (0))}.
28f540f4
RM
1512@end deftypefun
1513
7a68c94a
UD
1514POSIX.1 extended the C standard functions to support reproducible random
1515numbers in multi-threaded programs. However, the extension is badly
1516designed and unsuitable for serious work.
61eb22d3
UD
1517
1518@comment stdlib.h
1519@comment POSIX.1
1520@deftypefun int rand_r (unsigned int *@var{seed})
27aaa791 1521@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
61eb22d3 1522This function returns a random number in the range 0 to @code{RAND_MAX}
7a68c94a
UD
1523just as @code{rand} does. However, all its state is stored in the
1524@var{seed} argument. This means the RNG's state can only have as many
1525bits as the type @code{unsigned int} has. This is far too few to
1526provide a good RNG.
61eb22d3 1527
7a68c94a
UD
1528If your program requires a reentrant RNG, we recommend you use the
1529reentrant GNU extensions to the SVID random number generator. The
1530POSIX.1 interface should only be used when the GNU extensions are not
1531available.
61eb22d3
UD
1532@end deftypefun
1533
1534
28f540f4
RM
1535@node BSD Random
1536@subsection BSD Random Number Functions
1537
1538This section describes a set of random number generation functions that
1539are derived from BSD. There is no advantage to using these functions
1f77f049 1540with @theglibc{}; we support them for BSD compatibility only.
28f540f4
RM
1541
1542The prototypes for these functions are in @file{stdlib.h}.
1543@pindex stdlib.h
1544
1545@comment stdlib.h
1546@comment BSD
0423ee17 1547@deftypefun {long int} random (void)
27aaa791
AO
1548@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
1549@c Takes a lock and calls random_r with an automatic variable and the
1550@c global state, while holding a lock.
28f540f4 1551This function returns the next pseudo-random number in the sequence.
8c5c2600 1552The value returned ranges from @code{0} to @code{2147483647}.
ca34d7a7 1553
48b22986 1554@strong{NB:} Temporarily this function was defined to return a
0423ee17
UD
1555@code{int32_t} value to indicate that the return value always contains
155632 bits even if @code{long int} is wider. The standard demands it
1557differently. Users must always be aware of the 32-bit limitation,
1558though.
28f540f4
RM
1559@end deftypefun
1560
1561@comment stdlib.h
1562@comment BSD
1563@deftypefun void srandom (unsigned int @var{seed})
27aaa791
AO
1564@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
1565@c Takes a lock and calls srandom_r with an automatic variable and a
1566@c static buffer. There's no MT-safety issue because the static buffer
1567@c is internally protected by a lock, although other threads may modify
1568@c the set state before it is used.
7a68c94a
UD
1569The @code{srandom} function sets the state of the random number
1570generator based on the integer @var{seed}. If you supply a @var{seed} value
28f540f4
RM
1571of @code{1}, this will cause @code{random} to reproduce the default set
1572of random numbers.
1573
7a68c94a
UD
1574To produce a different set of pseudo-random numbers each time your
1575program runs, do @code{srandom (time (0))}.
28f540f4
RM
1576@end deftypefun
1577
1578@comment stdlib.h
1579@comment BSD
8ded91fb 1580@deftypefun {char *} initstate (unsigned int @var{seed}, char *@var{state}, size_t @var{size})
27aaa791 1581@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
28f540f4
RM
1582The @code{initstate} function is used to initialize the random number
1583generator state. The argument @var{state} is an array of @var{size}
7a68c94a
UD
1584bytes, used to hold the state information. It is initialized based on
1585@var{seed}. The size must be between 8 and 256 bytes, and should be a
1586power of two. The bigger the @var{state} array, the better.
28f540f4
RM
1587
1588The return value is the previous value of the state information array.
1589You can use this value later as an argument to @code{setstate} to
1590restore that state.
1591@end deftypefun
1592
1593@comment stdlib.h
1594@comment BSD
8ded91fb 1595@deftypefun {char *} setstate (char *@var{state})
27aaa791 1596@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
28f540f4
RM
1597The @code{setstate} function restores the random number state
1598information @var{state}. The argument must have been the result of
2c6fe0bd 1599a previous call to @var{initstate} or @var{setstate}.
28f540f4
RM
1600
1601The return value is the previous value of the state information array.
f2ea0f5b 1602You can use this value later as an argument to @code{setstate} to
28f540f4 1603restore that state.
a785f6c5
UD
1604
1605If the function fails the return value is @code{NULL}.
28f540f4 1606@end deftypefun
b4012b75 1607
4c78249d
UD
1608The four functions described so far in this section all work on a state
1609which is shared by all threads. The state is not directly accessible to
1610the user and can only be modified by these functions. This makes it
1611hard to deal with situations where each thread should have its own
1612pseudo-random number generator.
1613
1f77f049 1614@Theglibc{} contains four additional functions which contain the
4c78249d 1615state as an explicit parameter and therefore make it possible to handle
60843ffb 1616thread-local PRNGs. Besides this there is no difference. In fact, the
4c78249d
UD
1617four functions already discussed are implemented internally using the
1618following interfaces.
1619
1620The @file{stdlib.h} header contains a definition of the following type:
1621
1622@comment stdlib.h
1623@comment GNU
1624@deftp {Data Type} {struct random_data}
1625
1626Objects of type @code{struct random_data} contain the information
1627necessary to represent the state of the PRNG. Although a complete
1628definition of the type is present the type should be treated as opaque.
1629@end deftp
1630
1631The functions modifying the state follow exactly the already described
1632functions.
1633
1634@comment stdlib.h
1635@comment GNU
1636@deftypefun int random_r (struct random_data *restrict @var{buf}, int32_t *restrict @var{result})
27aaa791 1637@safety{@prelim{}@mtsafe{@mtsrace{:buf}}@assafe{}@acunsafe{@acucorrupt{}}}
4c78249d
UD
1638The @code{random_r} function behaves exactly like the @code{random}
1639function except that it uses and modifies the state in the object
1640pointed to by the first parameter instead of the global state.
1641@end deftypefun
1642
1643@comment stdlib.h
1644@comment GNU
1645@deftypefun int srandom_r (unsigned int @var{seed}, struct random_data *@var{buf})
27aaa791 1646@safety{@prelim{}@mtsafe{@mtsrace{:buf}}@assafe{}@acunsafe{@acucorrupt{}}}
4c78249d
UD
1647The @code{srandom_r} function behaves exactly like the @code{srandom}
1648function except that it uses and modifies the state in the object
1649pointed to by the second parameter instead of the global state.
1650@end deftypefun
1651
1652@comment stdlib.h
1653@comment GNU
1654@deftypefun int initstate_r (unsigned int @var{seed}, char *restrict @var{statebuf}, size_t @var{statelen}, struct random_data *restrict @var{buf})
27aaa791 1655@safety{@prelim{}@mtsafe{@mtsrace{:buf}}@assafe{}@acunsafe{@acucorrupt{}}}
4c78249d
UD
1656The @code{initstate_r} function behaves exactly like the @code{initstate}
1657function except that it uses and modifies the state in the object
1658pointed to by the fourth parameter instead of the global state.
1659@end deftypefun
1660
1661@comment stdlib.h
1662@comment GNU
1663@deftypefun int setstate_r (char *restrict @var{statebuf}, struct random_data *restrict @var{buf})
27aaa791 1664@safety{@prelim{}@mtsafe{@mtsrace{:buf}}@assafe{}@acunsafe{@acucorrupt{}}}
4c78249d
UD
1665The @code{setstate_r} function behaves exactly like the @code{setstate}
1666function except that it uses and modifies the state in the object
1667pointed to by the first parameter instead of the global state.
1668@end deftypefun
1669
b4012b75
UD
1670@node SVID Random
1671@subsection SVID Random Number Function
1672
1673The C library on SVID systems contains yet another kind of random number
1674generator functions. They use a state of 48 bits of data. The user can
7a68c94a 1675choose among a collection of functions which return the random bits
b4012b75
UD
1676in different forms.
1677
04b9968b 1678Generally there are two kinds of function. The first uses a state of
b4012b75 1679the random number generator which is shared among several functions and
04b9968b
UD
1680by all threads of the process. The second requires the user to handle
1681the state.
b4012b75
UD
1682
1683All functions have in common that they use the same congruential
1684formula with the same constants. The formula is
1685
1686@smallexample
1687Y = (a * X + c) mod m
1688@end smallexample
1689
1690@noindent
1691where @var{X} is the state of the generator at the beginning and
1692@var{Y} the state at the end. @code{a} and @code{c} are constants
04b9968b 1693determining the way the generator works. By default they are
b4012b75
UD
1694
1695@smallexample
1696a = 0x5DEECE66D = 25214903917
1697c = 0xb = 11
1698@end smallexample
1699
1700@noindent
1701but they can also be changed by the user. @code{m} is of course 2^48
04b9968b 1702since the state consists of a 48-bit array.
b4012b75 1703
f2615995
UD
1704The prototypes for these functions are in @file{stdlib.h}.
1705@pindex stdlib.h
1706
b4012b75
UD
1707
1708@comment stdlib.h
1709@comment SVID
55c14926 1710@deftypefun double drand48 (void)
27aaa791
AO
1711@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
1712@c Uses of the static state buffer are not guarded by a lock (thus
1713@c @mtasurace:drand48), so they may be found or left at a
1714@c partially-updated state in case of calls from within signal handlers
1715@c or cancellation. None of this will break safety rules or invoke
1716@c undefined behavior, but it may affect randomness.
b4012b75
UD
1717This function returns a @code{double} value in the range of @code{0.0}
1718to @code{1.0} (exclusive). The random bits are determined by the global
1719state of the random number generator in the C library.
1720
04b9968b 1721Since the @code{double} type according to @w{IEEE 754} has a 52-bit
b4012b75
UD
1722mantissa this means 4 bits are not initialized by the random number
1723generator. These are (of course) chosen to be the least significant
1724bits and they are initialized to @code{0}.
1725@end deftypefun
1726
1727@comment stdlib.h
1728@comment SVID
1729@deftypefun double erand48 (unsigned short int @var{xsubi}[3])
27aaa791
AO
1730@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
1731@c The static buffer is just initialized with default parameters, which
1732@c are later read to advance the state held in xsubi.
b4012b75 1733This function returns a @code{double} value in the range of @code{0.0}
04b9968b 1734to @code{1.0} (exclusive), similarly to @code{drand48}. The argument is
b4012b75
UD
1735an array describing the state of the random number generator.
1736
1737This function can be called subsequently since it updates the array to
1738guarantee random numbers. The array should have been initialized before
04b9968b 1739initial use to obtain reproducible results.
b4012b75
UD
1740@end deftypefun
1741
1742@comment stdlib.h
1743@comment SVID
55c14926 1744@deftypefun {long int} lrand48 (void)
27aaa791 1745@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
04b9968b 1746The @code{lrand48} function returns an integer value in the range of
b4012b75 1747@code{0} to @code{2^31} (exclusive). Even if the size of the @code{long
04b9968b 1748int} type can take more than 32 bits, no higher numbers are returned.
b4012b75
UD
1749The random bits are determined by the global state of the random number
1750generator in the C library.
1751@end deftypefun
1752
1753@comment stdlib.h
1754@comment SVID
1755@deftypefun {long int} nrand48 (unsigned short int @var{xsubi}[3])
27aaa791 1756@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
b4012b75
UD
1757This function is similar to the @code{lrand48} function in that it
1758returns a number in the range of @code{0} to @code{2^31} (exclusive) but
1759the state of the random number generator used to produce the random bits
1760is determined by the array provided as the parameter to the function.
1761
04b9968b
UD
1762The numbers in the array are updated afterwards so that subsequent calls
1763to this function yield different results (as is expected of a random
1764number generator). The array should have been initialized before the
1765first call to obtain reproducible results.
b4012b75
UD
1766@end deftypefun
1767
1768@comment stdlib.h
1769@comment SVID
55c14926 1770@deftypefun {long int} mrand48 (void)
27aaa791 1771@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
b4012b75
UD
1772The @code{mrand48} function is similar to @code{lrand48}. The only
1773difference is that the numbers returned are in the range @code{-2^31} to
1774@code{2^31} (exclusive).
1775@end deftypefun
1776
1777@comment stdlib.h
1778@comment SVID
1779@deftypefun {long int} jrand48 (unsigned short int @var{xsubi}[3])
27aaa791 1780@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
b4012b75
UD
1781The @code{jrand48} function is similar to @code{nrand48}. The only
1782difference is that the numbers returned are in the range @code{-2^31} to
1783@code{2^31} (exclusive). For the @code{xsubi} parameter the same
1784requirements are necessary.
1785@end deftypefun
1786
1787The internal state of the random number generator can be initialized in
04b9968b 1788several ways. The methods differ in the completeness of the
b4012b75
UD
1789information provided.
1790
1791@comment stdlib.h
1792@comment SVID
04b9968b 1793@deftypefun void srand48 (long int @var{seedval})
27aaa791 1794@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
b4012b75 1795The @code{srand48} function sets the most significant 32 bits of the
04b9968b 1796internal state of the random number generator to the least
f2ea0f5b
UD
1797significant 32 bits of the @var{seedval} parameter. The lower 16 bits
1798are initialized to the value @code{0x330E}. Even if the @code{long
04b9968b 1799int} type contains more than 32 bits only the lower 32 bits are used.
b4012b75 1800
04b9968b
UD
1801Owing to this limitation, initialization of the state of this
1802function is not very useful. But it makes it easy to use a construct
b4012b75
UD
1803like @code{srand48 (time (0))}.
1804
1805A side-effect of this function is that the values @code{a} and @code{c}
1806from the internal state, which are used in the congruential formula,
1807are reset to the default values given above. This is of importance once
04b9968b 1808the user has called the @code{lcong48} function (see below).
b4012b75
UD
1809@end deftypefun
1810
1811@comment stdlib.h
1812@comment SVID
1813@deftypefun {unsigned short int *} seed48 (unsigned short int @var{seed16v}[3])
27aaa791 1814@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
b4012b75 1815The @code{seed48} function initializes all 48 bits of the state of the
04b9968b 1816internal random number generator from the contents of the parameter
b4012b75 1817@var{seed16v}. Here the lower 16 bits of the first element of
60843ffb 1818@var{seed16v} initialize the least significant 16 bits of the internal
b4012b75
UD
1819state, the lower 16 bits of @code{@var{seed16v}[1]} initialize the mid-order
182016 bits of the state and the 16 lower bits of @code{@var{seed16v}[2]}
1821initialize the most significant 16 bits of the state.
1822
1823Unlike @code{srand48} this function lets the user initialize all 48 bits
1824of the state.
1825
1826The value returned by @code{seed48} is a pointer to an array containing
1827the values of the internal state before the change. This might be
1828useful to restart the random number generator at a certain state.
04b9968b 1829Otherwise the value can simply be ignored.
b4012b75
UD
1830
1831As for @code{srand48}, the values @code{a} and @code{c} from the
1832congruential formula are reset to the default values.
1833@end deftypefun
1834
1835There is one more function to initialize the random number generator
04b9968b
UD
1836which enables you to specify even more information by allowing you to
1837change the parameters in the congruential formula.
b4012b75
UD
1838
1839@comment stdlib.h
1840@comment SVID
1841@deftypefun void lcong48 (unsigned short int @var{param}[7])
27aaa791 1842@safety{@prelim{}@mtunsafe{@mtasurace{:drand48}}@asunsafe{}@acunsafe{@acucorrupt{}}}
b4012b75
UD
1843The @code{lcong48} function allows the user to change the complete state
1844of the random number generator. Unlike @code{srand48} and
1845@code{seed48}, this function also changes the constants in the
1846congruential formula.
1847
1848From the seven elements in the array @var{param} the least significant
184916 bits of the entries @code{@var{param}[0]} to @code{@var{param}[2]}
04b9968b 1850determine the initial state, the least significant 16 bits of
b4012b75 1851@code{@var{param}[3]} to @code{@var{param}[5]} determine the 48 bit
04b9968b 1852constant @code{a} and @code{@var{param}[6]} determines the 16-bit value
b4012b75
UD
1853@code{c}.
1854@end deftypefun
1855
1856All the above functions have in common that they use the global
1857parameters for the congruential formula. In multi-threaded programs it
1858might sometimes be useful to have different parameters in different
1859threads. For this reason all the above functions have a counterpart
1860which works on a description of the random number generator in the
1861user-supplied buffer instead of the global state.
1862
1863Please note that it is no problem if several threads use the global
1864state if all threads use the functions which take a pointer to an array
1865containing the state. The random numbers are computed following the
1866same loop but if the state in the array is different all threads will
04b9968b 1867obtain an individual random number generator.
b4012b75 1868
04b9968b
UD
1869The user-supplied buffer must be of type @code{struct drand48_data}.
1870This type should be regarded as opaque and not manipulated directly.
b4012b75
UD
1871
1872@comment stdlib.h
1873@comment GNU
1874@deftypefun int drand48_r (struct drand48_data *@var{buffer}, double *@var{result})
27aaa791 1875@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
b4012b75 1876This function is equivalent to the @code{drand48} function with the
04b9968b
UD
1877difference that it does not modify the global random number generator
1878parameters but instead the parameters in the buffer supplied through the
1879pointer @var{buffer}. The random number is returned in the variable
1880pointed to by @var{result}.
b4012b75 1881
04b9968b 1882The return value of the function indicates whether the call succeeded.
b4012b75
UD
1883If the value is less than @code{0} an error occurred and @var{errno} is
1884set to indicate the problem.
1885
1886This function is a GNU extension and should not be used in portable
1887programs.
1888@end deftypefun
1889
1890@comment stdlib.h
1891@comment GNU
1892@deftypefun int erand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, double *@var{result})
27aaa791 1893@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
04b9968b
UD
1894The @code{erand48_r} function works like @code{erand48}, but in addition
1895it takes an argument @var{buffer} which describes the random number
1896generator. The state of the random number generator is taken from the
1897@code{xsubi} array, the parameters for the congruential formula from the
1898global random number generator data. The random number is returned in
1899the variable pointed to by @var{result}.
b4012b75 1900
04b9968b 1901The return value is non-negative if the call succeeded.
b4012b75
UD
1902
1903This function is a GNU extension and should not be used in portable
1904programs.
1905@end deftypefun
1906
1907@comment stdlib.h
1908@comment GNU
8ded91fb 1909@deftypefun int lrand48_r (struct drand48_data *@var{buffer}, long int *@var{result})
27aaa791 1910@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
04b9968b
UD
1911This function is similar to @code{lrand48}, but in addition it takes a
1912pointer to a buffer describing the state of the random number generator
1913just like @code{drand48}.
b4012b75
UD
1914
1915If the return value of the function is non-negative the variable pointed
1916to by @var{result} contains the result. Otherwise an error occurred.
1917
1918This function is a GNU extension and should not be used in portable
1919programs.
1920@end deftypefun
1921
1922@comment stdlib.h
1923@comment GNU
1924@deftypefun int nrand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, long int *@var{result})
27aaa791 1925@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
b4012b75 1926The @code{nrand48_r} function works like @code{nrand48} in that it
04b9968b 1927produces a random number in the range @code{0} to @code{2^31}. But instead
b4012b75
UD
1928of using the global parameters for the congruential formula it uses the
1929information from the buffer pointed to by @var{buffer}. The state is
1930described by the values in @var{xsubi}.
1931
1932If the return value is non-negative the variable pointed to by
1933@var{result} contains the result.
1934
1935This function is a GNU extension and should not be used in portable
1936programs.
1937@end deftypefun
1938
1939@comment stdlib.h
1940@comment GNU
8ded91fb 1941@deftypefun int mrand48_r (struct drand48_data *@var{buffer}, long int *@var{result})
27aaa791 1942@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
04b9968b
UD
1943This function is similar to @code{mrand48} but like the other reentrant
1944functions it uses the random number generator described by the value in
b4012b75
UD
1945the buffer pointed to by @var{buffer}.
1946
1947If the return value is non-negative the variable pointed to by
1948@var{result} contains the result.
1949
1950This function is a GNU extension and should not be used in portable
1951programs.
1952@end deftypefun
1953
1954@comment stdlib.h
1955@comment GNU
1956@deftypefun int jrand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, long int *@var{result})
27aaa791 1957@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
04b9968b 1958The @code{jrand48_r} function is similar to @code{jrand48}. Like the
b4012b75
UD
1959other reentrant functions of this function family it uses the
1960congruential formula parameters from the buffer pointed to by
1961@var{buffer}.
1962
1963If the return value is non-negative the variable pointed to by
1964@var{result} contains the result.
1965
1966This function is a GNU extension and should not be used in portable
1967programs.
1968@end deftypefun
1969
04b9968b
UD
1970Before any of the above functions are used the buffer of type
1971@code{struct drand48_data} should be initialized. The easiest way to do
1972this is to fill the whole buffer with null bytes, e.g. by
b4012b75
UD
1973
1974@smallexample
1975memset (buffer, '\0', sizeof (struct drand48_data));
1976@end smallexample
1977
1978@noindent
f2ea0f5b 1979Using any of the reentrant functions of this family now will
b4012b75
UD
1980automatically initialize the random number generator to the default
1981values for the state and the parameters of the congruential formula.
1982
04b9968b 1983The other possibility is to use any of the functions which explicitly
b4012b75 1984initialize the buffer. Though it might be obvious how to initialize the
04b9968b 1985buffer from looking at the parameter to the function, it is highly
b4012b75
UD
1986recommended to use these functions since the result might not always be
1987what you expect.
1988
1989@comment stdlib.h
1990@comment GNU
1991@deftypefun int srand48_r (long int @var{seedval}, struct drand48_data *@var{buffer})
27aaa791 1992@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
b4012b75 1993The description of the random number generator represented by the
04b9968b 1994information in @var{buffer} is initialized similarly to what the function
f2ea0f5b
UD
1995@code{srand48} does. The state is initialized from the parameter
1996@var{seedval} and the parameters for the congruential formula are
04b9968b 1997initialized to their default values.
b4012b75
UD
1998
1999If the return value is non-negative the function call succeeded.
2000
2001This function is a GNU extension and should not be used in portable
2002programs.
2003@end deftypefun
2004
2005@comment stdlib.h
2006@comment GNU
2007@deftypefun int seed48_r (unsigned short int @var{seed16v}[3], struct drand48_data *@var{buffer})
27aaa791 2008@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
b4012b75
UD
2009This function is similar to @code{srand48_r} but like @code{seed48} it
2010initializes all 48 bits of the state from the parameter @var{seed16v}.
2011
2012If the return value is non-negative the function call succeeded. It
2013does not return a pointer to the previous state of the random number
04b9968b
UD
2014generator like the @code{seed48} function does. If the user wants to
2015preserve the state for a later re-run s/he can copy the whole buffer
b4012b75
UD
2016pointed to by @var{buffer}.
2017
2018This function is a GNU extension and should not be used in portable
2019programs.
2020@end deftypefun
2021
2022@comment stdlib.h
2023@comment GNU
2024@deftypefun int lcong48_r (unsigned short int @var{param}[7], struct drand48_data *@var{buffer})
27aaa791 2025@safety{@prelim{}@mtsafe{@mtsrace{:buffer}}@assafe{}@acunsafe{@acucorrupt{}}}
b4012b75 2026This function initializes all aspects of the random number generator
04b9968b
UD
2027described in @var{buffer} with the data in @var{param}. Here it is
2028especially true that the function does more than just copying the
2029contents of @var{param} and @var{buffer}. More work is required and
2030therefore it is important to use this function rather than initializing
2031the random number generator directly.
b4012b75
UD
2032
2033If the return value is non-negative the function call succeeded.
2034
2035This function is a GNU extension and should not be used in portable
2036programs.
2037@end deftypefun
7a68c94a
UD
2038
2039@node FP Function Optimizations
2040@section Is Fast Code or Small Code preferred?
2041@cindex Optimization
2042
04b9968b
UD
2043If an application uses many floating point functions it is often the case
2044that the cost of the function calls themselves is not negligible.
2045Modern processors can often execute the operations themselves
2046very fast, but the function call disrupts the instruction pipeline.
7a68c94a 2047
1f77f049 2048For this reason @theglibc{} provides optimizations for many of the
04b9968b
UD
2049frequently-used math functions. When GNU CC is used and the user
2050activates the optimizer, several new inline functions and macros are
7a68c94a 2051defined. These new functions and macros have the same names as the
04b9968b 2052library functions and so are used instead of the latter. In the case of
7a68c94a 2053inline functions the compiler will decide whether it is reasonable to
04b9968b 2054use them, and this decision is usually correct.
7a68c94a 2055
04b9968b
UD
2056This means that no calls to the library functions may be necessary, and
2057can increase the speed of generated code significantly. The drawback is
2058that code size will increase, and the increase is not always negligible.
7a68c94a 2059
60843ffb 2060There are two kinds of inline functions: those that give the same result
378fbeb4
UD
2061as the library functions and others that might not set @code{errno} and
2062might have a reduced precision and/or argument range in comparison with
2063the library functions. The latter inline functions are only available
2064if the flag @code{-ffast-math} is given to GNU CC.
aa847ee5 2065
7a68c94a
UD
2066In cases where the inline functions and macros are not wanted the symbol
2067@code{__NO_MATH_INLINES} should be defined before any system header is
04b9968b
UD
2068included. This will ensure that only library functions are used. Of
2069course, it can be determined for each file in the project whether
2070giving this option is preferable or not.
2071
2072Not all hardware implements the entire @w{IEEE 754} standard, and even
2073if it does there may be a substantial performance penalty for using some
2074of its features. For example, enabling traps on some processors forces
2075the FPU to run un-pipelined, which can more than double calculation time.
7a68c94a 2076@c ***Add explanation of -lieee, -mieee.