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