]> git.ipfire.org Git - thirdparty/glibc.git/blame - math/math.h
Update.
[thirdparty/glibc.git] / math / math.h
CommitLineData
f7eac6eb 1/* Declarations for math functions.
68337808 2 Copyright (C) 1991,92,93,95,96,97,98,99 Free Software Foundation, Inc.
ba1ffaa1 3 This file is part of the GNU C Library.
28f540f4 4
ba1ffaa1
UD
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
28f540f4 9
ba1ffaa1
UD
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
28f540f4 14
ba1ffaa1
UD
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB. If not,
17 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
28f540f4
RM
19
20/*
ba1ffaa1 21 * ISO C Standard: 4.5 MATHEMATICS <math.h>
28f540f4
RM
22 */
23
24#ifndef _MATH_H
28f540f4 25#define _MATH_H 1
5107cf1d 26
28f540f4
RM
27#include <features.h>
28
29__BEGIN_DECLS
30
f7eac6eb
RM
31/* Get machine-dependent HUGE_VAL value (returned on overflow).
32 On all IEEE754 machines, this is +Infinity. */
5107cf1d 33#include <bits/huge_val.h>
28f540f4
RM
34
35/* Get machine-dependent NAN value (returned for some domain errors). */
ec751a23 36#ifdef __USE_ISOC99
478b92f0 37# include <bits/nan.h>
28f540f4 38#endif
ec751a23 39/* Get general and ISO C99 specific information. */
d76bd17f 40#include <bits/mathdef.h>
28f540f4
RM
41
42
5107cf1d
UD
43/* The file <bits/mathcalls.h> contains the prototypes for all the
44 actual math functions. These macros are used for those prototypes,
45 so we can easily declare each function as both `name' and `__name',
f7eac6eb
RM
46 and can declare the float versions `namef' and `__namef'. */
47
48#define __MATHCALL(function,suffix, args) \
377a515b 49 __MATHDECL (_Mdouble_,function,suffix, args)
f7eac6eb
RM
50#define __MATHDECL(type, function,suffix, args) \
51 __MATHDECL_1(type, function,suffix, args); \
377a515b 52 __MATHDECL_1(type, __CONCAT(__,function),suffix, args)
3e5f5557
UD
53#define __MATHCALLX(function,suffix, args, attrib) \
54 __MATHDECLX (_Mdouble_,function,suffix, args, attrib)
55#define __MATHDECLX(type, function,suffix, args, attrib) \
56 __MATHDECL_1(type, function,suffix, args) __attribute__ (attrib); \
57 __MATHDECL_1(type, __CONCAT(__,function),suffix, args) __attribute__ (attrib)
f7eac6eb 58#define __MATHDECL_1(type, function,suffix, args) \
c1422e5b 59 extern type __MATH_PRECNAME(function,suffix) args __THROW
f7eac6eb
RM
60
61#define _Mdouble_ double
377a515b 62#define __MATH_PRECNAME(name,r) __CONCAT(name,r)
5107cf1d 63#include <bits/mathcalls.h>
f7eac6eb
RM
64#undef _Mdouble_
65#undef __MATH_PRECNAME
66
ec751a23 67#if defined __USE_MISC || defined __USE_ISOC99
76060ec0 68
999493cb
RM
69
70/* Include the file of declarations again, this time using `float'
f7eac6eb
RM
71 instead of `double' and appending f to each function name. */
72
fe0ec73e
UD
73# ifndef _Mfloat_
74# define _Mfloat_ float
478b92f0 75# endif
fe0ec73e 76# define _Mdouble_ _Mfloat_
478b92f0 77# ifdef __STDC__
fe0ec73e 78# define __MATH_PRECNAME(name,r) name##f##r
478b92f0 79# else
fe0ec73e 80# define __MATH_PRECNAME(name,r) name/**/f/**/r
478b92f0
UD
81# endif
82# include <bits/mathcalls.h>
83# undef _Mdouble_
84# undef __MATH_PRECNAME
76060ec0 85
48252123 86# if (__STDC__ - 0 || __GNUC__ - 0) && !defined __NO_LONG_DOUBLE_MATH
fe0ec73e
UD
87/* Include the file of declarations again, this time using `long double'
88 instead of `double' and appending l to each function name. */
89
90# ifndef _Mlong_double_
91# define _Mlong_double_ long double
92# endif
93# define _Mdouble_ _Mlong_double_
94# ifdef __STDC__
95# define __MATH_PRECNAME(name,r) name##l##r
96# else
97# define __MATH_PRECNAME(name,r) name/**/l/**/r
98# endif
99# include <bits/mathcalls.h>
100# undef _Mdouble_
101# undef __MATH_PRECNAME
102
103# endif /* __STDC__ || __GNUC__ */
377a515b 104
ec751a23 105#endif /* Use misc or ISO C99. */
4cca6b86
UD
106#undef __MATHDECL_1
107#undef __MATHDECL
108#undef __MATHCALL
109
110
00d8bc81 111#if defined __USE_MISC || defined __USE_XOPEN
4cca6b86
UD
112/* This variable is used by `gamma' and `lgamma'. */
113extern int signgam;
114#endif
377a515b
UD
115
116
ec751a23
UD
117/* ISO C99 defines some generic macros which work on any data type. */
118#if __USE_ISOC99
377a515b 119
63551311
UD
120/* Get the architecture specific values describing the floating-point
121 evaluation. The following symbols will get defined:
122
fe0ec73e 123 float_t floating-point type at least as wide as `float' used
63551311 124 to evaluate `float' expressions
fe0ec73e 125 double_t floating-point type at least as wide as `double' used
63551311
UD
126 to evaluate `double' expressions
127
fe0ec73e 128 FLT_EVAL_METHOD
63551311
UD
129 Defined to
130 0 if `float_t' is `float' and `double_t' is `double'
131 1 if `float_t' and `double_t' are `double'
132 2 if `float_t' and `double_t' are `long double'
133 else `float_t' and `double_t' are unspecified
134
fe0ec73e 135 INFINITY representation of the infinity value of type `float'
dfd2257a 136
fe0ec73e
UD
137 FP_FAST_FMA
138 FP_FAST_FMAF
139 FP_FAST_FMAL
3081378b 140 If defined it indicates that the `fma' function
dfd2257a
UD
141 generally executes about as fast as a multiply and an add.
142 This macro is defined only iff the `fma' function is
143 implemented directly with a hardware multiply-add instructions.
144
145 FP_ILOGB0 Expands to a value returned by `ilogb (0.0)'.
146 FP_ILOGBNAN Expands to a value returned by `ilogb (NAN)'.
147
fe0ec73e
UD
148 DECIMAL_DIG Number of decimal digits supported by conversion between
149 decimal and all internal floating-point formats.
150
63551311 151*/
63551311 152
377a515b
UD
153/* All floating-point numbers can be put in one of these categories. */
154enum
155 {
156 FP_NAN,
478b92f0 157# define FP_NAN FP_NAN
377a515b 158 FP_INFINITE,
478b92f0 159# define FP_INFINITE FP_INFINITE
377a515b 160 FP_ZERO,
478b92f0 161# define FP_ZERO FP_ZERO
377a515b 162 FP_SUBNORMAL,
478b92f0 163# define FP_SUBNORMAL FP_SUBNORMAL
377a515b 164 FP_NORMAL
478b92f0 165# define FP_NORMAL FP_NORMAL
377a515b
UD
166 };
167
168/* Return number of classification appropriate for X. */
68337808
UD
169# ifdef __NO_LONG_DOUBLE_MATH
170# define fpclassify(x) \
48252123 171 (sizeof (x) == sizeof (float) ? __fpclassifyf (x) : __fpclassify (x))
68337808
UD
172# else
173# define fpclassify(x) \
15daa639
UD
174 (sizeof (x) == sizeof (float) \
175 ? __fpclassifyf (x) \
176 : sizeof (x) == sizeof (double) \
177 ? __fpclassify (x) : __fpclassifyl (x))
68337808 178# endif
377a515b
UD
179
180/* Return nonzero value if sign of X is negative. */
68337808
UD
181# ifdef __NO_LONG_DOUBLE_MATH
182# define signbit(x) \
48252123 183 (sizeof (x) == sizeof (float) ? __signbitf (x) : __signbit (x))
68337808
UD
184# else
185# define signbit(x) \
15daa639
UD
186 (sizeof (x) == sizeof (float) \
187 ? __signbitf (x) \
188 : sizeof (x) == sizeof (double) \
189 ? __signbit (x) : __signbitl (x))
68337808 190# endif
377a515b
UD
191
192/* Return nonzero value if X is not +-Inf or NaN. */
68337808
UD
193# ifdef __NO_LONG_DOUBLE_MATH
194# define isfinite(x) \
48252123 195 (sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x))
68337808
UD
196# else
197# define isfinite(x) \
15daa639
UD
198 (sizeof (x) == sizeof (float) \
199 ? __finitef (x) \
200 : sizeof (x) == sizeof (double) \
201 ? __finite (x) : __finitel (x))
68337808 202# endif
377a515b
UD
203
204/* Return nonzero value if X is neither zero, subnormal, Inf, nor NaN. */
478b92f0 205# define isnormal(x) (fpclassify (x) == FP_NORMAL)
377a515b
UD
206
207/* Return nonzero value if X is a NaN. We could use `fpclassify' but
208 we already have this functions `__isnan' and it is faster. */
68337808
UD
209# ifdef __NO_LONG_DOUBLE_MATH
210# define isnan(x) \
48252123 211 (sizeof (x) == sizeof (float) ? __isnanf (x) : __isnan (x))
68337808
UD
212# else
213# define isnan(x) \
15daa639
UD
214 (sizeof (x) == sizeof (float) \
215 ? __isnanf (x) \
216 : sizeof (x) == sizeof (double) \
217 ? __isnan (x) : __isnanl (x))
68337808 218# endif
28f540f4 219
bfce746a 220/* Return nonzero value is X is positive or negative infinity. */
68337808
UD
221# ifdef __NO_LONG_DOUBLE_MATH
222# define isinf(x) \
48252123 223 (sizeof (x) == sizeof (float) ? __isinff (x) : __isinf (x))
68337808
UD
224# else
225# define isinf(x) \
15daa639
UD
226 (sizeof (x) == sizeof (float) \
227 ? __isinff (x) \
228 : sizeof (x) == sizeof (double) \
229 ? __isinf (x) : __isinfl (x))
68337808 230# endif
bfce746a 231
ec751a23 232#endif /* Use ISO C99. */
377a515b 233
28f540f4 234#ifdef __USE_MISC
f7eac6eb 235/* Support for various different standard error handling behaviors. */
b9337b6a
UD
236typedef enum
237{
238 _IEEE_ = -1, /* According to IEEE 754/IEEE 854. */
239 _SVID_, /* According to System V, release 4. */
240 _XOPEN_, /* Nowadays also Unix98. */
241 _POSIX_,
ec751a23 242 _ISOC_ /* Actually this is ISO C99. */
b9337b6a 243} _LIB_VERSION_TYPE;
28f540f4 244
f7eac6eb
RM
245/* This variable can be changed at run-time to any of the values above to
246 affect floating point error handling behavior (it may also be necessary
247 to change the hardware FPU exception settings). */
248extern _LIB_VERSION_TYPE _LIB_VERSION;
28f540f4
RM
249#endif
250
251
ceb2d9aa 252#ifdef __USE_SVID
f7eac6eb 253/* In SVID error handling, `matherr' is called with this description
2f6d1f1b
UD
254 of the exceptional condition.
255
fe0ec73e
UD
256 We have a problem when using C++ since `exception' is a reserved
257 name in C++. */
478b92f0 258# ifdef __cplusplus
ceb2d9aa 259struct __exception
478b92f0 260# else
f7eac6eb 261struct exception
478b92f0 262# endif
f7eac6eb
RM
263 {
264 int type;
265 char *name;
266 double arg1;
267 double arg2;
268 double retval;
269 };
28f540f4 270
478b92f0 271# ifdef __cplusplus
c1422e5b 272extern int matherr (struct __exception *__exc) throw ();
478b92f0 273# else
c1422e5b 274extern int matherr (struct exception *__exc);
478b92f0 275# endif
28f540f4 276
478b92f0 277# define X_TLOSS 1.41484755040568800000e+16
28f540f4 278
f7eac6eb 279/* Types of exceptions in the `type' field. */
478b92f0
UD
280# define DOMAIN 1
281# define SING 2
282# define OVERFLOW 3
283# define UNDERFLOW 4
284# define TLOSS 5
285# define PLOSS 6
28f540f4 286
f7eac6eb 287/* SVID mode specifies returning this large value instead of infinity. */
478b92f0
UD
288# define HUGE FLT_MAX
289# include <float.h> /* Defines FLT_MAX. */
28f540f4 290
377a515b
UD
291#else /* !SVID */
292
478b92f0 293# ifdef __USE_XOPEN
377a515b 294/* X/Open wants another strange constant. */
478b92f0
UD
295# define MAXFLOAT FLT_MAX
296# include <float.h>
297# endif
377a515b 298
ceb2d9aa 299#endif /* SVID */
28f540f4 300
28f540f4 301
28f540f4 302/* Some useful constants. */
e918a7fe 303#if defined __USE_BSD || defined __USE_XOPEN
0a614877
UD
304# define M_E 2.7182818284590452354 /* e */
305# define M_LOG2E 1.4426950408889634074 /* log_2 e */
306# define M_LOG10E 0.43429448190325182765 /* log_10 e */
307# define M_LN2 0.69314718055994530942 /* log_e 2 */
308# define M_LN10 2.30258509299404568402 /* log_e 10 */
309# define M_PI 3.14159265358979323846 /* pi */
310# define M_PI_2 1.57079632679489661923 /* pi/2 */
311# define M_PI_4 0.78539816339744830962 /* pi/4 */
312# define M_1_PI 0.31830988618379067154 /* 1/pi */
313# define M_2_PI 0.63661977236758134308 /* 2/pi */
314# define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
315# define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
316# define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
714a562f
UD
317#endif
318
0a614877
UD
319/* The above constants are not adequate for computation using `long double's.
320 Therefore we provide as an extension constants with similar names as a
9a24f906 321 GNU extension. Provide enough digits for the 128-bit IEEE quad. */
0a614877 322#ifdef __USE_GNU
9a24f906
UD
323# define M_El 2.7182818284590452353602874713526625L /* e */
324# define M_LOG2El 1.4426950408889634073599246810018922L /* log_2 e */
325# define M_LOG10El 0.4342944819032518276511289189166051L /* log_10 e */
326# define M_LN2l 0.6931471805599453094172321214581766L /* log_e 2 */
327# define M_LN10l 2.3025850929940456840179914546843642L /* log_e 10 */
328# define M_PIl 3.1415926535897932384626433832795029L /* pi */
329# define M_PI_2l 1.5707963267948966192313216916397514L /* pi/2 */
330# define M_PI_4l 0.7853981633974483096156608458198757L /* pi/4 */
331# define M_1_PIl 0.3183098861837906715377675267450287L /* 1/pi */
332# define M_2_PIl 0.6366197723675813430755350534900574L /* 2/pi */
333# define M_2_SQRTPIl 1.1283791670955125738961589031215452L /* 2/sqrt(pi) */
334# define M_SQRT2l 1.4142135623730950488016887242096981L /* sqrt(2) */
335# define M_SQRT1_2l 0.7071067811865475244008443621048490L /* 1/sqrt(2) */
0a614877 336#endif
710f7bab 337
28f540f4 338
00bc5db0
UD
339/* When compiling in strict ISO C compatible mode we must not use the
340 inline functions since they, among other things, do not set the
341 `errno' variable correctly. */
342#if defined __STRICT_ANSI__ && !defined __NO_MATH_INLINES
343# define __NO_MATH_INLINES 1
344#endif
345
4d585333 346/* Get machine-dependent inline versions (if there are any). */
0c6cee5d 347#ifdef __USE_EXTERN_INLINES
478b92f0 348# include <bits/mathinline.h>
4d585333
RM
349#endif
350
351
ec751a23
UD
352#if __USE_ISOC99
353/* ISO C99 defines some macros to compare number while taking care
ae1025be 354 for unordered numbers. Since many FPUs provide special
907a1bac
UD
355 instructions to support these operations and these tests are
356 defined in <bits/mathinline.h>, we define the generic macros at
fe0ec73e 357 this late point and only if they are not defined yet. */
ae1025be
UD
358
359/* Return nonzero value if X is greater than Y. */
360# ifndef isgreater
55c14926
UD
361# define isgreater(x, y) \
362 (__extension__ \
363 ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
364 !isunordered (__x, __y) && __x > __y; }))
ae1025be
UD
365# endif
366
367/* Return nonzero value if X is greater than or equal to Y. */
368# ifndef isgreaterequal
55c14926
UD
369# define isgreaterequal(x, y) \
370 (__extension__ \
371 ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
372 !isunordered (__x, __y) && __x >= __y; }))
ae1025be
UD
373# endif
374
375/* Return nonzero value if X is less than Y. */
376# ifndef isless
55c14926
UD
377# define isless(x, y) \
378 (__extension__ \
379 ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
380 !isunordered (__x, __y) && __x < __y; }))
ae1025be
UD
381# endif
382
383/* Return nonzero value if X is less than or equal to Y. */
384# ifndef islessequal
55c14926
UD
385# define islessequal(x, y) \
386 (__extension__ \
387 ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
388 !isunordered (__x, __y) && __x <= __y; }))
ae1025be
UD
389# endif
390
391/* Return nonzero value if either X is less than Y or Y is less than X. */
392# ifndef islessgreater
393# define islessgreater(x, y) \
55c14926
UD
394 (__extension__ \
395 ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
396 !isunordered (__x, __y) && (__x < __y || __y < __x); }))
ae1025be
UD
397# endif
398
399/* Return nonzero value if arguments are unordered. */
400# ifndef isunordered
d111572f 401# define isunordered(u, v) \
55c14926 402 (__extension__ \
d111572f
UD
403 ({ __typeof__(u) __u = (u); __typeof__(v) __v = (v); \
404 fpclassify (__u) == FP_NAN || fpclassify (__v) == FP_NAN; }))
ae1025be
UD
405# endif
406
407#endif
408
4d585333
RM
409__END_DECLS
410
411
28f540f4 412#endif /* math.h */