/* Prototype declarations for math functions; helper file for <math.h>.
   Copyright (C) 1996-2002, 2003, 2006 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

/* NOTE: Because of the special way this file is used by <math.h>, this
   file must NOT be protected from multiple inclusion as header files
   usually are.

   This file provides prototype declarations for the math functions.
   Most functions are declared using the macro:

   __MATHCALL (NAME,[_r], (ARGS...))

   This means there is a function `NAME' returning `double' and a function
   `NAMEf' returning `float'.  Each place `_Mdouble_' appears in the
   prototype, that is actually `double' in the prototype for `NAME' and
   `float' in the prototype for `NAMEf'.  Reentrant variant functions are
   called `NAME_r' and `NAMEf_r'.

   Functions returning other types like `int' are declared using the macro:

   __MATHDECL (TYPE, NAME,[_r], (ARGS...))

   This is just like __MATHCALL but for a function returning `TYPE'
   instead of `_Mdouble_'.  In all of these cases, there is still
   both a `NAME' and a `NAMEf' that takes `float' arguments.

   Note that there must be no whitespace before the argument passed for
   NAME, to make token pasting work with -traditional.  */

#ifndef _MATH_H
# error "Never include <bits/mathcalls.h> directly; include <math.h> instead."
#endif


/* __MATHCALLX(type,function,[suffix],args,attrib) and
 * __MATHCALLI(type,function,[suffix],args) include libm_hidden_proto
 * (for "double" versions only, xxxf and xxxl do not get this treatment).
 *
 * __MATHDECL(type,function,[suffix],args) does not.
 * __MATHCALL(function,[suffix],args) also does not
 * (it is just a shortcut to __MATHDECL(_Mdouble_,function,[suffix],args)).
 *
 * __MATHDECL_PRIV(type,function,[suffix],args,attrib)
 * includes libm_hidden_proto (always) and declares __foo, not foo.
 */


/* Trigonometric functions.  */

_Mdouble_BEGIN_NAMESPACE
/* Arc cosine of X.  */
__MATHCALLI (acos,, (_Mdouble_ __x))
/* Arc sine of X.  */
__MATHCALLI (asin,, (_Mdouble_ __x))
/* Arc tangent of X.  */
__MATHCALLI (atan,, (_Mdouble_ __x))
/* Arc tangent of Y/X.  */
__MATHCALLI (atan2,, (_Mdouble_ __y, _Mdouble_ __x))

/* Cosine of X.  */
__MATHCALLI (cos,, (_Mdouble_ __x))

/* Sine of X.  */
__MATHCALLI (sin,, (_Mdouble_ __x))

/* Tangent of X.  */
__MATHCALLI (tan,, (_Mdouble_ __x))

/* Hyperbolic functions.  */

/* Hyperbolic cosine of X.  */
__MATHCALLI (cosh,, (_Mdouble_ __x))
/* Hyperbolic sine of X.  */
__MATHCALLI (sinh,, (_Mdouble_ __x))
/* Hyperbolic tangent of X.  */
__MATHCALLI (tanh,, (_Mdouble_ __x))
_Mdouble_END_NAMESPACE

#if defined __USE_GNU
/* Cosine and sine of X.  */
__MATHDECL (void,sincos,,
	    (_Mdouble_ __x, _Mdouble_ *__sinx, _Mdouble_ *__cosx))
#endif

#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
__BEGIN_NAMESPACE_C99
/* Hyperbolic arc cosine of X.  */
__MATHCALLI (acosh,, (_Mdouble_ __x))
/* Hyperbolic arc sine of X.  */
__MATHCALLI (asinh,, (_Mdouble_ __x))
/* Hyperbolic arc tangent of X.  */
__MATHCALLI (atanh,, (_Mdouble_ __x))
__END_NAMESPACE_C99
#endif

/* Exponential and logarithmic functions.  */

_Mdouble_BEGIN_NAMESPACE
/* Exponential function of X.  */
__MATHCALLI (exp,, (_Mdouble_ __x))

/* Break VALUE into a normalized fraction and an integral power of 2.  */
__MATHCALLI (frexp,, (_Mdouble_ __x, int *__exponent))

/* X times (two to the EXP power).  */
__MATHCALLI (ldexp,, (_Mdouble_ __x, int __exponent))

/* Natural logarithm of X.  */
__MATHCALLI (log,, (_Mdouble_ __x))

/* Base-ten logarithm of X.  */
__MATHCALLI (log10,, (_Mdouble_ __x))

/* Break VALUE into integral and fractional parts.  */
__MATHCALLI (modf,, (_Mdouble_ __x, _Mdouble_ *__iptr))
_Mdouble_END_NAMESPACE

#if 0 /*def __USE_GNU*/
/* A function missing in all standards: compute exponent to base ten.  */
__MATHCALL (exp10,, (_Mdouble_ __x))
/* Another name occasionally used.  */
__MATHCALL (pow10,, (_Mdouble_ __x))
#endif

#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
__BEGIN_NAMESPACE_C99
/* Return exp(X) - 1.  */
__MATHCALLI (expm1,, (_Mdouble_ __x))

/* Return log(1 + X).  */
__MATHCALLI (log1p,, (_Mdouble_ __x))

/* Return the base 2 signed integral exponent of X.  */
__MATHCALLI (logb,, (_Mdouble_ __x))
__END_NAMESPACE_C99
#endif

#ifdef __USE_ISOC99
__BEGIN_NAMESPACE_C99
/* Compute base-2 exponential of X.  */
__MATHCALLI (exp2,, (_Mdouble_ __x))

/* Compute base-2 logarithm of X.  */
__MATHCALLI (log2,, (_Mdouble_ __x))
__END_NAMESPACE_C99
#endif


/* Power functions.  */

_Mdouble_BEGIN_NAMESPACE
/* Return X to the Y power.  */
__MATHCALLI (pow,, (_Mdouble_ __x, _Mdouble_ __y))

/* Return the square root of X.  */
__MATHCALLI (sqrt,, (_Mdouble_ __x))
_Mdouble_END_NAMESPACE

#if defined __USE_MISC || defined __USE_XOPEN || defined __USE_ISOC99
__BEGIN_NAMESPACE_C99
/* Return `sqrt(X*X + Y*Y)'.  */
__MATHCALLI (hypot,, (_Mdouble_ __x, _Mdouble_ __y))
__END_NAMESPACE_C99
#endif

#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
__BEGIN_NAMESPACE_C99
/* Return the cube root of X.  */
__MATHCALLI (cbrt,, (_Mdouble_ __x))
__END_NAMESPACE_C99
#endif


/* Nearest integer, absolute value, and remainder functions.  */

_Mdouble_BEGIN_NAMESPACE
/* Smallest integral value not less than X.  */
__MATHCALLX (ceil,, (_Mdouble_ __x), (__const__))

/* Absolute value of X.  */
__MATHCALLX (fabs,, (_Mdouble_ __x), (__const__))

/* Largest integer not greater than X.  */
__MATHCALLX (floor,, (_Mdouble_ __x), (__const__))

/* Floating-point modulo remainder of X/Y.  */
__MATHCALLI (fmod,, (_Mdouble_ __x, _Mdouble_ __y))


/* Return 0 if VALUE is finite or NaN, +1 if it
   is +Infinity, -1 if it is -Infinity.  */
__MATHDECL_PRIV (int,isinf,, (_Mdouble_ __value), (__const__))

/* Return nonzero if VALUE is finite and not NaN.  */
__MATHDECL_PRIV (int,finite,, (_Mdouble_ __value), (__const__))
_Mdouble_END_NAMESPACE

#ifdef __USE_MISC
#if 0
/* Return 0 if VALUE is finite or NaN, +1 if it
   is +Infinity, -1 if it is -Infinity.  */
__MATHDECL_PRIV (int,isinf,, (_Mdouble_ __value), (__const__))

/* Return nonzero if VALUE is finite and not NaN.  */
__MATHDECL_PRIV (int,finite,, (_Mdouble_ __value), (__const__))
#endif
/* Return the remainder of X/Y.  */
__MATHCALL (drem,, (_Mdouble_ __x, _Mdouble_ __y))


/* Return the fractional part of X after dividing out `ilogb (X)'.  */
__MATHCALLI (significand,, (_Mdouble_ __x))
#endif /* Use misc.  */

#if defined __USE_MISC || defined __USE_ISOC99
__BEGIN_NAMESPACE_C99
/* Return X with its signed changed to Y's.  */
__MATHCALLX (copysign,, (_Mdouble_ __x, _Mdouble_ __y), (__const__))
__END_NAMESPACE_C99
#endif

#ifdef __USE_ISOC99
__BEGIN_NAMESPACE_C99
/* Return representation of NaN for double type.  */
__MATHCALLX (nan,, (const char *__tagb), (__const__))
__END_NAMESPACE_C99
#endif

#if defined __USE_MISC || defined __USE_XOPEN || defined __USE_ISOC99
/* Return nonzero if VALUE is not a number.  */
__BEGIN_NAMESPACE_C99
__MATHDECL_PRIV (int,isnan,, (_Mdouble_ __value), (__const__))
__END_NAMESPACE_C99
#endif

#if defined __USE_MISC || defined __USE_XOPEN
#endif


#if defined __USE_MISC || defined __USE_XOPEN || defined __USE_ISOC99
__BEGIN_NAMESPACE_C99
/* Error and gamma functions.  */
__MATHCALLI (erf,, (_Mdouble_))
__MATHCALLI (erfc,, (_Mdouble_))
__MATHCALLI (lgamma,, (_Mdouble_))
__END_NAMESPACE_C99
#endif

#ifdef __USE_ISOC99
__BEGIN_NAMESPACE_C99
/* True gamma function.  */
__MATHCALLI (tgamma,, (_Mdouble_))
__END_NAMESPACE_C99
#endif

#if defined __USE_MISC || defined __USE_XOPEN
/* Obsolete alias for `lgamma'.  */
__MATHCALLI (gamma,, (_Mdouble_))
#endif

#ifdef __USE_MISC
/* Reentrant version of lgamma.  This function uses the global variable
   `signgam'.  The reentrant version instead takes a pointer and stores
   the value through it.  */
__MATHCALL (lgamma,_r, (_Mdouble_, int *__signgamp))
/* __MATHCALLI does not work here, probably due to ,_r, */
#endif


#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
__BEGIN_NAMESPACE_C99
/* Return the integer nearest X in the direction of the
   prevailing rounding mode.  */
__MATHCALLI (rint,, (_Mdouble_ __x))

/* Return X + epsilon if X < Y, X - epsilon if X > Y.  */
__MATHCALLX (nextafter,, (_Mdouble_ __x, _Mdouble_ __y), (__const__))
# if defined __USE_ISOC99 && !defined __LDBL_COMPAT
__MATHCALLX (nexttoward,, (_Mdouble_ __x, long double __y), (__const__))
# endif

/* Return the remainder of integer divison X / Y with infinite precision.  */
__MATHCALLI (remainder,, (_Mdouble_ __x, _Mdouble_ __y))

# if defined __USE_MISC || defined __USE_ISOC99
/* Return X times (2 to the Nth power).  */
__MATHCALLI (scalbn,, (_Mdouble_ __x, int __n))
# endif

/* Return the binary exponent of X, which must be nonzero.  */
__MATHDECLI (int,ilogb,, (_Mdouble_ __x))
#endif

#ifdef __USE_ISOC99
/* Return X times (2 to the Nth power).  */
__MATHCALLI (scalbln,, (_Mdouble_ __x, long int __n))

/* Round X to integral value in floating-point format using current
   rounding direction, but do not raise inexact exception.  */
__MATHCALLI (nearbyint,, (_Mdouble_ __x))

/* Round X to nearest integral value, rounding halfway cases away from
   zero.  */
__MATHCALLX (round,, (_Mdouble_ __x), (__const__))

/* Round X to the integral value in floating-point format nearest but
   not larger in magnitude.  */
__MATHCALLX (trunc,, (_Mdouble_ __x), (__const__))

/* Compute remainder of X and Y and put in *QUO a value with sign of x/y
   and magnitude congruent `mod 2^n' to the magnitude of the integral
   quotient x/y, with n >= 3.  */
__MATHCALLI (remquo,, (_Mdouble_ __x, _Mdouble_ __y, int *__quo))


/* Conversion functions.  */

/* Round X to nearest integral value according to current rounding
   direction.  */
__MATHDECLI (long int,lrint,, (_Mdouble_ __x))
__MATHDECLI (long long int,llrint,, (_Mdouble_ __x))

/* Round X to nearest integral value, rounding halfway cases away from
   zero.  */
__MATHDECLI (long int,lround,, (_Mdouble_ __x))
__MATHDECLI (long long int,llround,, (_Mdouble_ __x))


/* Return positive difference between X and Y.  */
__MATHCALLI (fdim,, (_Mdouble_ __x, _Mdouble_ __y))

/* Return maximum numeric value from X and Y.  */
__MATHCALLI (fmax,, (_Mdouble_ __x, _Mdouble_ __y))

/* Return minimum numeric value from X and Y.  */
__MATHCALLI (fmin,, (_Mdouble_ __x, _Mdouble_ __y))


/* Classify given number.  */
__MATHDECL_PRIV (int, fpclassify,, (_Mdouble_ __value), (__const__))

/* Test for negative number.  */
__MATHDECL_PRIV (int, signbit,, (_Mdouble_ __value), (__const__))


/* Multiply-add function computed as a ternary operation.  */
__MATHCALLI (fma,, (_Mdouble_ __x, _Mdouble_ __y, _Mdouble_ __z))
#endif /* Use ISO C99.  */

#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
__END_NAMESPACE_C99
#endif

#if (defined __USE_MISC || defined __USE_XOPEN_EXTENDED) \
	&& defined __UCLIBC_SUSV3_LEGACY__
/* Return X times (2 to the Nth power).  */
__MATHCALLI (scalb,, (_Mdouble_ __x, _Mdouble_ __n))
#endif
