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