Clang Project

include/math.h
1/* Declarations for math functions.
2   Copyright (C) 1991-2016 Free Software Foundation, Inc.
3   This file is part of the GNU C Library.
4
5   The GNU C Library is free software; you can redistribute it and/or
6   modify it under the terms of the GNU Lesser General Public
7   License as published by the Free Software Foundation; either
8   version 2.1 of the License, or (at your option) any later version.
9
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   Lesser General Public License for more details.
14
15   You should have received a copy of the GNU Lesser General Public
16   License along with the GNU C Library; if not, see
17   <http://www.gnu.org/licenses/>.  */
18
19/*
20 * ISO C99 Standard: 7.12 Mathematics <math.h>
21 */
22
23#ifndef _MATH_H
24#define _MATH_H 1
25
26#include <features.h>
27
28__BEGIN_DECLS
29
30/* Get machine-dependent vector math functions declarations.  */
31#include <bits/math-vector.h>
32
33/* Get machine-dependent HUGE_VAL value (returned on overflow).
34   On all IEEE754 machines, this is +Infinity.  */
35#include <bits/huge_val.h>
36#ifdef __USE_ISOC99
37include <bits/huge_valf.h>
38include <bits/huge_vall.h>
39
40/* Get machine-dependent INFINITY value.  */
41include <bits/inf.h>
42
43/* Get machine-dependent NAN value (returned for some domain errors).  */
44include <bits/nan.h>
45#endif /* __USE_ISOC99 */
46
47/* Get general and ISO C99 specific information.  */
48#include <bits/mathdef.h>
49
50/* The file <bits/mathcalls.h> contains the prototypes for all the
51   actual math functions.  These macros are used for those prototypes,
52   so we can easily declare each function as both `name' and `__name',
53   and can declare the float versions `namef' and `__namef'.  */
54
55#define __SIMD_DECL(function) __CONCAT (__DECL_SIMD_, function)
56
57#define __MATHCALL_VEC(function, suffix, args)  \
58  __SIMD_DECL (__MATH_PRECNAME (function, suffix)) \
59  __MATHCALL (function, suffix, args)
60
61#define __MATHDECL_VEC(type, function,suffix, args) \
62  __SIMD_DECL (__MATH_PRECNAME (function, suffix)) \
63  __MATHDECL(type, function,suffix, args)
64
65#define __MATHCALL(function,suffix, args) \
66  __MATHDECL (_Mdouble_,function,suffix, args)
67#define __MATHDECL(type, function,suffix, args) \
68  __MATHDECL_1(type, function,suffix, args); \
69  __MATHDECL_1(type, __CONCAT(__,function),suffix, args)
70#define __MATHCALLX(function,suffix, args, attrib) \
71  __MATHDECLX (_Mdouble_,function,suffix, args, attrib)
72#define __MATHDECLX(type, function,suffix, args, attrib) \
73  __MATHDECL_1(type, function,suffix, args) __attribute__ (attrib); \
74  __MATHDECL_1(type, __CONCAT(__,function),suffix, args) __attribute__ (attrib)
75#define __MATHDECL_1(type, function,suffix, args) \
76  extern type __MATH_PRECNAME(function,suffix) args __THROW
77
78#define _Mdouble_ double
79#define __MATH_PRECNAME(name,r) __CONCAT(name,r)
80#define __MATH_DECLARING_DOUBLE  1
81#define _Mdouble_BEGIN_NAMESPACE __BEGIN_NAMESPACE_STD
82#define _Mdouble_END_NAMESPACE   __END_NAMESPACE_STD
83#include <bits/mathcalls.h>
84#undef _Mdouble_
85#undef _Mdouble_BEGIN_NAMESPACE
86#undef _Mdouble_END_NAMESPACE
87#undef __MATH_PRECNAME
88#undef __MATH_DECLARING_DOUBLE
89
90#ifdef __USE_ISOC99
91
92
93/* Include the file of declarations again, this time using `float'
94   instead of `double' and appending f to each function name.  */
95
96ifndef _Mfloat_
97#  define _Mfloat_ float
98endif
99define _Mdouble_ _Mfloat_
100define __MATH_PRECNAME(name,r) name##f##r
101define __MATH_DECLARING_DOUBLE  0
102define _Mdouble_BEGIN_NAMESPACE __BEGIN_NAMESPACE_C99
103define _Mdouble_END_NAMESPACE   __END_NAMESPACE_C99
104include <bits/mathcalls.h>
105# undef _Mdouble_
106# undef _Mdouble_BEGIN_NAMESPACE
107# undef _Mdouble_END_NAMESPACE
108# undef __MATH_PRECNAME
109# undef __MATH_DECLARING_DOUBLE
110
111if !(defined __NO_LONG_DOUBLE_MATH && defined _LIBC) \
112     || defined __LDBL_COMPAT \
113     || defined _LIBC_TEST
114#  ifdef __LDBL_COMPAT
115
116#   ifdef __USE_ISOC99
117extern float __nldbl_nexttowardf (float __x, long double __y)
118   __THROW __attribute__ ((__const__));
119#    ifdef __REDIRECT_NTH
120extern float __REDIRECT_NTH (nexttowardf, (float __x, long double __y),
121      __nldbl_nexttowardf)
122     __attribute__ ((__const__));
123extern double __REDIRECT_NTH (nexttoward, (double __x, long double __y),
124       nextafter) __attribute__ ((__const__));
125extern long double __REDIRECT_NTH (nexttowardl,
126    (long double __x, long double __y),
127    nextafter) __attribute__ ((__const__));
128#    endif
129#   endif
130
131#   undef __MATHDECL_1
132#   define __MATHDECL_2(type, function,suffix, args, alias) \
133  extern type __REDIRECT_NTH(__MATH_PRECNAME(function,suffix), \
134      args, alias)
135#   define __MATHDECL_1(type, function,suffix, args) \
136  __MATHDECL_2(type, function,suffix, args, __CONCAT(function,suffix))
137#  endif
138
139/* Include the file of declarations again, this time using `long double'
140   instead of `double' and appending l to each function name.  */
141
142#  ifndef _Mlong_double_
143#   define _Mlong_double_ long double
144#  endif
145#  define _Mdouble_ _Mlong_double_
146#  define __MATH_PRECNAME(name,r) name##l##r
147#  define __MATH_DECLARING_DOUBLE  0
148#  define _Mdouble_BEGIN_NAMESPACE __BEGIN_NAMESPACE_C99
149#  define _Mdouble_END_NAMESPACE   __END_NAMESPACE_C99
150#  define __MATH_DECLARE_LDOUBLE   1
151#  include <bits/mathcalls.h>
152#  undef _Mdouble_
153#  undef _Mdouble_BEGIN_NAMESPACE
154#  undef _Mdouble_END_NAMESPACE
155#  undef __MATH_PRECNAME
156#  undef __MATH_DECLARING_DOUBLE
157
158endif /* !(__NO_LONG_DOUBLE_MATH && _LIBC) || __LDBL_COMPAT */
159
160#endif /* Use ISO C99.  */
161#undef __MATHDECL_1
162#undef __MATHDECL
163#undef __MATHCALL
164
165
166#if defined __USE_MISC || defined __USE_XOPEN
167/* This variable is used by `gamma' and `lgamma'.  */
168extern int signgam;
169#endif
170
171
172/* ISO C99 defines some generic macros which work on any data type.  */
173#ifdef __USE_ISOC99
174
175/* Get the architecture specific values describing the floating-point
176   evaluation.  The following symbols will get defined:
177
178    float_t floating-point type at least as wide as `float' used
179 to evaluate `float' expressions
180    double_t floating-point type at least as wide as `double' used
181 to evaluate `double' expressions
182
183    FLT_EVAL_METHOD
184 Defined to
185   0 if `float_t' is `float' and `double_t' is `double'
186   1 if `float_t' and `double_t' are `double'
187   2 if `float_t' and `double_t' are `long double'
188   else `float_t' and `double_t' are unspecified
189
190    INFINITY representation of the infinity value of type `float'
191
192    FP_FAST_FMA
193    FP_FAST_FMAF
194    FP_FAST_FMAL
195 If defined it indicates that the `fma' function
196 generally executes about as fast as a multiply and an add.
197 This macro is defined only iff the `fma' function is
198 implemented directly with a hardware multiply-add instructions.
199
200    FP_ILOGB0 Expands to a value returned by `ilogb (0.0)'.
201    FP_ILOGBNAN Expands to a value returned by `ilogb (NAN)'.
202
203    DECIMAL_DIG Number of decimal digits supported by conversion between
204 decimal and all internal floating-point formats.
205
206*/
207
208/* All floating-point numbers can be put in one of these categories.  */
209enum
210  {
211    FP_NAN =
212define FP_NAN 0
213      FP_NAN,
214    FP_INFINITE =
215define FP_INFINITE 1
216      FP_INFINITE,
217    FP_ZERO =
218define FP_ZERO 2
219      FP_ZERO,
220    FP_SUBNORMAL =
221define FP_SUBNORMAL 3
222      FP_SUBNORMAL,
223    FP_NORMAL =
224define FP_NORMAL 4
225      FP_NORMAL
226  };
227
228/* GCC bug 66462 means we cannot use the math builtins with -fsignaling-nan,
229   so disable builtins if this is enabled.  When fixed in a newer GCC,
230   the __SUPPORT_SNAN__ check may be skipped for those versions.  */
231
232/* Return number of classification appropriate for X.  */
233if __GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__       \
234     && !defined __OPTIMIZE_SIZE__
235#  define fpclassify(x) __builtin_fpclassify (FP_NAN, FP_INFINITE,       \
236     FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x)
237elif defined __NO_LONG_DOUBLE_MATH
238#  define fpclassify(x) \
239     (sizeof (x) == sizeof (float) ? __fpclassifyf (x) : __fpclassify (x))
240else
241#  define fpclassify(x) \
242     (sizeof (x) == sizeof (float)       \
243      ? __fpclassifyf (x)       \
244      : sizeof (x) == sizeof (double)       \
245      ? __fpclassify (x) : __fpclassifyl (x))
246endif
247
248/* Return nonzero value if sign of X is negative.  */
249if __GNUC_PREREQ (4,0)
250#  define signbit(x) \
251     (sizeof (x) == sizeof (float)                                            \
252      ? __builtin_signbitf (x)                                                        \
253      : sizeof (x) == sizeof (double)                                         \
254      ? __builtin_signbit (x) : __builtin_signbitl (x))
255else
256#  ifdef __NO_LONG_DOUBLE_MATH
257#   define signbit(x) \
258     (sizeof (x) == sizeof (float) ? __signbitf (x) : __signbit (x))
259#  else
260#   define signbit(x) \
261     (sizeof (x) == sizeof (float)       \
262      ? __signbitf (x)       \
263      : sizeof (x) == sizeof (double)       \
264      ? __signbit (x) : __signbitl (x))
265#  endif
266endif
267
268/* Return nonzero value if X is not +-Inf or NaN.  */
269if __GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__
270#  define isfinite(x) __builtin_isfinite (x)
271elif defined __NO_LONG_DOUBLE_MATH
272#  define isfinite(x) \
273     (sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x))
274else
275#  define isfinite(x) \
276     (sizeof (x) == sizeof (float)       \
277      ? __finitef (x)       \
278      : sizeof (x) == sizeof (double)       \
279      ? __finite (x) : __finitel (x))
280endif
281
282/* Return nonzero value if X is neither zero, subnormal, Inf, nor NaN.  */
283if __GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__
284#  define isnormal(x) __builtin_isnormal (x)
285else
286#  define isnormal(x) (fpclassify (x) == FP_NORMAL)
287endif
288
289/* Return nonzero value if X is a NaN.  We could use `fpclassify' but
290   we already have this functions `__isnan' and it is faster.  */
291if __GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__
292#  define isnan(x) __builtin_isnan (x)
293elif defined __NO_LONG_DOUBLE_MATH
294#  define isnan(x) \
295     (sizeof (x) == sizeof (float) ? __isnanf (x) : __isnan (x))
296else
297#  define isnan(x) \
298     (sizeof (x) == sizeof (float)       \
299      ? __isnanf (x)       \
300      : sizeof (x) == sizeof (double)       \
301      ? __isnan (x) : __isnanl (x))
302endif
303
304/* Return nonzero value if X is positive or negative infinity.  */
305if __GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__
306#  define isinf(x) __builtin_isinf_sign (x)
307elif defined __NO_LONG_DOUBLE_MATH
308#  define isinf(x) \
309     (sizeof (x) == sizeof (float) ? __isinff (x) : __isinf (x))
310else
311#  define isinf(x) \
312     (sizeof (x) == sizeof (float)       \
313      ? __isinff (x)       \
314      : sizeof (x) == sizeof (double)       \
315      ? __isinf (x) : __isinfl (x))
316endif
317
318/* Bitmasks for the math_errhandling macro.  */
319define MATH_ERRNO 1 /* errno set by math functions.  */
320define MATH_ERREXCEPT 2 /* Exceptions raised by math functions.  */
321
322/* By default all functions support both errno and exception handling.
323   In gcc's fast math mode and if inline functions are defined this
324   might not be true.  */
325ifndef __FAST_MATH__
326#  define math_errhandling (MATH_ERRNO | MATH_ERREXCEPT)
327endif
328
329#endif /* Use ISO C99.  */
330
331#ifdef __USE_GNU
332/* Return nonzero value if X is a signaling NaN.  */
333ifdef __NO_LONG_DOUBLE_MATH
334#  define issignaling(x) \
335     (sizeof (x) == sizeof (float) ? __issignalingf (x) : __issignaling (x))
336else
337#  define issignaling(x) \
338     (sizeof (x) == sizeof (float)       \
339      ? __issignalingf (x)       \
340      : sizeof (x) == sizeof (double)       \
341      ? __issignaling (x) : __issignalingl (x))
342endif
343#endif /* Use GNU.  */
344
345#ifdef __USE_MISC
346/* Support for various different standard error handling behaviors.  */
347typedef enum
348{
349  _IEEE_ = -1, /* According to IEEE 754/IEEE 854.  */
350  _SVID_, /* According to System V, release 4.  */
351  _XOPEN_, /* Nowadays also Unix98.  */
352  _POSIX_,
353  _ISOC_ /* Actually this is ISO C99.  */
354_LIB_VERSION_TYPE;
355
356/* This variable can be changed at run-time to any of the values above to
357   affect floating point error handling behavior (it may also be necessary
358   to change the hardware FPU exception settings).  */
359extern _LIB_VERSION_TYPE _LIB_VERSION;
360#endif
361
362
363#ifdef __USE_MISC
364/* In SVID error handling, `matherr' is called with this description
365   of the exceptional condition.
366
367   We have a problem when using C++ since `exception' is a reserved
368   name in C++.  */
369ifdef __cplusplus
370struct __exception
371else
372struct exception
373endif
374  {
375    int type;
376    char *name;
377    double arg1;
378    double arg2;
379    double retval;
380  };
381
382ifdef __cplusplus
383extern int matherr (struct __exception *__excthrow ();
384else
385extern int matherr (struct exception *__exc);
386endif
387
388define X_TLOSS 1.41484755040568800000e+16
389
390/* Types of exceptions in the `type' field.  */
391define DOMAIN 1
392define SING 2
393define OVERFLOW 3
394define UNDERFLOW 4
395define TLOSS 5
396define PLOSS 6
397
398/* SVID mode specifies returning this large value instead of infinity.  */
399define HUGE 3.40282347e+38F
400
401#else /* !Misc.  */
402
403# ifdef __USE_XOPEN
404/* X/Open wants another strange constant.  */
405#  define MAXFLOAT 3.40282347e+38F
406# endif
407
408#endif /* Misc.  */
409
410
411/* Some useful constants.  */
412#if defined __USE_MISC || defined __USE_XOPEN
413define M_E 2.7182818284590452354 /* e */
414define M_LOG2E 1.4426950408889634074 /* log_2 e */
415define M_LOG10E 0.43429448190325182765 /* log_10 e */
416define M_LN2 0.69314718055994530942 /* log_e 2 */
417define M_LN10 2.30258509299404568402 /* log_e 10 */
418define M_PI 3.14159265358979323846 /* pi */
419define M_PI_2 1.57079632679489661923 /* pi/2 */
420define M_PI_4 0.78539816339744830962 /* pi/4 */
421define M_1_PI 0.31830988618379067154 /* 1/pi */
422define M_2_PI 0.63661977236758134308 /* 2/pi */
423define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
424define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
425define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
426#endif
427
428/* The above constants are not adequate for computation using `long double's.
429   Therefore we provide as an extension constants with similar names as a
430   GNU extension.  Provide enough digits for the 128-bit IEEE quad.  */
431#ifdef __USE_GNU
432define M_El 2.718281828459045235360287471352662498L /* e */
433define M_LOG2El 1.442695040888963407359924681001892137L /* log_2 e */
434define M_LOG10El 0.434294481903251827651128918916605082L /* log_10 e */
435define M_LN2l 0.693147180559945309417232121458176568L /* log_e 2 */
436define M_LN10l 2.302585092994045684017991454684364208L /* log_e 10 */
437define M_PIl 3.141592653589793238462643383279502884L /* pi */
438define M_PI_2l 1.570796326794896619231321691639751442L /* pi/2 */
439define M_PI_4l 0.785398163397448309615660845819875721L /* pi/4 */
440define M_1_PIl 0.318309886183790671537767526745028724L /* 1/pi */
441define M_2_PIl 0.636619772367581343075535053490057448L /* 2/pi */
442define M_2_SQRTPIl 1.128379167095512573896158903121545172L /* 2/sqrt(pi) */
443define M_SQRT2l 1.414213562373095048801688724209698079L /* sqrt(2) */
444define M_SQRT1_2l 0.707106781186547524400844362104849039L /* 1/sqrt(2) */
445#endif
446
447
448/* When compiling in strict ISO C compatible mode we must not use the
449   inline functions since they, among other things, do not set the
450   `errno' variable correctly.  */
451#if defined __STRICT_ANSI__ && !defined __NO_MATH_INLINES
452define __NO_MATH_INLINES 1
453#endif
454
455#if defined __USE_ISOC99 && __GNUC_PREREQ(2,97)
456/* ISO C99 defines some macros to compare number while taking care for
457   unordered numbers.  Many FPUs provide special instructions to support
458   these operations.  Generic support in GCC for these as builtins went
459   in before 3.0.0, but not all cpus added their patterns.  We define
460   versions that use the builtins here, and <bits/mathinline.h> will
461   undef/redefine as appropriate for the specific GCC version in use.  */
462define isgreater(x, y) __builtin_isgreater(x, y)
463define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)
464define isless(x, y) __builtin_isless(x, y)
465define islessequal(x, y) __builtin_islessequal(x, y)
466define islessgreater(x, y) __builtin_islessgreater(x, y)
467define isunordered(u, v) __builtin_isunordered(u, v)
468#endif
469
470/* Get machine-dependent inline versions (if there are any).  */
471#ifdef __USE_EXTERN_INLINES
472include <bits/mathinline.h>
473#endif
474
475/* Define special entry points to use when the compiler got told to
476   only expect finite results.  */
477#if defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0
478include <bits/math-finite.h>
479#endif
480
481#ifdef __USE_ISOC99
482/* If we've still got undefined comparison macros, provide defaults.  */
483
484/* Return nonzero value if X is greater than Y.  */
485ifndef isgreater
486#  define isgreater(x, y) \
487  (__extension__       \
488   ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y);       \
489      !isunordered (__x, __y) && __x > __y; }))
490endif
491
492/* Return nonzero value if X is greater than or equal to Y.  */
493ifndef isgreaterequal
494#  define isgreaterequal(x, y) \
495  (__extension__       \
496   ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y);       \
497      !isunordered (__x, __y) && __x >= __y; }))
498endif
499
500/* Return nonzero value if X is less than Y.  */
501ifndef isless
502#  define isless(x, y) \
503  (__extension__       \
504   ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y);       \
505      !isunordered (__x, __y) && __x < __y; }))
506endif
507
508/* Return nonzero value if X is less than or equal to Y.  */
509ifndef islessequal
510#  define islessequal(x, y) \
511  (__extension__       \
512   ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y);       \
513      !isunordered (__x, __y) && __x <= __y; }))
514endif
515
516/* Return nonzero value if either X is less than Y or Y is less than X.  */
517ifndef islessgreater
518#  define islessgreater(x, y) \
519  (__extension__       \
520   ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y);       \
521      !isunordered (__x, __y) && (__x < __y || __y < __x); }))
522endif
523
524/* Return nonzero value if arguments are unordered.  */
525ifndef isunordered
526#  define isunordered(u, v) \
527  (__extension__       \
528   ({ __typeof__(u) __u = (u); __typeof__(v) __v = (v);       \
529      fpclassify (__u) == FP_NAN || fpclassify (__v) == FP_NAN; }))
530endif
531
532#endif
533
534__END_DECLS
535
536
537#endif /* math.h  */
538
__exception::type
__exception::name
__exception::arg1
__exception::arg2
__exception::retval