diff options
Diffstat (limited to 'aarch64-none-linux-gnu/include/c++/13.2.1/cmath')
-rw-r--r-- | aarch64-none-linux-gnu/include/c++/13.2.1/cmath | 3704 |
1 files changed, 3704 insertions, 0 deletions
diff --git a/aarch64-none-linux-gnu/include/c++/13.2.1/cmath b/aarch64-none-linux-gnu/include/c++/13.2.1/cmath new file mode 100644 index 0000000..4dc029e --- /dev/null +++ b/aarch64-none-linux-gnu/include/c++/13.2.1/cmath @@ -0,0 +1,3704 @@ +// -*- C++ -*- C forwarding header. + +// Copyright (C) 1997-2023 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This 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 General Public License for more details. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// <http://www.gnu.org/licenses/>. + +/** @file include/cmath + * This is a Standard C++ Library file. You should @c \#include this file + * in your programs, rather than any of the @a *.h implementation files. + * + * This is the C++ version of the Standard C Library header @c math.h, + * and its contents are (mostly) the same as that header, but are all + * contained in the namespace @c std (except for names which are defined + * as macros in C). + */ + +// +// ISO C++ 14882: 26.5 C library +// + +#pragma GCC system_header + +#include <bits/requires_hosted.h> + +#include <bits/c++config.h> +#include <bits/cpp_type_traits.h> +#include <ext/type_traits.h> +#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS +#include_next <math.h> +#undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS +#include <bits/std_abs.h> + +#ifndef _GLIBCXX_CMATH +#define _GLIBCXX_CMATH 1 + +// Get rid of those macros defined in <math.h> in lieu of real functions. +#undef div +#undef acos +#undef asin +#undef atan +#undef atan2 +#undef ceil +#undef cos +#undef cosh +#undef exp +#undef fabs +#undef floor +#undef fmod +#undef frexp +#undef ldexp +#undef log +#undef log10 +#undef modf +#undef pow +#undef sin +#undef sinh +#undef sqrt +#undef tan +#undef tanh + +extern "C++" +{ +namespace std _GLIBCXX_VISIBILITY(default) +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION + + using ::acos; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + acos(float __x) + { return __builtin_acosf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + acos(long double __x) + { return __builtin_acosl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + acos(_Tp __x) + { return __builtin_acos(__x); } + + using ::asin; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + asin(float __x) + { return __builtin_asinf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + asin(long double __x) + { return __builtin_asinl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + asin(_Tp __x) + { return __builtin_asin(__x); } + + using ::atan; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + atan(float __x) + { return __builtin_atanf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + atan(long double __x) + { return __builtin_atanl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + atan(_Tp __x) + { return __builtin_atan(__x); } + + using ::atan2; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + atan2(float __y, float __x) + { return __builtin_atan2f(__y, __x); } + + inline _GLIBCXX_CONSTEXPR long double + atan2(long double __y, long double __x) + { return __builtin_atan2l(__y, __x); } +#endif + + using ::ceil; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + ceil(float __x) + { return __builtin_ceilf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + ceil(long double __x) + { return __builtin_ceill(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + ceil(_Tp __x) + { return __builtin_ceil(__x); } + + using ::cos; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + cos(float __x) + { return __builtin_cosf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + cos(long double __x) + { return __builtin_cosl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + cos(_Tp __x) + { return __builtin_cos(__x); } + + using ::cosh; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + cosh(float __x) + { return __builtin_coshf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + cosh(long double __x) + { return __builtin_coshl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + cosh(_Tp __x) + { return __builtin_cosh(__x); } + + using ::exp; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + exp(float __x) + { return __builtin_expf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + exp(long double __x) + { return __builtin_expl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + exp(_Tp __x) + { return __builtin_exp(__x); } + + using ::fabs; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + fabs(float __x) + { return __builtin_fabsf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + fabs(long double __x) + { return __builtin_fabsl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + fabs(_Tp __x) + { return __builtin_fabs(__x); } + + using ::floor; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + floor(float __x) + { return __builtin_floorf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + floor(long double __x) + { return __builtin_floorl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + floor(_Tp __x) + { return __builtin_floor(__x); } + + using ::fmod; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + fmod(float __x, float __y) + { return __builtin_fmodf(__x, __y); } + + inline _GLIBCXX_CONSTEXPR long double + fmod(long double __x, long double __y) + { return __builtin_fmodl(__x, __y); } +#endif + + using ::frexp; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline float + frexp(float __x, int* __exp) + { return __builtin_frexpf(__x, __exp); } + + inline long double + frexp(long double __x, int* __exp) + { return __builtin_frexpl(__x, __exp); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + frexp(_Tp __x, int* __exp) + { return __builtin_frexp(__x, __exp); } + + using ::ldexp; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + ldexp(float __x, int __exp) + { return __builtin_ldexpf(__x, __exp); } + + inline _GLIBCXX_CONSTEXPR long double + ldexp(long double __x, int __exp) + { return __builtin_ldexpl(__x, __exp); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + ldexp(_Tp __x, int __exp) + { return __builtin_ldexp(__x, __exp); } + + using ::log; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + log(float __x) + { return __builtin_logf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + log(long double __x) + { return __builtin_logl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + log(_Tp __x) + { return __builtin_log(__x); } + + using ::log10; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + log10(float __x) + { return __builtin_log10f(__x); } + + inline _GLIBCXX_CONSTEXPR long double + log10(long double __x) + { return __builtin_log10l(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + log10(_Tp __x) + { return __builtin_log10(__x); } + + using ::modf; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline float + modf(float __x, float* __iptr) + { return __builtin_modff(__x, __iptr); } + + inline long double + modf(long double __x, long double* __iptr) + { return __builtin_modfl(__x, __iptr); } +#endif + + using ::pow; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + pow(float __x, float __y) + { return __builtin_powf(__x, __y); } + + inline _GLIBCXX_CONSTEXPR long double + pow(long double __x, long double __y) + { return __builtin_powl(__x, __y); } + +#if __cplusplus < 201103L + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 550. What should the return type of pow(float,int) be? + inline double + pow(double __x, int __i) + { return __builtin_powi(__x, __i); } + + inline float + pow(float __x, int __n) + { return __builtin_powif(__x, __n); } + + inline long double + pow(long double __x, int __n) + { return __builtin_powil(__x, __n); } +#endif +#endif + + using ::sin; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + sin(float __x) + { return __builtin_sinf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + sin(long double __x) + { return __builtin_sinl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + sin(_Tp __x) + { return __builtin_sin(__x); } + + using ::sinh; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + sinh(float __x) + { return __builtin_sinhf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + sinh(long double __x) + { return __builtin_sinhl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + sinh(_Tp __x) + { return __builtin_sinh(__x); } + + using ::sqrt; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + sqrt(float __x) + { return __builtin_sqrtf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + sqrt(long double __x) + { return __builtin_sqrtl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + sqrt(_Tp __x) + { return __builtin_sqrt(__x); } + + using ::tan; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + tan(float __x) + { return __builtin_tanf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + tan(long double __x) + { return __builtin_tanl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + tan(_Tp __x) + { return __builtin_tan(__x); } + + using ::tanh; + +#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO + inline _GLIBCXX_CONSTEXPR float + tanh(float __x) + { return __builtin_tanhf(__x); } + + inline _GLIBCXX_CONSTEXPR long double + tanh(long double __x) + { return __builtin_tanhl(__x); } +#endif + + template<typename _Tp> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + tanh(_Tp __x) + { return __builtin_tanh(__x); } + +#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) + constexpr _Float16 + acos(_Float16 __x) + { return _Float16(__builtin_acosf(__x)); } + + constexpr _Float16 + asin(_Float16 __x) + { return _Float16(__builtin_asinf(__x)); } + + constexpr _Float16 + atan(_Float16 __x) + { return _Float16(__builtin_atanf(__x)); } + + constexpr _Float16 + atan2(_Float16 __y, _Float16 __x) + { return _Float16(__builtin_atan2f(__y, __x)); } + + constexpr _Float16 + ceil(_Float16 __x) + { return _Float16(__builtin_ceilf(__x)); } + + constexpr _Float16 + cos(_Float16 __x) + { return _Float16(__builtin_cosf(__x)); } + + constexpr _Float16 + cosh(_Float16 __x) + { return _Float16(__builtin_coshf(__x)); } + + constexpr _Float16 + exp(_Float16 __x) + { return _Float16(__builtin_expf(__x)); } + + constexpr _Float16 + fabs(_Float16 __x) + { return _Float16(__builtin_fabsf(__x)); } + + constexpr _Float16 + floor(_Float16 __x) + { return _Float16(__builtin_floorf(__x)); } + + constexpr _Float16 + fmod(_Float16 __x, _Float16 __y) + { return _Float16(__builtin_fmodf(__x, __y)); } + + inline _Float16 + frexp(_Float16 __x, int* __exp) + { return _Float16(__builtin_frexpf(__x, __exp)); } + + constexpr _Float16 + ldexp(_Float16 __x, int __exp) + { return _Float16(__builtin_ldexpf(__x, __exp)); } + + constexpr _Float16 + log(_Float16 __x) + { return _Float16(__builtin_logf(__x)); } + + constexpr _Float16 + log10(_Float16 __x) + { return _Float16(__builtin_log10f(__x)); } + + inline _Float16 + modf(_Float16 __x, _Float16* __iptr) + { + float __i, __ret = __builtin_modff(__x, &__i); + *__iptr = _Float16(__i); + return _Float16(__ret); + } + + constexpr _Float16 + pow(_Float16 __x, _Float16 __y) + { return _Float16(__builtin_powf(__x, __y)); } + + constexpr _Float16 + sin(_Float16 __x) + { return _Float16(__builtin_sinf(__x)); } + + constexpr _Float16 + sinh(_Float16 __x) + { return _Float16(__builtin_sinhf(__x)); } + + constexpr _Float16 + sqrt(_Float16 __x) + { return _Float16(__builtin_sqrtf(__x)); } + + constexpr _Float16 + tan(_Float16 __x) + { return _Float16(__builtin_tanf(__x)); } + + constexpr _Float16 + tanh(_Float16 __x) + { return _Float16(__builtin_tanhf(__x)); } +#endif + +#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) + constexpr _Float32 + acos(_Float32 __x) + { return __builtin_acosf(__x); } + + constexpr _Float32 + asin(_Float32 __x) + { return __builtin_asinf(__x); } + + constexpr _Float32 + atan(_Float32 __x) + { return __builtin_atanf(__x); } + + constexpr _Float32 + atan2(_Float32 __y, _Float32 __x) + { return __builtin_atan2f(__y, __x); } + + constexpr _Float32 + ceil(_Float32 __x) + { return __builtin_ceilf(__x); } + + constexpr _Float32 + cos(_Float32 __x) + { return __builtin_cosf(__x); } + + constexpr _Float32 + cosh(_Float32 __x) + { return __builtin_coshf(__x); } + + constexpr _Float32 + exp(_Float32 __x) + { return __builtin_expf(__x); } + + constexpr _Float32 + fabs(_Float32 __x) + { return __builtin_fabsf(__x); } + + constexpr _Float32 + floor(_Float32 __x) + { return __builtin_floorf(__x); } + + constexpr _Float32 + fmod(_Float32 __x, _Float32 __y) + { return __builtin_fmodf(__x, __y); } + + inline _Float32 + frexp(_Float32 __x, int* __exp) + { return __builtin_frexpf(__x, __exp); } + + constexpr _Float32 + ldexp(_Float32 __x, int __exp) + { return __builtin_ldexpf(__x, __exp); } + + constexpr _Float32 + log(_Float32 __x) + { return __builtin_logf(__x); } + + constexpr _Float32 + log10(_Float32 __x) + { return __builtin_log10f(__x); } + + inline _Float32 + modf(_Float32 __x, _Float32* __iptr) + { + float __i, __ret = __builtin_modff(__x, &__i); + *__iptr = __i; + return __ret; + } + + constexpr _Float32 + pow(_Float32 __x, _Float32 __y) + { return __builtin_powf(__x, __y); } + + constexpr _Float32 + sin(_Float32 __x) + { return __builtin_sinf(__x); } + + constexpr _Float32 + sinh(_Float32 __x) + { return __builtin_sinhf(__x); } + + constexpr _Float32 + sqrt(_Float32 __x) + { return __builtin_sqrtf(__x); } + + constexpr _Float32 + tan(_Float32 __x) + { return __builtin_tanf(__x); } + + constexpr _Float32 + tanh(_Float32 __x) + { return __builtin_tanhf(__x); } +#endif + +#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64) + constexpr _Float64 + acos(_Float64 __x) + { return __builtin_acos(__x); } + + constexpr _Float64 + asin(_Float64 __x) + { return __builtin_asin(__x); } + + constexpr _Float64 + atan(_Float64 __x) + { return __builtin_atan(__x); } + + constexpr _Float64 + atan2(_Float64 __y, _Float64 __x) + { return __builtin_atan2(__y, __x); } + + constexpr _Float64 + ceil(_Float64 __x) + { return __builtin_ceil(__x); } + + constexpr _Float64 + cos(_Float64 __x) + { return __builtin_cos(__x); } + + constexpr _Float64 + cosh(_Float64 __x) + { return __builtin_cosh(__x); } + + constexpr _Float64 + exp(_Float64 __x) + { return __builtin_exp(__x); } + + constexpr _Float64 + fabs(_Float64 __x) + { return __builtin_fabs(__x); } + + constexpr _Float64 + floor(_Float64 __x) + { return __builtin_floor(__x); } + + constexpr _Float64 + fmod(_Float64 __x, _Float64 __y) + { return __builtin_fmod(__x, __y); } + + inline _Float64 + frexp(_Float64 __x, int* __exp) + { return __builtin_frexp(__x, __exp); } + + constexpr _Float64 + ldexp(_Float64 __x, int __exp) + { return __builtin_ldexp(__x, __exp); } + + constexpr _Float64 + log(_Float64 __x) + { return __builtin_log(__x); } + + constexpr _Float64 + log10(_Float64 __x) + { return __builtin_log10(__x); } + + inline _Float64 + modf(_Float64 __x, _Float64* __iptr) + { + double __i, __ret = __builtin_modf(__x, &__i); + *__iptr = __i; + return __ret; + } + + constexpr _Float64 + pow(_Float64 __x, _Float64 __y) + { return __builtin_pow(__x, __y); } + + constexpr _Float64 + sin(_Float64 __x) + { return __builtin_sin(__x); } + + constexpr _Float64 + sinh(_Float64 __x) + { return __builtin_sinh(__x); } + + constexpr _Float64 + sqrt(_Float64 __x) + { return __builtin_sqrt(__x); } + + constexpr _Float64 + tan(_Float64 __x) + { return __builtin_tan(__x); } + + constexpr _Float64 + tanh(_Float64 __x) + { return __builtin_tanh(__x); } +#endif + +#if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128) + constexpr _Float128 + acos(_Float128 __x) + { return __builtin_acosl(__x); } + + constexpr _Float128 + asin(_Float128 __x) + { return __builtin_asinl(__x); } + + constexpr _Float128 + atan(_Float128 __x) + { return __builtin_atanl(__x); } + + constexpr _Float128 + atan2(_Float128 __y, _Float128 __x) + { return __builtin_atan2l(__y, __x); } + + constexpr _Float128 + ceil(_Float128 __x) + { return __builtin_ceill(__x); } + + constexpr _Float128 + cos(_Float128 __x) + { return __builtin_cosl(__x); } + + constexpr _Float128 + cosh(_Float128 __x) + { return __builtin_coshl(__x); } + + constexpr _Float128 + exp(_Float128 __x) + { return __builtin_expl(__x); } + + constexpr _Float128 + fabs(_Float128 __x) + { return __builtin_fabsl(__x); } + + constexpr _Float128 + floor(_Float128 __x) + { return __builtin_floorl(__x); } + + constexpr _Float128 + fmod(_Float128 __x, _Float128 __y) + { return __builtin_fmodl(__x, __y); } + + inline _Float128 + frexp(_Float128 __x, int* __exp) + { return __builtin_frexpl(__x, __exp); } + + constexpr _Float128 + ldexp(_Float128 __x, int __exp) + { return __builtin_ldexpl(__x, __exp); } + + constexpr _Float128 + log(_Float128 __x) + { return __builtin_logl(__x); } + + constexpr _Float128 + log10(_Float128 __x) + { return __builtin_log10l(__x); } + + inline _Float128 + modf(_Float128 __x, _Float128* __iptr) + { + long double __i, __ret = __builtin_modfl(__x, &__i); + *__iptr = __i; + return __ret; + } + + constexpr _Float128 + pow(_Float128 __x, _Float128 __y) + { return __builtin_powl(__x, __y); } + + constexpr _Float128 + sin(_Float128 __x) + { return __builtin_sinl(__x); } + + constexpr _Float128 + sinh(_Float128 __x) + { return __builtin_sinhl(__x); } + + constexpr _Float128 + sqrt(_Float128 __x) + { return __builtin_sqrtl(__x); } + + constexpr _Float128 + tan(_Float128 __x) + { return __builtin_tanl(__x); } + + constexpr _Float128 + tanh(_Float128 __x) + { return __builtin_tanhl(__x); } +#elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH) + constexpr _Float128 + acos(_Float128 __x) + { return __builtin_acosf128(__x); } + + constexpr _Float128 + asin(_Float128 __x) + { return __builtin_asinf128(__x); } + + constexpr _Float128 + atan(_Float128 __x) + { return __builtin_atanf128(__x); } + + constexpr _Float128 + atan2(_Float128 __y, _Float128 __x) + { return __builtin_atan2f128(__y, __x); } + + constexpr _Float128 + ceil(_Float128 __x) + { return __builtin_ceilf128(__x); } + + constexpr _Float128 + cos(_Float128 __x) + { return __builtin_cosf128(__x); } + + constexpr _Float128 + cosh(_Float128 __x) + { return __builtin_coshf128(__x); } + + constexpr _Float128 + exp(_Float128 __x) + { return __builtin_expf128(__x); } + + constexpr _Float128 + fabs(_Float128 __x) + { return __builtin_fabsf128(__x); } + + constexpr _Float128 + floor(_Float128 __x) + { return __builtin_floorf128(__x); } + + constexpr _Float128 + fmod(_Float128 __x, _Float128 __y) + { return __builtin_fmodf128(__x, __y); } + + inline _Float128 + frexp(_Float128 __x, int* __exp) + { return __builtin_frexpf128(__x, __exp); } + + constexpr _Float128 + ldexp(_Float128 __x, int __exp) + { return __builtin_ldexpf128(__x, __exp); } + + constexpr _Float128 + log(_Float128 __x) + { return __builtin_logf128(__x); } + + constexpr _Float128 + log10(_Float128 __x) + { return __builtin_log10f128(__x); } + + inline _Float128 + modf(_Float128 __x, _Float128* __iptr) + { return __builtin_modff128(__x, __iptr); } + + constexpr _Float128 + pow(_Float128 __x, _Float128 __y) + { return __builtin_powf128(__x, __y); } + + constexpr _Float128 + sin(_Float128 __x) + { return __builtin_sinf128(__x); } + + constexpr _Float128 + sinh(_Float128 __x) + { return __builtin_sinhf128(__x); } + + constexpr _Float128 + sqrt(_Float128 __x) + { return __builtin_sqrtf128(__x); } + + constexpr _Float128 + tan(_Float128 __x) + { return __builtin_tanf128(__x); } + + constexpr _Float128 + tanh(_Float128 __x) + { return __builtin_tanhf128(__x); } +#endif + +#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) + constexpr __gnu_cxx::__bfloat16_t + acos(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_acosf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + asin(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_asinf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + atan(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_atanf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + atan2(__gnu_cxx::__bfloat16_t __y, __gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_atan2f(__y, __x)); } + + constexpr __gnu_cxx::__bfloat16_t + ceil(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_ceilf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + cos(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_cosf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + cosh(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_coshf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + exp(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_expf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + fabs(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_fabsf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + floor(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_floorf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + fmod(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __gnu_cxx::__bfloat16_t(__builtin_fmodf(__x, __y)); } + + inline __gnu_cxx::__bfloat16_t + frexp(__gnu_cxx::__bfloat16_t __x, int* __exp) + { return __gnu_cxx::__bfloat16_t(__builtin_frexpf(__x, __exp)); } + + constexpr __gnu_cxx::__bfloat16_t + ldexp(__gnu_cxx::__bfloat16_t __x, int __exp) + { return __gnu_cxx::__bfloat16_t(__builtin_ldexpf(__x, __exp)); } + + constexpr __gnu_cxx::__bfloat16_t + log(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_logf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + log10(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_log10f(__x)); } + + inline __gnu_cxx::__bfloat16_t + modf(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t* __iptr) + { + float __i, __ret = __builtin_modff(__x, &__i); + *__iptr = __gnu_cxx::__bfloat16_t(__i); + return __gnu_cxx::__bfloat16_t(__ret); + } + + constexpr __gnu_cxx::__bfloat16_t + pow(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __gnu_cxx::__bfloat16_t(__builtin_powf(__x, __y)); } + + constexpr __gnu_cxx::__bfloat16_t + sin(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_sinf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + sinh(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_sinhf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + sqrt(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_sqrtf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + tan(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_tanf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + tanh(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_tanhf(__x)); } +#endif + + template<typename _Tp, typename _Up> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + atan2(_Tp __y, _Up __x) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return atan2(__type(__y), __type(__x)); + } + + template<typename _Tp, typename _Up> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + fmod(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return fmod(__type(__x), __type(__y)); + } + + template<typename _Tp, typename _Up> + inline _GLIBCXX_CONSTEXPR + typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + pow(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return pow(__type(__x), __type(__y)); + } + +#if _GLIBCXX_USE_C99_MATH +#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC + +// These are possible macros imported from C99-land. +#undef fpclassify +#undef isfinite +#undef isinf +#undef isnan +#undef isnormal +#undef signbit +#undef isgreater +#undef isgreaterequal +#undef isless +#undef islessequal +#undef islessgreater +#undef isunordered + +#if __cplusplus >= 201103L + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr int + fpclassify(float __x) + { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, + FP_SUBNORMAL, FP_ZERO, __x); } + + constexpr int + fpclassify(double __x) + { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, + FP_SUBNORMAL, FP_ZERO, __x); } + + constexpr int + fpclassify(long double __x) + { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, + FP_SUBNORMAL, FP_ZERO, __x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + int>::__type + fpclassify(_Tp __x) + { return __x != 0 ? FP_NORMAL : FP_ZERO; } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr bool + isfinite(float __x) + { return __builtin_isfinite(__x); } + + constexpr bool + isfinite(double __x) + { return __builtin_isfinite(__x); } + + constexpr bool + isfinite(long double __x) + { return __builtin_isfinite(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + bool>::__type + isfinite(_Tp __x) + { return true; } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr bool + isinf(float __x) + { return __builtin_isinf(__x); } + +#if _GLIBCXX_HAVE_OBSOLETE_ISINF \ + && !_GLIBCXX_NO_OBSOLETE_ISINF_ISNAN_DYNAMIC + using ::isinf; +#else + constexpr bool + isinf(double __x) + { return __builtin_isinf(__x); } +#endif + + constexpr bool + isinf(long double __x) + { return __builtin_isinf(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + bool>::__type + isinf(_Tp __x) + { return false; } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr bool + isnan(float __x) + { return __builtin_isnan(__x); } + +#if _GLIBCXX_HAVE_OBSOLETE_ISNAN \ + && !_GLIBCXX_NO_OBSOLETE_ISINF_ISNAN_DYNAMIC + using ::isnan; +#else + constexpr bool + isnan(double __x) + { return __builtin_isnan(__x); } +#endif + + constexpr bool + isnan(long double __x) + { return __builtin_isnan(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + bool>::__type + isnan(_Tp __x) + { return false; } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr bool + isnormal(float __x) + { return __builtin_isnormal(__x); } + + constexpr bool + isnormal(double __x) + { return __builtin_isnormal(__x); } + + constexpr bool + isnormal(long double __x) + { return __builtin_isnormal(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + bool>::__type + isnormal(_Tp __x) + { return __x != 0 ? true : false; } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + // Note: middle-end/36757 is fixed, __builtin_signbit is type-generic. + constexpr bool + signbit(float __x) + { return __builtin_signbit(__x); } + + constexpr bool + signbit(double __x) + { return __builtin_signbit(__x); } + + constexpr bool + signbit(long double __x) + { return __builtin_signbit(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + bool>::__type + signbit(_Tp __x) + { return __x < 0 ? true : false; } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr bool + isgreater(float __x, float __y) + { return __builtin_isgreater(__x, __y); } + + constexpr bool + isgreater(double __x, double __y) + { return __builtin_isgreater(__x, __y); } + + constexpr bool + isgreater(long double __x, long double __y) + { return __builtin_isgreater(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp, typename _Up> + constexpr typename + __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value + && __is_arithmetic<_Up>::__value), bool>::__type + isgreater(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return __builtin_isgreater(__type(__x), __type(__y)); + } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr bool + isgreaterequal(float __x, float __y) + { return __builtin_isgreaterequal(__x, __y); } + + constexpr bool + isgreaterequal(double __x, double __y) + { return __builtin_isgreaterequal(__x, __y); } + + constexpr bool + isgreaterequal(long double __x, long double __y) + { return __builtin_isgreaterequal(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp, typename _Up> + constexpr typename + __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value + && __is_arithmetic<_Up>::__value), bool>::__type + isgreaterequal(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return __builtin_isgreaterequal(__type(__x), __type(__y)); + } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr bool + isless(float __x, float __y) + { return __builtin_isless(__x, __y); } + + constexpr bool + isless(double __x, double __y) + { return __builtin_isless(__x, __y); } + + constexpr bool + isless(long double __x, long double __y) + { return __builtin_isless(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp, typename _Up> + constexpr typename + __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value + && __is_arithmetic<_Up>::__value), bool>::__type + isless(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return __builtin_isless(__type(__x), __type(__y)); + } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr bool + islessequal(float __x, float __y) + { return __builtin_islessequal(__x, __y); } + + constexpr bool + islessequal(double __x, double __y) + { return __builtin_islessequal(__x, __y); } + + constexpr bool + islessequal(long double __x, long double __y) + { return __builtin_islessequal(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp, typename _Up> + constexpr typename + __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value + && __is_arithmetic<_Up>::__value), bool>::__type + islessequal(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return __builtin_islessequal(__type(__x), __type(__y)); + } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr bool + islessgreater(float __x, float __y) + { return __builtin_islessgreater(__x, __y); } + + constexpr bool + islessgreater(double __x, double __y) + { return __builtin_islessgreater(__x, __y); } + + constexpr bool + islessgreater(long double __x, long double __y) + { return __builtin_islessgreater(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp, typename _Up> + constexpr typename + __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value + && __is_arithmetic<_Up>::__value), bool>::__type + islessgreater(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return __builtin_islessgreater(__type(__x), __type(__y)); + } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr bool + isunordered(float __x, float __y) + { return __builtin_isunordered(__x, __y); } + + constexpr bool + isunordered(double __x, double __y) + { return __builtin_isunordered(__x, __y); } + + constexpr bool + isunordered(long double __x, long double __y) + { return __builtin_isunordered(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp, typename _Up> + constexpr typename + __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value + && __is_arithmetic<_Up>::__value), bool>::__type + isunordered(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return __builtin_isunordered(__type(__x), __type(__y)); + } +#endif + +#else + + template<typename _Tp> + inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, + int>::__type + fpclassify(_Tp __f) + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, + FP_SUBNORMAL, FP_ZERO, __type(__f)); + } + + template<typename _Tp> + inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, + int>::__type + isfinite(_Tp __f) + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return __builtin_isfinite(__type(__f)); + } + + template<typename _Tp> + inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, + int>::__type + isinf(_Tp __f) + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return __builtin_isinf(__type(__f)); + } + + template<typename _Tp> + inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, + int>::__type + isnan(_Tp __f) + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return __builtin_isnan(__type(__f)); + } + + template<typename _Tp> + inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, + int>::__type + isnormal(_Tp __f) + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return __builtin_isnormal(__type(__f)); + } + + template<typename _Tp> + inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, + int>::__type + signbit(_Tp __f) + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return __builtin_signbit(__type(__f)); + } + + template<typename _Tp> + inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, + int>::__type + isgreater(_Tp __f1, _Tp __f2) + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return __builtin_isgreater(__type(__f1), __type(__f2)); + } + + template<typename _Tp> + inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, + int>::__type + isgreaterequal(_Tp __f1, _Tp __f2) + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return __builtin_isgreaterequal(__type(__f1), __type(__f2)); + } + + template<typename _Tp> + inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, + int>::__type + isless(_Tp __f1, _Tp __f2) + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return __builtin_isless(__type(__f1), __type(__f2)); + } + + template<typename _Tp> + inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, + int>::__type + islessequal(_Tp __f1, _Tp __f2) + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return __builtin_islessequal(__type(__f1), __type(__f2)); + } + + template<typename _Tp> + inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, + int>::__type + islessgreater(_Tp __f1, _Tp __f2) + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return __builtin_islessgreater(__type(__f1), __type(__f2)); + } + + template<typename _Tp> + inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, + int>::__type + isunordered(_Tp __f1, _Tp __f2) + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return __builtin_isunordered(__type(__f1), __type(__f2)); + } + +#endif // C++11 + +#ifdef __STDCPP_FLOAT16_T__ + constexpr int + fpclassify(_Float16 __x) + { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, + FP_SUBNORMAL, FP_ZERO, __x); } + + constexpr bool + isfinite(_Float16 __x) + { return __builtin_isfinite(__x); } + + constexpr bool + isinf(_Float16 __x) + { return __builtin_isinf(__x); } + + constexpr bool + isnan(_Float16 __x) + { return __builtin_isnan(__x); } + + constexpr bool + isnormal(_Float16 __x) + { return __builtin_isnormal(__x); } + + constexpr bool + signbit(_Float16 __x) + { return __builtin_signbit(__x); } + + constexpr bool + isgreater(_Float16 __x, _Float16 __y) + { return __builtin_isgreater(__x, __y); } + + constexpr bool + isgreaterequal(_Float16 __x, _Float16 __y) + { return __builtin_isgreaterequal(__x, __y); } + + constexpr bool + isless(_Float16 __x, _Float16 __y) + { return __builtin_isless(__x, __y); } + + constexpr bool + islessequal(_Float16 __x, _Float16 __y) + { return __builtin_islessequal(__x, __y); } + + constexpr bool + islessgreater(_Float16 __x, _Float16 __y) + { return __builtin_islessgreater(__x, __y); } + + constexpr bool + isunordered(_Float16 __x, _Float16 __y) + { return __builtin_isunordered(__x, __y); } +#endif + +#ifdef __STDCPP_FLOAT32_T__ + constexpr int + fpclassify(_Float32 __x) + { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, + FP_SUBNORMAL, FP_ZERO, __x); } + + constexpr bool + isfinite(_Float32 __x) + { return __builtin_isfinite(__x); } + + constexpr bool + isinf(_Float32 __x) + { return __builtin_isinf(__x); } + + constexpr bool + isnan(_Float32 __x) + { return __builtin_isnan(__x); } + + constexpr bool + isnormal(_Float32 __x) + { return __builtin_isnormal(__x); } + + constexpr bool + signbit(_Float32 __x) + { return __builtin_signbit(__x); } + + constexpr bool + isgreater(_Float32 __x, _Float32 __y) + { return __builtin_isgreater(__x, __y); } + + constexpr bool + isgreaterequal(_Float32 __x, _Float32 __y) + { return __builtin_isgreaterequal(__x, __y); } + + constexpr bool + isless(_Float32 __x, _Float32 __y) + { return __builtin_isless(__x, __y); } + + constexpr bool + islessequal(_Float32 __x, _Float32 __y) + { return __builtin_islessequal(__x, __y); } + + constexpr bool + islessgreater(_Float32 __x, _Float32 __y) + { return __builtin_islessgreater(__x, __y); } + + constexpr bool + isunordered(_Float32 __x, _Float32 __y) + { return __builtin_isunordered(__x, __y); } +#endif + +#ifdef __STDCPP_FLOAT64_T__ + constexpr int + fpclassify(_Float64 __x) + { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, + FP_SUBNORMAL, FP_ZERO, __x); } + + constexpr bool + isfinite(_Float64 __x) + { return __builtin_isfinite(__x); } + + constexpr bool + isinf(_Float64 __x) + { return __builtin_isinf(__x); } + + constexpr bool + isnan(_Float64 __x) + { return __builtin_isnan(__x); } + + constexpr bool + isnormal(_Float64 __x) + { return __builtin_isnormal(__x); } + + constexpr bool + signbit(_Float64 __x) + { return __builtin_signbit(__x); } + + constexpr bool + isgreater(_Float64 __x, _Float64 __y) + { return __builtin_isgreater(__x, __y); } + + constexpr bool + isgreaterequal(_Float64 __x, _Float64 __y) + { return __builtin_isgreaterequal(__x, __y); } + + constexpr bool + isless(_Float64 __x, _Float64 __y) + { return __builtin_isless(__x, __y); } + + constexpr bool + islessequal(_Float64 __x, _Float64 __y) + { return __builtin_islessequal(__x, __y); } + + constexpr bool + islessgreater(_Float64 __x, _Float64 __y) + { return __builtin_islessgreater(__x, __y); } + + constexpr bool + isunordered(_Float64 __x, _Float64 __y) + { return __builtin_isunordered(__x, __y); } +#endif + +#ifdef __STDCPP_FLOAT128_T__ + constexpr int + fpclassify(_Float128 __x) + { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, + FP_SUBNORMAL, FP_ZERO, __x); } + + constexpr bool + isfinite(_Float128 __x) + { return __builtin_isfinite(__x); } + + constexpr bool + isinf(_Float128 __x) + { return __builtin_isinf(__x); } + + constexpr bool + isnan(_Float128 __x) + { return __builtin_isnan(__x); } + + constexpr bool + isnormal(_Float128 __x) + { return __builtin_isnormal(__x); } + + constexpr bool + signbit(_Float128 __x) + { return __builtin_signbit(__x); } + + constexpr bool + isgreater(_Float128 __x, _Float128 __y) + { return __builtin_isgreater(__x, __y); } + + constexpr bool + isgreaterequal(_Float128 __x, _Float128 __y) + { return __builtin_isgreaterequal(__x, __y); } + + constexpr bool + isless(_Float128 __x, _Float128 __y) + { return __builtin_isless(__x, __y); } + + constexpr bool + islessequal(_Float128 __x, _Float128 __y) + { return __builtin_islessequal(__x, __y); } + + constexpr bool + islessgreater(_Float128 __x, _Float128 __y) + { return __builtin_islessgreater(__x, __y); } + + constexpr bool + isunordered(_Float128 __x, _Float128 __y) + { return __builtin_isunordered(__x, __y); } +#endif + +#ifdef __STDCPP_BFLOAT16_T__ + constexpr int + fpclassify(__gnu_cxx::__bfloat16_t __x) + { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, + FP_SUBNORMAL, FP_ZERO, __x); } + + constexpr bool + isfinite(__gnu_cxx::__bfloat16_t __x) + { return __builtin_isfinite(__x); } + + constexpr bool + isinf(__gnu_cxx::__bfloat16_t __x) + { return __builtin_isinf(__x); } + + constexpr bool + isnan(__gnu_cxx::__bfloat16_t __x) + { return __builtin_isnan(__x); } + + constexpr bool + isnormal(__gnu_cxx::__bfloat16_t __x) + { return __builtin_isnormal(__x); } + + constexpr bool + signbit(__gnu_cxx::__bfloat16_t __x) + { return __builtin_signbit(__x); } + + constexpr bool + isgreater(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __builtin_isgreater(__x, __y); } + + constexpr bool + isgreaterequal(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __builtin_isgreaterequal(__x, __y); } + + constexpr bool + isless(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __builtin_isless(__x, __y); } + + constexpr bool + islessequal(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __builtin_islessequal(__x, __y); } + + constexpr bool + islessgreater(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __builtin_islessgreater(__x, __y); } + + constexpr bool + isunordered(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __builtin_isunordered(__x, __y); } +#endif + +#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */ +#endif /* _GLIBCXX_USE_C99_MATH */ + +#if __cplusplus >= 201103L + +#ifdef _GLIBCXX_USE_C99_MATH_TR1 + +#undef acosh +#undef acoshf +#undef acoshl +#undef asinh +#undef asinhf +#undef asinhl +#undef atanh +#undef atanhf +#undef atanhl +#undef cbrt +#undef cbrtf +#undef cbrtl +#undef copysign +#undef copysignf +#undef copysignl +#undef erf +#undef erff +#undef erfl +#undef erfc +#undef erfcf +#undef erfcl +#undef exp2 +#undef exp2f +#undef exp2l +#undef expm1 +#undef expm1f +#undef expm1l +#undef fdim +#undef fdimf +#undef fdiml +#undef fma +#undef fmaf +#undef fmal +#undef fmax +#undef fmaxf +#undef fmaxl +#undef fmin +#undef fminf +#undef fminl +#undef hypot +#undef hypotf +#undef hypotl +#undef ilogb +#undef ilogbf +#undef ilogbl +#undef lgamma +#undef lgammaf +#undef lgammal +#ifndef _GLIBCXX_NO_C99_ROUNDING_FUNCS +#undef llrint +#undef llrintf +#undef llrintl +#undef llround +#undef llroundf +#undef llroundl +#endif +#undef log1p +#undef log1pf +#undef log1pl +#undef log2 +#undef log2f +#undef log2l +#undef logb +#undef logbf +#undef logbl +#undef lrint +#undef lrintf +#undef lrintl +#undef lround +#undef lroundf +#undef lroundl +#undef nan +#undef nanf +#undef nanl +#undef nearbyint +#undef nearbyintf +#undef nearbyintl +#undef nextafter +#undef nextafterf +#undef nextafterl +#undef nexttoward +#undef nexttowardf +#undef nexttowardl +#undef remainder +#undef remainderf +#undef remainderl +#undef remquo +#undef remquof +#undef remquol +#undef rint +#undef rintf +#undef rintl +#undef round +#undef roundf +#undef roundl +#undef scalbln +#undef scalblnf +#undef scalblnl +#undef scalbn +#undef scalbnf +#undef scalbnl +#undef tgamma +#undef tgammaf +#undef tgammal +#undef trunc +#undef truncf +#undef truncl + + // types + using ::double_t; + using ::float_t; + + // functions + using ::acosh; + using ::acoshf; + using ::acoshl; + + using ::asinh; + using ::asinhf; + using ::asinhl; + + using ::atanh; + using ::atanhf; + using ::atanhl; + + using ::cbrt; + using ::cbrtf; + using ::cbrtl; + + using ::copysign; + using ::copysignf; + using ::copysignl; + + using ::erf; + using ::erff; + using ::erfl; + + using ::erfc; + using ::erfcf; + using ::erfcl; + + using ::exp2; + using ::exp2f; + using ::exp2l; + + using ::expm1; + using ::expm1f; + using ::expm1l; + + using ::fdim; + using ::fdimf; + using ::fdiml; + + using ::fma; + using ::fmaf; + using ::fmal; + + using ::fmax; + using ::fmaxf; + using ::fmaxl; + + using ::fmin; + using ::fminf; + using ::fminl; + + using ::hypot; + using ::hypotf; + using ::hypotl; + + using ::ilogb; + using ::ilogbf; + using ::ilogbl; + + using ::lgamma; + using ::lgammaf; + using ::lgammal; + +#ifndef _GLIBCXX_NO_C99_ROUNDING_FUNCS + using ::llrint; + using ::llrintf; + using ::llrintl; + + using ::llround; + using ::llroundf; + using ::llroundl; +#endif + + using ::log1p; + using ::log1pf; + using ::log1pl; + + using ::log2; + using ::log2f; + using ::log2l; + + using ::logb; + using ::logbf; + using ::logbl; + + using ::lrint; + using ::lrintf; + using ::lrintl; + + using ::lround; + using ::lroundf; + using ::lroundl; + + using ::nan; + using ::nanf; + using ::nanl; + + using ::nearbyint; + using ::nearbyintf; + using ::nearbyintl; + + using ::nextafter; + using ::nextafterf; + using ::nextafterl; + + using ::nexttoward; + using ::nexttowardf; + using ::nexttowardl; + + using ::remainder; + using ::remainderf; + using ::remainderl; + + using ::remquo; + using ::remquof; + using ::remquol; + + using ::rint; + using ::rintf; + using ::rintl; + + using ::round; + using ::roundf; + using ::roundl; + + using ::scalbln; + using ::scalblnf; + using ::scalblnl; + + using ::scalbn; + using ::scalbnf; + using ::scalbnl; + + using ::tgamma; + using ::tgammaf; + using ::tgammal; + + using ::trunc; + using ::truncf; + using ::truncl; + + /// Additional overloads. +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + acosh(float __x) + { return __builtin_acoshf(__x); } + + constexpr long double + acosh(long double __x) + { return __builtin_acoshl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + acosh(_Tp __x) + { return __builtin_acosh(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + asinh(float __x) + { return __builtin_asinhf(__x); } + + constexpr long double + asinh(long double __x) + { return __builtin_asinhl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + asinh(_Tp __x) + { return __builtin_asinh(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + atanh(float __x) + { return __builtin_atanhf(__x); } + + constexpr long double + atanh(long double __x) + { return __builtin_atanhl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + atanh(_Tp __x) + { return __builtin_atanh(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + cbrt(float __x) + { return __builtin_cbrtf(__x); } + + constexpr long double + cbrt(long double __x) + { return __builtin_cbrtl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + cbrt(_Tp __x) + { return __builtin_cbrt(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + copysign(float __x, float __y) + { return __builtin_copysignf(__x, __y); } + + constexpr long double + copysign(long double __x, long double __y) + { return __builtin_copysignl(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + erf(float __x) + { return __builtin_erff(__x); } + + constexpr long double + erf(long double __x) + { return __builtin_erfl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + erf(_Tp __x) + { return __builtin_erf(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + erfc(float __x) + { return __builtin_erfcf(__x); } + + constexpr long double + erfc(long double __x) + { return __builtin_erfcl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + erfc(_Tp __x) + { return __builtin_erfc(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + exp2(float __x) + { return __builtin_exp2f(__x); } + + constexpr long double + exp2(long double __x) + { return __builtin_exp2l(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + exp2(_Tp __x) + { return __builtin_exp2(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + expm1(float __x) + { return __builtin_expm1f(__x); } + + constexpr long double + expm1(long double __x) + { return __builtin_expm1l(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + expm1(_Tp __x) + { return __builtin_expm1(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + fdim(float __x, float __y) + { return __builtin_fdimf(__x, __y); } + + constexpr long double + fdim(long double __x, long double __y) + { return __builtin_fdiml(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + fma(float __x, float __y, float __z) + { return __builtin_fmaf(__x, __y, __z); } + + constexpr long double + fma(long double __x, long double __y, long double __z) + { return __builtin_fmal(__x, __y, __z); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + fmax(float __x, float __y) + { return __builtin_fmaxf(__x, __y); } + + constexpr long double + fmax(long double __x, long double __y) + { return __builtin_fmaxl(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + fmin(float __x, float __y) + { return __builtin_fminf(__x, __y); } + + constexpr long double + fmin(long double __x, long double __y) + { return __builtin_fminl(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + hypot(float __x, float __y) + { return __builtin_hypotf(__x, __y); } + + constexpr long double + hypot(long double __x, long double __y) + { return __builtin_hypotl(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr int + ilogb(float __x) + { return __builtin_ilogbf(__x); } + + constexpr int + ilogb(long double __x) + { return __builtin_ilogbl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + int>::__type + ilogb(_Tp __x) + { return __builtin_ilogb(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + lgamma(float __x) + { return __builtin_lgammaf(__x); } + + constexpr long double + lgamma(long double __x) + { return __builtin_lgammal(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + lgamma(_Tp __x) + { return __builtin_lgamma(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr long long + llrint(float __x) + { return __builtin_llrintf(__x); } + + constexpr long long + llrint(long double __x) + { return __builtin_llrintl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + long long>::__type + llrint(_Tp __x) + { return __builtin_llrint(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr long long + llround(float __x) + { return __builtin_llroundf(__x); } + + constexpr long long + llround(long double __x) + { return __builtin_llroundl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + long long>::__type + llround(_Tp __x) + { return __builtin_llround(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + log1p(float __x) + { return __builtin_log1pf(__x); } + + constexpr long double + log1p(long double __x) + { return __builtin_log1pl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + log1p(_Tp __x) + { return __builtin_log1p(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + // DR 568. + constexpr float + log2(float __x) + { return __builtin_log2f(__x); } + + constexpr long double + log2(long double __x) + { return __builtin_log2l(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + log2(_Tp __x) + { return __builtin_log2(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + logb(float __x) + { return __builtin_logbf(__x); } + + constexpr long double + logb(long double __x) + { return __builtin_logbl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + logb(_Tp __x) + { return __builtin_logb(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr long + lrint(float __x) + { return __builtin_lrintf(__x); } + + constexpr long + lrint(long double __x) + { return __builtin_lrintl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + long>::__type + lrint(_Tp __x) + { return __builtin_lrint(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr long + lround(float __x) + { return __builtin_lroundf(__x); } + + constexpr long + lround(long double __x) + { return __builtin_lroundl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + long>::__type + lround(_Tp __x) + { return __builtin_lround(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + nearbyint(float __x) + { return __builtin_nearbyintf(__x); } + + constexpr long double + nearbyint(long double __x) + { return __builtin_nearbyintl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + nearbyint(_Tp __x) + { return __builtin_nearbyint(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + nextafter(float __x, float __y) + { return __builtin_nextafterf(__x, __y); } + + constexpr long double + nextafter(long double __x, long double __y) + { return __builtin_nextafterl(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + nexttoward(float __x, long double __y) + { return __builtin_nexttowardf(__x, __y); } + + constexpr long double + nexttoward(long double __x, long double __y) + { return __builtin_nexttowardl(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + nexttoward(_Tp __x, long double __y) + { return __builtin_nexttoward(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + remainder(float __x, float __y) + { return __builtin_remainderf(__x, __y); } + + constexpr long double + remainder(long double __x, long double __y) + { return __builtin_remainderl(__x, __y); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + inline float + remquo(float __x, float __y, int* __pquo) + { return __builtin_remquof(__x, __y, __pquo); } + + inline long double + remquo(long double __x, long double __y, int* __pquo) + { return __builtin_remquol(__x, __y, __pquo); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + rint(float __x) + { return __builtin_rintf(__x); } + + constexpr long double + rint(long double __x) + { return __builtin_rintl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + rint(_Tp __x) + { return __builtin_rint(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + round(float __x) + { return __builtin_roundf(__x); } + + constexpr long double + round(long double __x) + { return __builtin_roundl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + round(_Tp __x) + { return __builtin_round(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + scalbln(float __x, long __ex) + { return __builtin_scalblnf(__x, __ex); } + + constexpr long double + scalbln(long double __x, long __ex) + { return __builtin_scalblnl(__x, __ex); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + scalbln(_Tp __x, long __ex) + { return __builtin_scalbln(__x, __ex); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + scalbn(float __x, int __ex) + { return __builtin_scalbnf(__x, __ex); } + + constexpr long double + scalbn(long double __x, int __ex) + { return __builtin_scalbnl(__x, __ex); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + scalbn(_Tp __x, int __ex) + { return __builtin_scalbn(__x, __ex); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + tgamma(float __x) + { return __builtin_tgammaf(__x); } + + constexpr long double + tgamma(long double __x) + { return __builtin_tgammal(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + tgamma(_Tp __x) + { return __builtin_tgamma(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP + constexpr float + trunc(float __x) + { return __builtin_truncf(__x); } + + constexpr long double + trunc(long double __x) + { return __builtin_truncl(__x); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp> + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + trunc(_Tp __x) + { return __builtin_trunc(__x); } +#endif + +#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) + constexpr _Float16 + acosh(_Float16 __x) + { return _Float16(__builtin_acoshf(__x)); } + + constexpr _Float16 + asinh(_Float16 __x) + { return _Float16(__builtin_asinhf(__x)); } + + constexpr _Float16 + atanh(_Float16 __x) + { return _Float16(__builtin_atanhf(__x)); } + + constexpr _Float16 + cbrt(_Float16 __x) + { return _Float16(__builtin_cbrtf(__x)); } + + constexpr _Float16 + copysign(_Float16 __x, _Float16 __y) + { return __builtin_copysignf16(__x, __y); } + + constexpr _Float16 + erf(_Float16 __x) + { return _Float16(__builtin_erff(__x)); } + + constexpr _Float16 + erfc(_Float16 __x) + { return _Float16(__builtin_erfcf(__x)); } + + constexpr _Float16 + exp2(_Float16 __x) + { return _Float16(__builtin_exp2f(__x)); } + + constexpr _Float16 + expm1(_Float16 __x) + { return _Float16(__builtin_expm1f(__x)); } + + constexpr _Float16 + fdim(_Float16 __x, _Float16 __y) + { return _Float16(__builtin_fdimf(__x, __y)); } + + constexpr _Float16 + fma(_Float16 __x, _Float16 __y, _Float16 __z) + { return _Float16(__builtin_fmaf(__x, __y, __z)); } + + constexpr _Float16 + fmax(_Float16 __x, _Float16 __y) + { return _Float16(__builtin_fmaxf(__x, __y)); } + + constexpr _Float16 + fmin(_Float16 __x, _Float16 __y) + { return _Float16(__builtin_fminf(__x, __y)); } + + constexpr _Float16 + hypot(_Float16 __x, _Float16 __y) + { return _Float16(__builtin_hypotf(__x, __y)); } + + constexpr int + ilogb(_Float16 __x) + { return _Float16(__builtin_ilogbf(__x)); } + + constexpr _Float16 + lgamma(_Float16 __x) + { return _Float16(__builtin_lgammaf(__x)); } + + constexpr long long + llrint(_Float16 __x) + { return _Float16(__builtin_llrintf(__x)); } + + constexpr long long + llround(_Float16 __x) + { return _Float16(__builtin_llroundf(__x)); } + + constexpr _Float16 + log1p(_Float16 __x) + { return _Float16(__builtin_log1pf(__x)); } + + // DR 568. + constexpr _Float16 + log2(_Float16 __x) + { return _Float16(__builtin_log2f(__x)); } + + constexpr _Float16 + logb(_Float16 __x) + { return _Float16(__builtin_logbf(__x)); } + + constexpr long + lrint(_Float16 __x) + { return _Float16(__builtin_lrintf(__x)); } + + constexpr long + lround(_Float16 __x) + { return _Float16(__builtin_lroundf(__x)); } + + constexpr _Float16 + nearbyint(_Float16 __x) + { return _Float16(__builtin_nearbyintf(__x)); } + + constexpr _Float16 + nextafter(_Float16 __x, _Float16 __y) + { + if (std::__is_constant_evaluated()) + return __builtin_nextafterf16(__x, __y); +#ifdef __INT16_TYPE__ + using __float16_int_type = __INT16_TYPE__; +#else + using __float16_int_type = short int; +#endif + __float16_int_type __hx, __hy, __ix, __iy; + __builtin_memcpy(&__hx, &__x, sizeof(__x)); + __builtin_memcpy(&__hy, &__y, sizeof(__x)); + __ix = __hx & 0x7fff; // |x| + __iy = __hy & 0x7fff; // |y| + if (__ix > 0x7c00 || __iy > 0x7c00) // x or y is NaN + return __x + __y; + if (__x == __y) + return __y; // x == y, return y + if (__ix == 0) // x == 0 + { + __hy = (__hy & 0x8000) | 1; // return +-__FLT16_DENORM_MIN__ + __builtin_memcpy(&__x, &__hy, sizeof(__x)); + __builtin_nextafterf(0.0f, 1.0f); // raise underflow + return __x; + } + if (__hx >= 0) // x > 0 + { + if (__hx > __hy) // x > y, x -= ulp + --__hx; + else // x < y, x += ulp + ++__hx; + } + else // x < 0 + { + if (__hy >= 0 || __hx > __hy) // x < y, x -= ulp + --__hx; + else // x > y, x += ulp + ++__hx; + } + __hy = __hx & 0x7c00; + if (__hy >= 0x7c00) + __builtin_nextafterf(__FLT_MAX__, __builtin_inff()); // overflow + else if (__hy < 0x0400) + __builtin_nextafterf(__FLT_MIN__, 0.0f); // underflow + __builtin_memcpy(&__x, &__hx, sizeof(__x)); + return __x; + } + + constexpr _Float16 + remainder(_Float16 __x, _Float16 __y) + { return _Float16(__builtin_remainderf(__x, __y)); } + + inline _Float16 + remquo(_Float16 __x, _Float16 __y, int* __pquo) + { return _Float16(__builtin_remquof(__x, __y, __pquo)); } + + constexpr _Float16 + rint(_Float16 __x) + { return _Float16(__builtin_rintf(__x)); } + + constexpr _Float16 + round(_Float16 __x) + { return _Float16(__builtin_roundf(__x)); } + + constexpr _Float16 + scalbln(_Float16 __x, long __ex) + { return _Float16(__builtin_scalblnf(__x, __ex)); } + + constexpr _Float16 + scalbn(_Float16 __x, int __ex) + { return _Float16(__builtin_scalbnf(__x, __ex)); } + + constexpr _Float16 + tgamma(_Float16 __x) + { return _Float16(__builtin_tgammaf(__x)); } + + constexpr _Float16 + trunc(_Float16 __x) + { return _Float16(__builtin_truncf(__x)); } +#endif + +#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) + constexpr _Float32 + acosh(_Float32 __x) + { return __builtin_acoshf(__x); } + + constexpr _Float32 + asinh(_Float32 __x) + { return __builtin_asinhf(__x); } + + constexpr _Float32 + atanh(_Float32 __x) + { return __builtin_atanhf(__x); } + + constexpr _Float32 + cbrt(_Float32 __x) + { return __builtin_cbrtf(__x); } + + constexpr _Float32 + copysign(_Float32 __x, _Float32 __y) + { return __builtin_copysignf(__x, __y); } + + constexpr _Float32 + erf(_Float32 __x) + { return __builtin_erff(__x); } + + constexpr _Float32 + erfc(_Float32 __x) + { return __builtin_erfcf(__x); } + + constexpr _Float32 + exp2(_Float32 __x) + { return __builtin_exp2f(__x); } + + constexpr _Float32 + expm1(_Float32 __x) + { return __builtin_expm1f(__x); } + + constexpr _Float32 + fdim(_Float32 __x, _Float32 __y) + { return __builtin_fdimf(__x, __y); } + + constexpr _Float32 + fma(_Float32 __x, _Float32 __y, _Float32 __z) + { return __builtin_fmaf(__x, __y, __z); } + + constexpr _Float32 + fmax(_Float32 __x, _Float32 __y) + { return __builtin_fmaxf(__x, __y); } + + constexpr _Float32 + fmin(_Float32 __x, _Float32 __y) + { return __builtin_fminf(__x, __y); } + + constexpr _Float32 + hypot(_Float32 __x, _Float32 __y) + { return __builtin_hypotf(__x, __y); } + + constexpr int + ilogb(_Float32 __x) + { return __builtin_ilogbf(__x); } + + constexpr _Float32 + lgamma(_Float32 __x) + { return __builtin_lgammaf(__x); } + + constexpr long long + llrint(_Float32 __x) + { return __builtin_llrintf(__x); } + + constexpr long long + llround(_Float32 __x) + { return __builtin_llroundf(__x); } + + constexpr _Float32 + log1p(_Float32 __x) + { return __builtin_log1pf(__x); } + + // DR 568. + constexpr _Float32 + log2(_Float32 __x) + { return __builtin_log2f(__x); } + + constexpr _Float32 + logb(_Float32 __x) + { return __builtin_logbf(__x); } + + constexpr long + lrint(_Float32 __x) + { return __builtin_lrintf(__x); } + + constexpr long + lround(_Float32 __x) + { return __builtin_lroundf(__x); } + + constexpr _Float32 + nearbyint(_Float32 __x) + { return __builtin_nearbyintf(__x); } + + constexpr _Float32 + nextafter(_Float32 __x, _Float32 __y) + { return __builtin_nextafterf(__x, __y); } + + constexpr _Float32 + remainder(_Float32 __x, _Float32 __y) + { return __builtin_remainderf(__x, __y); } + + inline _Float32 + remquo(_Float32 __x, _Float32 __y, int* __pquo) + { return __builtin_remquof(__x, __y, __pquo); } + + constexpr _Float32 + rint(_Float32 __x) + { return __builtin_rintf(__x); } + + constexpr _Float32 + round(_Float32 __x) + { return __builtin_roundf(__x); } + + constexpr _Float32 + scalbln(_Float32 __x, long __ex) + { return __builtin_scalblnf(__x, __ex); } + + constexpr _Float32 + scalbn(_Float32 __x, int __ex) + { return __builtin_scalbnf(__x, __ex); } + + constexpr _Float32 + tgamma(_Float32 __x) + { return __builtin_tgammaf(__x); } + + constexpr _Float32 + trunc(_Float32 __x) + { return __builtin_truncf(__x); } +#endif + +#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64) + constexpr _Float64 + acosh(_Float64 __x) + { return __builtin_acosh(__x); } + + constexpr _Float64 + asinh(_Float64 __x) + { return __builtin_asinh(__x); } + + constexpr _Float64 + atanh(_Float64 __x) + { return __builtin_atanh(__x); } + + constexpr _Float64 + cbrt(_Float64 __x) + { return __builtin_cbrt(__x); } + + constexpr _Float64 + copysign(_Float64 __x, _Float64 __y) + { return __builtin_copysign(__x, __y); } + + constexpr _Float64 + erf(_Float64 __x) + { return __builtin_erf(__x); } + + constexpr _Float64 + erfc(_Float64 __x) + { return __builtin_erfc(__x); } + + constexpr _Float64 + exp2(_Float64 __x) + { return __builtin_exp2(__x); } + + constexpr _Float64 + expm1(_Float64 __x) + { return __builtin_expm1(__x); } + + constexpr _Float64 + fdim(_Float64 __x, _Float64 __y) + { return __builtin_fdim(__x, __y); } + + constexpr _Float64 + fma(_Float64 __x, _Float64 __y, _Float64 __z) + { return __builtin_fma(__x, __y, __z); } + + constexpr _Float64 + fmax(_Float64 __x, _Float64 __y) + { return __builtin_fmax(__x, __y); } + + constexpr _Float64 + fmin(_Float64 __x, _Float64 __y) + { return __builtin_fmin(__x, __y); } + + constexpr _Float64 + hypot(_Float64 __x, _Float64 __y) + { return __builtin_hypot(__x, __y); } + + constexpr int + ilogb(_Float64 __x) + { return __builtin_ilogb(__x); } + + constexpr _Float64 + lgamma(_Float64 __x) + { return __builtin_lgamma(__x); } + + constexpr long long + llrint(_Float64 __x) + { return __builtin_llrint(__x); } + + constexpr long long + llround(_Float64 __x) + { return __builtin_llround(__x); } + + constexpr _Float64 + log1p(_Float64 __x) + { return __builtin_log1p(__x); } + + // DR 568. + constexpr _Float64 + log2(_Float64 __x) + { return __builtin_log2(__x); } + + constexpr _Float64 + logb(_Float64 __x) + { return __builtin_logb(__x); } + + constexpr long + lrint(_Float64 __x) + { return __builtin_lrint(__x); } + + constexpr long + lround(_Float64 __x) + { return __builtin_lround(__x); } + + constexpr _Float64 + nearbyint(_Float64 __x) + { return __builtin_nearbyint(__x); } + + constexpr _Float64 + nextafter(_Float64 __x, _Float64 __y) + { return __builtin_nextafter(__x, __y); } + + constexpr _Float64 + remainder(_Float64 __x, _Float64 __y) + { return __builtin_remainder(__x, __y); } + + inline _Float64 + remquo(_Float64 __x, _Float64 __y, int* __pquo) + { return __builtin_remquo(__x, __y, __pquo); } + + constexpr _Float64 + rint(_Float64 __x) + { return __builtin_rint(__x); } + + constexpr _Float64 + round(_Float64 __x) + { return __builtin_round(__x); } + + constexpr _Float64 + scalbln(_Float64 __x, long __ex) + { return __builtin_scalbln(__x, __ex); } + + constexpr _Float64 + scalbn(_Float64 __x, int __ex) + { return __builtin_scalbn(__x, __ex); } + + constexpr _Float64 + tgamma(_Float64 __x) + { return __builtin_tgamma(__x); } + + constexpr _Float64 + trunc(_Float64 __x) + { return __builtin_trunc(__x); } +#endif + +#if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128) + constexpr _Float128 + acosh(_Float128 __x) + { return __builtin_acoshl(__x); } + + constexpr _Float128 + asinh(_Float128 __x) + { return __builtin_asinhl(__x); } + + constexpr _Float128 + atanh(_Float128 __x) + { return __builtin_atanhl(__x); } + + constexpr _Float128 + cbrt(_Float128 __x) + { return __builtin_cbrtl(__x); } + + constexpr _Float128 + copysign(_Float128 __x, _Float128 __y) + { return __builtin_copysignl(__x, __y); } + + constexpr _Float128 + erf(_Float128 __x) + { return __builtin_erfl(__x); } + + constexpr _Float128 + erfc(_Float128 __x) + { return __builtin_erfcl(__x); } + + constexpr _Float128 + exp2(_Float128 __x) + { return __builtin_exp2l(__x); } + + constexpr _Float128 + expm1(_Float128 __x) + { return __builtin_expm1l(__x); } + + constexpr _Float128 + fdim(_Float128 __x, _Float128 __y) + { return __builtin_fdiml(__x, __y); } + + constexpr _Float128 + fma(_Float128 __x, _Float128 __y, _Float128 __z) + { return __builtin_fmal(__x, __y, __z); } + + constexpr _Float128 + fmax(_Float128 __x, _Float128 __y) + { return __builtin_fmaxl(__x, __y); } + + constexpr _Float128 + fmin(_Float128 __x, _Float128 __y) + { return __builtin_fminl(__x, __y); } + + constexpr _Float128 + hypot(_Float128 __x, _Float128 __y) + { return __builtin_hypotl(__x, __y); } + + constexpr int + ilogb(_Float128 __x) + { return __builtin_ilogbl(__x); } + + constexpr _Float128 + lgamma(_Float128 __x) + { return __builtin_lgammal(__x); } + + constexpr long long + llrint(_Float128 __x) + { return __builtin_llrintl(__x); } + + constexpr long long + llround(_Float128 __x) + { return __builtin_llroundl(__x); } + + constexpr _Float128 + log1p(_Float128 __x) + { return __builtin_log1pl(__x); } + + // DR 568. + constexpr _Float128 + log2(_Float128 __x) + { return __builtin_log2l(__x); } + + constexpr _Float128 + logb(_Float128 __x) + { return __builtin_logbl(__x); } + + constexpr long + lrint(_Float128 __x) + { return __builtin_lrintl(__x); } + + constexpr long + lround(_Float128 __x) + { return __builtin_lroundl(__x); } + + constexpr _Float128 + nearbyint(_Float128 __x) + { return __builtin_nearbyintl(__x); } + + constexpr _Float128 + nextafter(_Float128 __x, _Float128 __y) + { return __builtin_nextafterl(__x, __y); } + + constexpr _Float128 + remainder(_Float128 __x, _Float128 __y) + { return __builtin_remainderl(__x, __y); } + + inline _Float128 + remquo(_Float128 __x, _Float128 __y, int* __pquo) + { return __builtin_remquol(__x, __y, __pquo); } + + constexpr _Float128 + rint(_Float128 __x) + { return __builtin_rintl(__x); } + + constexpr _Float128 + round(_Float128 __x) + { return __builtin_roundl(__x); } + + constexpr _Float128 + scalbln(_Float128 __x, long __ex) + { return __builtin_scalblnl(__x, __ex); } + + constexpr _Float128 + scalbn(_Float128 __x, int __ex) + { return __builtin_scalbnl(__x, __ex); } + + constexpr _Float128 + tgamma(_Float128 __x) + { return __builtin_tgammal(__x); } + + constexpr _Float128 + trunc(_Float128 __x) + { return __builtin_truncl(__x); } +#elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH) + constexpr _Float128 + acosh(_Float128 __x) + { return __builtin_acoshf128(__x); } + + constexpr _Float128 + asinh(_Float128 __x) + { return __builtin_asinhf128(__x); } + + constexpr _Float128 + atanh(_Float128 __x) + { return __builtin_atanhf128(__x); } + + constexpr _Float128 + cbrt(_Float128 __x) + { return __builtin_cbrtf128(__x); } + + constexpr _Float128 + copysign(_Float128 __x, _Float128 __y) + { return __builtin_copysignf128(__x, __y); } + + constexpr _Float128 + erf(_Float128 __x) + { return __builtin_erff128(__x); } + + constexpr _Float128 + erfc(_Float128 __x) + { return __builtin_erfcf128(__x); } + + constexpr _Float128 + exp2(_Float128 __x) + { return __builtin_exp2f128(__x); } + + constexpr _Float128 + expm1(_Float128 __x) + { return __builtin_expm1f128(__x); } + + constexpr _Float128 + fdim(_Float128 __x, _Float128 __y) + { return __builtin_fdimf128(__x, __y); } + + constexpr _Float128 + fma(_Float128 __x, _Float128 __y, _Float128 __z) + { return __builtin_fmaf128(__x, __y, __z); } + + constexpr _Float128 + fmax(_Float128 __x, _Float128 __y) + { return __builtin_fmaxf128(__x, __y); } + + constexpr _Float128 + fmin(_Float128 __x, _Float128 __y) + { return __builtin_fminf128(__x, __y); } + + constexpr _Float128 + hypot(_Float128 __x, _Float128 __y) + { return __builtin_hypotf128(__x, __y); } + + constexpr int + ilogb(_Float128 __x) + { return __builtin_ilogbf128(__x); } + + constexpr _Float128 + lgamma(_Float128 __x) + { return __builtin_lgammaf128(__x); } + + constexpr long long + llrint(_Float128 __x) + { return __builtin_llrintf128(__x); } + + constexpr long long + llround(_Float128 __x) + { return __builtin_llroundf128(__x); } + + constexpr _Float128 + log1p(_Float128 __x) + { return __builtin_log1pf128(__x); } + + // DR 568. + constexpr _Float128 + log2(_Float128 __x) + { return __builtin_log2f128(__x); } + + constexpr _Float128 + logb(_Float128 __x) + { return __builtin_logbf128(__x); } + + constexpr long + lrint(_Float128 __x) + { return __builtin_lrintf128(__x); } + + constexpr long + lround(_Float128 __x) + { return __builtin_lroundf128(__x); } + + constexpr _Float128 + nearbyint(_Float128 __x) + { return __builtin_nearbyintf128(__x); } + + constexpr _Float128 + nextafter(_Float128 __x, _Float128 __y) + { return __builtin_nextafterf128(__x, __y); } + + constexpr _Float128 + remainder(_Float128 __x, _Float128 __y) + { return __builtin_remainderf128(__x, __y); } + + inline _Float128 + remquo(_Float128 __x, _Float128 __y, int* __pquo) + { return __builtin_remquof128(__x, __y, __pquo); } + + constexpr _Float128 + rint(_Float128 __x) + { return __builtin_rintf128(__x); } + + constexpr _Float128 + round(_Float128 __x) + { return __builtin_roundf128(__x); } + + constexpr _Float128 + scalbln(_Float128 __x, long __ex) + { return __builtin_scalblnf128(__x, __ex); } + + constexpr _Float128 + scalbn(_Float128 __x, int __ex) + { return __builtin_scalbnf128(__x, __ex); } + + constexpr _Float128 + tgamma(_Float128 __x) + { return __builtin_tgammaf128(__x); } + + constexpr _Float128 + trunc(_Float128 __x) + { return __builtin_truncf128(__x); } +#endif + +#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) + constexpr __gnu_cxx::__bfloat16_t + acosh(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_acoshf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + asinh(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_asinhf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + atanh(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_atanhf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + cbrt(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_cbrtf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + copysign(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __gnu_cxx::__bfloat16_t(__builtin_copysignf(__x, __y)); } + + constexpr __gnu_cxx::__bfloat16_t + erf(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_erff(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + erfc(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_erfcf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + exp2(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_exp2f(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + expm1(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_expm1f(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + fdim(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __gnu_cxx::__bfloat16_t(__builtin_fdimf(__x, __y)); } + + constexpr __gnu_cxx::__bfloat16_t + fma(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y, __gnu_cxx::__bfloat16_t __z) + { return __gnu_cxx::__bfloat16_t(__builtin_fmaf(__x, __y, __z)); } + + constexpr __gnu_cxx::__bfloat16_t + fmax(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __gnu_cxx::__bfloat16_t(__builtin_fmaxf(__x, __y)); } + + constexpr __gnu_cxx::__bfloat16_t + fmin(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __gnu_cxx::__bfloat16_t(__builtin_fminf(__x, __y)); } + + constexpr __gnu_cxx::__bfloat16_t + hypot(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __gnu_cxx::__bfloat16_t(__builtin_hypotf(__x, __y)); } + + constexpr int + ilogb(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_ilogbf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + lgamma(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_lgammaf(__x)); } + + constexpr long long + llrint(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_llrintf(__x)); } + + constexpr long long + llround(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_llroundf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + log1p(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_log1pf(__x)); } + + // DR 568. + constexpr __gnu_cxx::__bfloat16_t + log2(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_log2f(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + logb(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_logbf(__x)); } + + constexpr long + lrint(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_lrintf(__x)); } + + constexpr long + lround(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_lroundf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + nearbyint(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_nearbyintf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + nextafter(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { + if (std::__is_constant_evaluated()) + return __builtin_nextafterf16b(__x, __y); +#ifdef __INT16_TYPE__ + using __bfloat16_int_type = __INT16_TYPE__; +#else + using __bfloat16_int_type = short int; +#endif + __bfloat16_int_type __hx, __hy, __ix, __iy; + __builtin_memcpy(&__hx, &__x, sizeof(__x)); + __builtin_memcpy(&__hy, &__y, sizeof(__x)); + __ix = __hx & 0x7fff; // |x| + __iy = __hy & 0x7fff; // |y| + if (__ix > 0x7f80 || __iy > 0x7f80) // x or y is NaN + return __x + __y; + if (__x == __y) + return __y; // x == y, return y + if (__ix == 0) // x == 0 + { + __hy = (__hy & 0x8000) | 1; // return +-__BFLT16_DENORM_MIN__ + __builtin_memcpy(&__x, &__hy, sizeof(__x)); + __builtin_nextafterf(0.0f, 1.0f); // raise underflow + return __x; + } + if (__hx >= 0) // x > 0 + { + if (__hx > __hy) // x > y, x -= ulp + --__hx; + else // x < y, x += ulp + ++__hx; + } + else // x < 0 + { + if (__hy >= 0 || __hx > __hy) // x < y, x -= ulp + --__hx; + else // x > y, x += ulp + ++__hx; + } + __hy = __hx & 0x7f80; + if (__hy >= 0x7f80) + __builtin_nextafterf(__FLT_MAX__, __builtin_inff()); // overflow + else if (__hy < 0x0080) + __builtin_nextafterf(__FLT_MIN__, 0.0f); // underflow + __builtin_memcpy(&__x, &__hx, sizeof(__x)); + return __x; + } + + constexpr __gnu_cxx::__bfloat16_t + remainder(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) + { return __gnu_cxx::__bfloat16_t(__builtin_remainderf(__x, __y)); } + + inline __gnu_cxx::__bfloat16_t + remquo(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y, int* __pquo) + { return __gnu_cxx::__bfloat16_t(__builtin_remquof(__x, __y, __pquo)); } + + constexpr __gnu_cxx::__bfloat16_t + rint(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_rintf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + round(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_roundf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + scalbln(__gnu_cxx::__bfloat16_t __x, long __ex) + { return __gnu_cxx::__bfloat16_t(__builtin_scalblnf(__x, __ex)); } + + constexpr __gnu_cxx::__bfloat16_t + scalbn(__gnu_cxx::__bfloat16_t __x, int __ex) + { return __gnu_cxx::__bfloat16_t(__builtin_scalbnf(__x, __ex)); } + + constexpr __gnu_cxx::__bfloat16_t + tgamma(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_tgammaf(__x)); } + + constexpr __gnu_cxx::__bfloat16_t + trunc(__gnu_cxx::__bfloat16_t __x) + { return __gnu_cxx::__bfloat16_t(__builtin_truncf(__x)); } +#endif + +#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT + template<typename _Tp, typename _Up> + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + copysign(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return copysign(__type(__x), __type(__y)); + } + + template<typename _Tp, typename _Up> + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + fdim(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return fdim(__type(__x), __type(__y)); + } + + template<typename _Tp, typename _Up> + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + fmax(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return fmax(__type(__x), __type(__y)); + } + + template<typename _Tp, typename _Up> + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + fmin(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return fmin(__type(__x), __type(__y)); + } + + template<typename _Tp, typename _Up> + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + hypot(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return hypot(__type(__x), __type(__y)); + } + + template<typename _Tp, typename _Up> + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + nextafter(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return nextafter(__type(__x), __type(__y)); + } + + template<typename _Tp, typename _Up> + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + remainder(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return remainder(__type(__x), __type(__y)); + } + + template<typename _Tp, typename _Up> + inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + remquo(_Tp __x, _Up __y, int* __pquo) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return remquo(__type(__x), __type(__y), __pquo); + } + + template<typename _Tp, typename _Up, typename _Vp> + constexpr typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type + fma(_Tp __x, _Up __y, _Vp __z) + { + typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type; + return fma(__type(__x), __type(__y), __type(__z)); + } +#endif + +#endif // _GLIBCXX_USE_C99_MATH_TR1 +#endif // C++11 + +#if __cplusplus >= 201703L + + // [c.math.hypot3], three-dimensional hypotenuse +#define __cpp_lib_hypot 201603L + + template<typename _Tp> + inline _Tp + __hypot3(_Tp __x, _Tp __y, _Tp __z) + { + __x = std::abs(__x); + __y = std::abs(__y); + __z = std::abs(__z); + if (_Tp __a = __x < __y ? __y < __z ? __z : __y : __x < __z ? __z : __x) + return __a * std::sqrt((__x / __a) * (__x / __a) + + (__y / __a) * (__y / __a) + + (__z / __a) * (__z / __a)); + else + return {}; + } + + inline float + hypot(float __x, float __y, float __z) + { return std::__hypot3<float>(__x, __y, __z); } + + inline double + hypot(double __x, double __y, double __z) + { return std::__hypot3<double>(__x, __y, __z); } + + inline long double + hypot(long double __x, long double __y, long double __z) + { return std::__hypot3<long double>(__x, __y, __z); } + + template<typename _Tp, typename _Up, typename _Vp> + __gnu_cxx::__promoted_t<_Tp, _Up, _Vp> + hypot(_Tp __x, _Up __y, _Vp __z) + { + using __type = __gnu_cxx::__promoted_t<_Tp, _Up, _Vp>; + return std::__hypot3<__type>(__x, __y, __z); + } + +#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) + inline _Float16 + hypot(_Float16 __x, _Float16 __y, _Float16 __z) + { return std::__hypot3<_Float16>(__x, __y, __z); } +#endif + +#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) + inline _Float32 + hypot(_Float32 __x, _Float32 __y, _Float32 __z) + { return std::__hypot3<_Float32>(__x, __y, __z); } +#endif + +#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64) + inline _Float64 + hypot(_Float64 __x, _Float64 __y, _Float64 __z) + { return std::__hypot3<_Float64>(__x, __y, __z); } +#endif + +#if defined(__STDCPP_FLOAT128_T__) \ + && (defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128) \ + || defined(_GLIBCXX_HAVE_FLOAT128_MATH)) + inline _Float128 + hypot(_Float128 __x, _Float128 __y, _Float128 __z) + { return std::__hypot3<_Float128>(__x, __y, __z); } +#endif + +#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) + inline __gnu_cxx::__bfloat16_t + hypot(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y, __gnu_cxx::__bfloat16_t __z) + { return std::__hypot3<__gnu_cxx::__bfloat16_t>(__x, __y, __z); } +#endif + +#endif // C++17 + +#if __cplusplus >= 202002L + // linear interpolation +# define __cpp_lib_interpolate 201902L + + template<typename _Fp> + constexpr _Fp + __lerp(_Fp __a, _Fp __b, _Fp __t) noexcept + { + if ((__a <= 0 && __b >= 0) || (__a >= 0 && __b <= 0)) + return __t * __b + (1 - __t) * __a; + + if (__t == 1) + return __b; // exact + + // Exact at __t=0, monotonic except near __t=1, + // bounded, determinate, and consistent: + const _Fp __x = __a + __t * (__b - __a); + return (__t > 1) == (__b > __a) + ? (__b < __x ? __x : __b) + : (__b > __x ? __x : __b); // monotonic near __t=1 + } + + constexpr float + lerp(float __a, float __b, float __t) noexcept + { return std::__lerp(__a, __b, __t); } + + constexpr double + lerp(double __a, double __b, double __t) noexcept + { return std::__lerp(__a, __b, __t); } + + constexpr long double + lerp(long double __a, long double __b, long double __t) noexcept + { return std::__lerp(__a, __b, __t); } + + template<typename _Tp, typename _Up, typename _Vp> + constexpr __gnu_cxx::__promoted_t<_Tp, _Up, _Vp> + lerp(_Tp __x, _Up __y, _Vp __z) noexcept + { + using __type = __gnu_cxx::__promoted_t<_Tp, _Up, _Vp>; + return std::__lerp<__type>(__x, __y, __z); + } + +#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) + inline _Float16 + lerp(_Float16 __x, _Float16 __y, _Float16 __z) noexcept + { return std::__lerp<_Float16>(__x, __y, __z); } +#endif + +#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) + inline _Float32 + lerp(_Float32 __x, _Float32 __y, _Float32 __z) noexcept + { return std::__lerp<_Float32>(__x, __y, __z); } +#endif + +#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64) + inline _Float64 + lerp(_Float64 __x, _Float64 __y, _Float64 __z) noexcept + { return std::__lerp<_Float64>(__x, __y, __z); } +#endif + +#if defined(__STDCPP_FLOAT128_T__) \ + && (defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128) \ + || defined(_GLIBCXX_HAVE_FLOAT128_MATH)) + inline _Float128 + lerp(_Float128 __x, _Float128 __y, _Float128 __z) noexcept + { return std::__lerp<_Float128>(__x, __y, __z); } +#endif + +#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) + inline __gnu_cxx::__bfloat16_t + lerp(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y, __gnu_cxx::__bfloat16_t __z) noexcept + { return std::__lerp<__gnu_cxx::__bfloat16_t>(__x, __y, __z); } +#endif + +#endif // C++20 + +_GLIBCXX_END_NAMESPACE_VERSION +} // namespace + +#if _GLIBCXX_USE_STD_SPEC_FUNCS +# include <bits/specfun.h> +#endif + +} // extern "C++" + +#endif |