/* Declarations for math functions.
Copyright (C) 1991-2018 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/>. */
* ISO C99 Standard: 7.12 Mathematics <math.h>
#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
#include <bits/libc-header-start.h>
#if defined log && defined __GNUC__
# warning A macro called log was already defined when <math.h> was included.
# warning This will cause compilation problems.
/* Get definitions of __intmax_t and __uintmax_t. */
/* Get machine-dependent vector math functions declarations. */
#include <bits/math-vector.h>
/* Gather machine dependent type support. */
/* Value returned on overflow. With IEEE 754 floating point, this is
+Infinity, otherwise the largest representable positive value. */
# define HUGE_VAL (__builtin_huge_val ())
/* This may provoke compiler warnings, and may not be rounded to
+Infinity in all IEEE 754 rounding modes, but is the best that can
be done in ISO C while remaining a constant expression. 10,000 is
greater than the maximum (decimal) exponent for all supported
floating-point formats and widths. */
# define HUGE_VAL 1e10000
# if __GNUC_PREREQ (3, 3)
# define HUGE_VALF (__builtin_huge_valf ())
# define HUGE_VALL (__builtin_huge_vall ())
# define HUGE_VALF 1e10000f
# define HUGE_VALL 1e10000L
#if __HAVE_FLOAT16 && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define HUGE_VAL_F16 (__builtin_huge_valf16 ())
#if __HAVE_FLOAT32 && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define HUGE_VAL_F32 (__builtin_huge_valf32 ())
#if __HAVE_FLOAT64 && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define HUGE_VAL_F64 (__builtin_huge_valf64 ())
#if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define HUGE_VAL_F128 (__builtin_huge_valf128 ())
#if __HAVE_FLOAT32X && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define HUGE_VAL_F32X (__builtin_huge_valf32x ())
#if __HAVE_FLOAT64X && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define HUGE_VAL_F64X (__builtin_huge_valf64x ())
#if __HAVE_FLOAT128X && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define HUGE_VAL_F128X (__builtin_huge_valf128x ())
/* IEEE positive infinity. */
# if __GNUC_PREREQ (3, 3)
# define INFINITY (__builtin_inff ())
# define INFINITY HUGE_VALF
# if __GNUC_PREREQ (3, 3)
# define NAN (__builtin_nanf (""))
/* This will raise an "invalid" exception outside static initializers,
but is the best that can be done in ISO C while remaining a
# define NAN (0.0f / 0.0f)
#endif /* __USE_ISOC99 */
#if __GLIBC_USE (IEC_60559_BFP_EXT)
/* Signaling NaN macros, if supported. */
# if __GNUC_PREREQ (3, 3)
# define SNANF (__builtin_nansf (""))
# define SNAN (__builtin_nans (""))
# define SNANL (__builtin_nansl (""))
#if __HAVE_FLOAT16 && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define SNANF16 (__builtin_nansf16 (""))
#if __HAVE_FLOAT32 && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define SNANF32 (__builtin_nansf32 (""))
#if __HAVE_FLOAT64 && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define SNANF64 (__builtin_nansf64 (""))
#if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define SNANF128 (__builtin_nansf128 (""))
#if __HAVE_FLOAT32X && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define SNANF32X (__builtin_nansf32x (""))
#if __HAVE_FLOAT64X && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define SNANF64X (__builtin_nansf64x (""))
#if __HAVE_FLOAT128X && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define SNANF128X (__builtin_nansf128x (""))
/* Get __GLIBC_FLT_EVAL_METHOD. */
#include <bits/flt-eval-method.h>
/* Define the following typedefs.
float_t floating-point type at least as wide as `float' used
to evaluate `float' expressions
double_t floating-point type at least as wide as `double' used
to evaluate `double' expressions
# if __GLIBC_FLT_EVAL_METHOD == 0 || __GLIBC_FLT_EVAL_METHOD == 16
# elif __GLIBC_FLT_EVAL_METHOD == 1
# elif __GLIBC_FLT_EVAL_METHOD == 2
typedef long double float_t;
typedef long double double_t;
# elif __GLIBC_FLT_EVAL_METHOD == 32
typedef _Float32 float_t;
# elif __GLIBC_FLT_EVAL_METHOD == 33
typedef _Float32x float_t;
typedef _Float32x double_t;
# elif __GLIBC_FLT_EVAL_METHOD == 64
typedef _Float64 float_t;
typedef _Float64 double_t;
# elif __GLIBC_FLT_EVAL_METHOD == 65
typedef _Float64x float_t;
typedef _Float64x double_t;
# elif __GLIBC_FLT_EVAL_METHOD == 128
typedef _Float128 float_t;
typedef _Float128 double_t;
# elif __GLIBC_FLT_EVAL_METHOD == 129
typedef _Float128x float_t;
typedef _Float128x double_t;
# error "Unknown __GLIBC_FLT_EVAL_METHOD"
/* Define macros for the return values of ilogb and llogb, based on
__FP_LOGB0_IS_MIN and __FP_LOGBNAN_IS_MIN.
FP_ILOGB0 Expands to a value returned by `ilogb (0.0)'.
FP_ILOGBNAN Expands to a value returned by `ilogb (NAN)'.
FP_LLOGB0 Expands to a value returned by `llogb (0.0)'.
FP_LLOGBNAN Expands to a value returned by `llogb (NAN)'.
#include <bits/fp-logb.h>
# define FP_ILOGB0 (-2147483647 - 1)
# define FP_ILOGB0 (-2147483647)
# define FP_ILOGBNAN (-2147483647 - 1)
# define FP_ILOGBNAN 2147483647
#if __GLIBC_USE (IEC_60559_BFP_EXT)
# define __FP_LONG_MAX 0x7fffffffL
# define __FP_LONG_MAX 0x7fffffffffffffffL
# define FP_LLOGB0 (-__FP_LONG_MAX - 1)
# define FP_LLOGB0 (-__FP_LONG_MAX)
# define FP_LLOGBNAN (-__FP_LONG_MAX - 1)
# define FP_LLOGBNAN __FP_LONG_MAX
/* Get the architecture specific values describing the floating-point
evaluation. The following symbols will get defined:
If defined it indicates that the `fma' function
generally executes about as fast as a multiply and an add.
This macro is defined only iff the `fma' function is
implemented directly with a hardware multiply-add instructions.
#include <bits/fp-fast.h>
#if __GLIBC_USE (IEC_60559_BFP_EXT)
/* Rounding direction macros for fromfp functions. */
# define FP_INT_DOWNWARD 1
# define FP_INT_TOWARDZERO 2
FP_INT_TONEARESTFROMZERO =
# define FP_INT_TONEARESTFROMZERO 3
FP_INT_TONEARESTFROMZERO,
# define FP_INT_TONEAREST 4
/* The file <bits/mathcalls.h> contains the prototypes for all the
actual math functions. These macros are used for those prototypes,
so we can easily declare each function as both `name' and `__name',
and can declare the float versions `namef' and `__namef'. */
#define __SIMD_DECL(function) __CONCAT (__DECL_SIMD_, function)
#define __MATHCALL_VEC(function, suffix, args) \
__SIMD_DECL (__MATH_PRECNAME (function, suffix)) \
__MATHCALL (function, suffix, args)
#define __MATHDECL_VEC(type, function,suffix, args) \
__SIMD_DECL (__MATH_PRECNAME (function, suffix)) \
__MATHDECL(type, function,suffix, args)
#define __MATHCALL(function,suffix, args) \
__MATHDECL (_Mdouble_,function,suffix, args)
#define __MATHDECL(type, function,suffix, args) \
__MATHDECL_1(type, function,suffix, args); \
__MATHDECL_1(type, __CONCAT(__,function),suffix, args)
#define __MATHCALLX(function,suffix, args, attrib) \
__MATHDECLX (_Mdouble_,function,suffix, args, attrib)
#define __MATHDECLX(type, function,suffix, args, attrib) \
__MATHDECL_1(type, function,suffix, args) __attribute__ (attrib); \
__MATHDECL_1(type, __CONCAT(__,function),suffix, args) __attribute__ (attrib)
#define __MATHDECL_1(type, function,suffix, args) \
extern type __MATH_PRECNAME(function,suffix) args __THROW
#define __MATH_PRECNAME(name,r) __CONCAT(name,r)
#define __MATH_DECLARING_DOUBLE 1
#define __MATH_DECLARING_FLOATN 0
#include <bits/mathcalls-helper-functions.h>
#include <bits/mathcalls.h>
#undef __MATH_DECLARING_DOUBLE
#undef __MATH_DECLARING_FLOATN
/* Include the file of declarations again, this time using `float'
instead of `double' and appending f to each function name. */
# define __MATH_PRECNAME(name,r) name##f##r
# define __MATH_DECLARING_DOUBLE 0
# define __MATH_DECLARING_FLOATN 0
# include <bits/mathcalls-helper-functions.h>
# include <bits/mathcalls.h>
# undef __MATH_DECLARING_DOUBLE
# undef __MATH_DECLARING_FLOATN
# if !(defined __NO_LONG_DOUBLE_MATH && defined _LIBC) \
|| defined __LDBL_COMPAT \
extern float __nldbl_nexttowardf (float __x, long double __y)
__THROW __attribute__ ((__const__));
extern float __REDIRECT_NTH (nexttowardf, (float __x, long double __y),
__attribute__ ((__const__));
extern double __REDIRECT_NTH (nexttoward, (double __x, long double __y),
nextafter) __attribute__ ((__const__));
extern long double __REDIRECT_NTH (nexttowardl,
(long double __x, long double __y),
nextafter) __attribute__ ((__const__));
# define __MATHDECL_2(type, function,suffix, args, alias) \
extern type __REDIRECT_NTH(__MATH_PRECNAME(function,suffix), \
# define __MATHDECL_1(type, function,suffix, args) \
__MATHDECL_2(type, function,suffix, args, __CONCAT(function,suffix))
/* Include the file of declarations again, this time using `long double'
instead of `double' and appending l to each function name. */
# define _Mdouble_ long double
# define __MATH_PRECNAME(name,r) name##l##r
# define __MATH_DECLARING_DOUBLE 0
# define __MATH_DECLARING_FLOATN 0
# define __MATH_DECLARE_LDOUBLE 1
# include <bits/mathcalls-helper-functions.h>
# include <bits/mathcalls.h>
# undef __MATH_DECLARING_DOUBLE
# undef __MATH_DECLARING_FLOATN
# endif /* !(__NO_LONG_DOUBLE_MATH && _LIBC) || __LDBL_COMPAT */
#endif /* Use ISO C99. */
/* Include the file of declarations for _FloatN and _FloatNx
#if __HAVE_DISTINCT_FLOAT16 || (__HAVE_FLOAT16 && !defined _LIBC)
# define _Mdouble_ _Float16
# define __MATH_PRECNAME(name,r) name##f16##r
# define __MATH_DECLARING_DOUBLE 0
# define __MATH_DECLARING_FLOATN 1
# if __HAVE_DISTINCT_FLOAT16
# include <bits/mathcalls-helper-functions.h>
# if __GLIBC_USE (IEC_60559_TYPES_EXT)
# include <bits/mathcalls.h>
# undef __MATH_DECLARING_DOUBLE
# undef __MATH_DECLARING_FLOATN
#endif /* __HAVE_DISTINCT_FLOAT16 || (__HAVE_FLOAT16 && !_LIBC). */
#if __HAVE_DISTINCT_FLOAT32 || (__HAVE_FLOAT32 && !defined _LIBC)
# define _Mdouble_ _Float32
# define __MATH_PRECNAME(name,r) name##f32##r
# define __MATH_DECLARING_DOUBLE 0
# define __MATH_DECLARING_FLOATN 1
# if __HAVE_DISTINCT_FLOAT32
# include <bits/mathcalls-helper-functions.h>
# if __GLIBC_USE (IEC_60559_TYPES_EXT)
# include <bits/mathcalls.h>
# undef __MATH_DECLARING_DOUBLE
# undef __MATH_DECLARING_FLOATN
#endif /* __HAVE_DISTINCT_FLOAT32 || (__HAVE_FLOAT32 && !_LIBC). */
#if __HAVE_DISTINCT_FLOAT64 || (__HAVE_FLOAT64 && !defined _LIBC)
# define _Mdouble_ _Float64
# define __MATH_PRECNAME(name,r) name##f64##r
# define __MATH_DECLARING_DOUBLE 0
# define __MATH_DECLARING_FLOATN 1
# if __HAVE_DISTINCT_FLOAT64
# include <bits/mathcalls-helper-functions.h>
# if __GLIBC_USE (IEC_60559_TYPES_EXT)
# include <bits/mathcalls.h>
# undef __MATH_DECLARING_DOUBLE
# undef __MATH_DECLARING_FLOATN
#endif /* __HAVE_DISTINCT_FLOAT64 || (__HAVE_FLOAT64 && !_LIBC). */
#if __HAVE_DISTINCT_FLOAT128 || (__HAVE_FLOAT128 && !defined _LIBC)
# define _Mdouble_ _Float128
# define __MATH_PRECNAME(name,r) name##f128##r
# define __MATH_DECLARING_DOUBLE 0
# define __MATH_DECLARING_FLOATN 1
# if __HAVE_DISTINCT_FLOAT128
# include <bits/mathcalls-helper-functions.h>
# if __GLIBC_USE (IEC_60559_TYPES_EXT)
# include <bits/mathcalls.h>
# undef __MATH_DECLARING_DOUBLE
# undef __MATH_DECLARING_FLOATN
#endif /* __HAVE_DISTINCT_FLOAT128 || (__HAVE_FLOAT128 && !_LIBC). */
#if __HAVE_DISTINCT_FLOAT32X || (__HAVE_FLOAT32X && !defined _LIBC)
# define _Mdouble_ _Float32x
# define __MATH_PRECNAME(name,r) name##f32x##r
# define __MATH_DECLARING_DOUBLE 0
# define __MATH_DECLARING_FLOATN 1
# if __HAVE_DISTINCT_FLOAT32X
# include <bits/mathcalls-helper-functions.h>
# if __GLIBC_USE (IEC_60559_TYPES_EXT)
# include <bits/mathcalls.h>
# undef __MATH_DECLARING_DOUBLE
# undef __MATH_DECLARING_FLOATN
#endif /* __HAVE_DISTINCT_FLOAT32X || (__HAVE_FLOAT32X && !_LIBC). */
#if __HAVE_DISTINCT_FLOAT64X || (__HAVE_FLOAT64X && !defined _LIBC)
# define _Mdouble_ _Float64x
# define __MATH_PRECNAME(name,r) name##f64x##r
# define __MATH_DECLARING_DOUBLE 0
# define __MATH_DECLARING_FLOATN 1
# if __HAVE_DISTINCT_FLOAT64X
# include <bits/mathcalls-helper-functions.h>
# if __GLIBC_USE (IEC_60559_TYPES_EXT)
# include <bits/mathcalls.h>
# undef __MATH_DECLARING_DOUBLE
# undef __MATH_DECLARING_FLOATN
#endif /* __HAVE_DISTINCT_FLOAT64X || (__HAVE_FLOAT64X && !_LIBC). */
#if __HAVE_DISTINCT_FLOAT128X || (__HAVE_FLOAT128X && !defined _LIBC)
# define _Mdouble_ _Float128x
# define __MATH_PRECNAME(name,r) name##f128x##r
# define __MATH_DECLARING_DOUBLE 0
# define __MATH_DECLARING_FLOATN 1
# if __HAVE_DISTINCT_FLOAT128X
# include <bits/mathcalls-helper-functions.h>
# if __GLIBC_USE (IEC_60559_TYPES_EXT)
# include <bits/mathcalls.h>
# undef __MATH_DECLARING_DOUBLE
# undef __MATH_DECLARING_FLOATN
#endif /* __HAVE_DISTINCT_FLOAT128X || (__HAVE_FLOAT128X && !_LIBC). */
/* Declare functions returning a narrower type. */
#define __MATHCALL_NARROW_ARGS_1 (_Marg_ __x)
#define __MATHCALL_NARROW_ARGS_2 (_Marg_ __x, _Marg_ __y)
#define __MATHCALL_NARROW_ARGS_3 (_Marg_ __x, _Marg_ __y, _Marg_ __z)
#define __MATHCALL_NARROW_NORMAL(func, nargs) \
extern _Mret_ func __MATHCALL_NARROW_ARGS_ ## nargs __THROW
#define __MATHCALL_NARROW_REDIR(func, redir, nargs) \
extern _Mret_ __REDIRECT_NTH (func, __MATHCALL_NARROW_ARGS_ ## nargs, \
#define __MATHCALL_NARROW(func, redir, nargs) \
__MATHCALL_NARROW_NORMAL (func, nargs)
#if __GLIBC_USE (IEC_60559_BFP_EXT)