10b57cec5SDimitry Andric // -*- C++ -*- 2349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 30b57cec5SDimitry Andric // 40b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 60b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70b57cec5SDimitry Andric // 80b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric 100b57cec5SDimitry Andric #ifndef _LIBCPP_MATH_H 110b57cec5SDimitry Andric #define _LIBCPP_MATH_H 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric /* 140b57cec5SDimitry Andric math.h synopsis 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric Macros: 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric HUGE_VAL 190b57cec5SDimitry Andric HUGE_VALF // C99 200b57cec5SDimitry Andric HUGE_VALL // C99 210b57cec5SDimitry Andric INFINITY // C99 220b57cec5SDimitry Andric NAN // C99 230b57cec5SDimitry Andric FP_INFINITE // C99 240b57cec5SDimitry Andric FP_NAN // C99 250b57cec5SDimitry Andric FP_NORMAL // C99 260b57cec5SDimitry Andric FP_SUBNORMAL // C99 270b57cec5SDimitry Andric FP_ZERO // C99 280b57cec5SDimitry Andric FP_FAST_FMA // C99 290b57cec5SDimitry Andric FP_FAST_FMAF // C99 300b57cec5SDimitry Andric FP_FAST_FMAL // C99 310b57cec5SDimitry Andric FP_ILOGB0 // C99 320b57cec5SDimitry Andric FP_ILOGBNAN // C99 330b57cec5SDimitry Andric MATH_ERRNO // C99 340b57cec5SDimitry Andric MATH_ERREXCEPT // C99 350b57cec5SDimitry Andric math_errhandling // C99 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric Types: 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric float_t // C99 400b57cec5SDimitry Andric double_t // C99 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric // C90 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric floating_point abs(floating_point x); 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric floating_point acos (arithmetic x); 470b57cec5SDimitry Andric float acosf(float x); 480b57cec5SDimitry Andric long double acosl(long double x); 490b57cec5SDimitry Andric 500b57cec5SDimitry Andric floating_point asin (arithmetic x); 510b57cec5SDimitry Andric float asinf(float x); 520b57cec5SDimitry Andric long double asinl(long double x); 530b57cec5SDimitry Andric 540b57cec5SDimitry Andric floating_point atan (arithmetic x); 550b57cec5SDimitry Andric float atanf(float x); 560b57cec5SDimitry Andric long double atanl(long double x); 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric floating_point atan2 (arithmetic y, arithmetic x); 590b57cec5SDimitry Andric float atan2f(float y, float x); 600b57cec5SDimitry Andric long double atan2l(long double y, long double x); 610b57cec5SDimitry Andric 620b57cec5SDimitry Andric floating_point ceil (arithmetic x); 630b57cec5SDimitry Andric float ceilf(float x); 640b57cec5SDimitry Andric long double ceill(long double x); 650b57cec5SDimitry Andric 660b57cec5SDimitry Andric floating_point cos (arithmetic x); 670b57cec5SDimitry Andric float cosf(float x); 680b57cec5SDimitry Andric long double cosl(long double x); 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric floating_point cosh (arithmetic x); 710b57cec5SDimitry Andric float coshf(float x); 720b57cec5SDimitry Andric long double coshl(long double x); 730b57cec5SDimitry Andric 740b57cec5SDimitry Andric floating_point exp (arithmetic x); 750b57cec5SDimitry Andric float expf(float x); 760b57cec5SDimitry Andric long double expl(long double x); 770b57cec5SDimitry Andric 780b57cec5SDimitry Andric floating_point fabs (arithmetic x); 790b57cec5SDimitry Andric float fabsf(float x); 800b57cec5SDimitry Andric long double fabsl(long double x); 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric floating_point floor (arithmetic x); 830b57cec5SDimitry Andric float floorf(float x); 840b57cec5SDimitry Andric long double floorl(long double x); 850b57cec5SDimitry Andric 860b57cec5SDimitry Andric floating_point fmod (arithmetic x, arithmetic y); 870b57cec5SDimitry Andric float fmodf(float x, float y); 880b57cec5SDimitry Andric long double fmodl(long double x, long double y); 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric floating_point frexp (arithmetic value, int* exp); 910b57cec5SDimitry Andric float frexpf(float value, int* exp); 920b57cec5SDimitry Andric long double frexpl(long double value, int* exp); 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric floating_point ldexp (arithmetic value, int exp); 950b57cec5SDimitry Andric float ldexpf(float value, int exp); 960b57cec5SDimitry Andric long double ldexpl(long double value, int exp); 970b57cec5SDimitry Andric 980b57cec5SDimitry Andric floating_point log (arithmetic x); 990b57cec5SDimitry Andric float logf(float x); 1000b57cec5SDimitry Andric long double logl(long double x); 1010b57cec5SDimitry Andric 1020b57cec5SDimitry Andric floating_point log10 (arithmetic x); 1030b57cec5SDimitry Andric float log10f(float x); 1040b57cec5SDimitry Andric long double log10l(long double x); 1050b57cec5SDimitry Andric 1060b57cec5SDimitry Andric floating_point modf (floating_point value, floating_point* iptr); 1070b57cec5SDimitry Andric float modff(float value, float* iptr); 1080b57cec5SDimitry Andric long double modfl(long double value, long double* iptr); 1090b57cec5SDimitry Andric 1100b57cec5SDimitry Andric floating_point pow (arithmetic x, arithmetic y); 1110b57cec5SDimitry Andric float powf(float x, float y); 1120b57cec5SDimitry Andric long double powl(long double x, long double y); 1130b57cec5SDimitry Andric 1140b57cec5SDimitry Andric floating_point sin (arithmetic x); 1150b57cec5SDimitry Andric float sinf(float x); 1160b57cec5SDimitry Andric long double sinl(long double x); 1170b57cec5SDimitry Andric 1180b57cec5SDimitry Andric floating_point sinh (arithmetic x); 1190b57cec5SDimitry Andric float sinhf(float x); 1200b57cec5SDimitry Andric long double sinhl(long double x); 1210b57cec5SDimitry Andric 1220b57cec5SDimitry Andric floating_point sqrt (arithmetic x); 1230b57cec5SDimitry Andric float sqrtf(float x); 1240b57cec5SDimitry Andric long double sqrtl(long double x); 1250b57cec5SDimitry Andric 1260b57cec5SDimitry Andric floating_point tan (arithmetic x); 1270b57cec5SDimitry Andric float tanf(float x); 1280b57cec5SDimitry Andric long double tanl(long double x); 1290b57cec5SDimitry Andric 1300b57cec5SDimitry Andric floating_point tanh (arithmetic x); 1310b57cec5SDimitry Andric float tanhf(float x); 1320b57cec5SDimitry Andric long double tanhl(long double x); 1330b57cec5SDimitry Andric 1340b57cec5SDimitry Andric // C99 1350b57cec5SDimitry Andric 1360b57cec5SDimitry Andric bool signbit(arithmetic x); 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric int fpclassify(arithmetic x); 1390b57cec5SDimitry Andric 1400b57cec5SDimitry Andric bool isfinite(arithmetic x); 1410b57cec5SDimitry Andric bool isinf(arithmetic x); 1420b57cec5SDimitry Andric bool isnan(arithmetic x); 1430b57cec5SDimitry Andric bool isnormal(arithmetic x); 1440b57cec5SDimitry Andric 1450b57cec5SDimitry Andric bool isgreater(arithmetic x, arithmetic y); 1460b57cec5SDimitry Andric bool isgreaterequal(arithmetic x, arithmetic y); 1470b57cec5SDimitry Andric bool isless(arithmetic x, arithmetic y); 1480b57cec5SDimitry Andric bool islessequal(arithmetic x, arithmetic y); 1490b57cec5SDimitry Andric bool islessgreater(arithmetic x, arithmetic y); 1500b57cec5SDimitry Andric bool isunordered(arithmetic x, arithmetic y); 1510b57cec5SDimitry Andric 1520b57cec5SDimitry Andric floating_point acosh (arithmetic x); 1530b57cec5SDimitry Andric float acoshf(float x); 1540b57cec5SDimitry Andric long double acoshl(long double x); 1550b57cec5SDimitry Andric 1560b57cec5SDimitry Andric floating_point asinh (arithmetic x); 1570b57cec5SDimitry Andric float asinhf(float x); 1580b57cec5SDimitry Andric long double asinhl(long double x); 1590b57cec5SDimitry Andric 1600b57cec5SDimitry Andric floating_point atanh (arithmetic x); 1610b57cec5SDimitry Andric float atanhf(float x); 1620b57cec5SDimitry Andric long double atanhl(long double x); 1630b57cec5SDimitry Andric 1640b57cec5SDimitry Andric floating_point cbrt (arithmetic x); 1650b57cec5SDimitry Andric float cbrtf(float x); 1660b57cec5SDimitry Andric long double cbrtl(long double x); 1670b57cec5SDimitry Andric 1680b57cec5SDimitry Andric floating_point copysign (arithmetic x, arithmetic y); 1690b57cec5SDimitry Andric float copysignf(float x, float y); 1700b57cec5SDimitry Andric long double copysignl(long double x, long double y); 1710b57cec5SDimitry Andric 1720b57cec5SDimitry Andric floating_point erf (arithmetic x); 1730b57cec5SDimitry Andric float erff(float x); 1740b57cec5SDimitry Andric long double erfl(long double x); 1750b57cec5SDimitry Andric 1760b57cec5SDimitry Andric floating_point erfc (arithmetic x); 1770b57cec5SDimitry Andric float erfcf(float x); 1780b57cec5SDimitry Andric long double erfcl(long double x); 1790b57cec5SDimitry Andric 1800b57cec5SDimitry Andric floating_point exp2 (arithmetic x); 1810b57cec5SDimitry Andric float exp2f(float x); 1820b57cec5SDimitry Andric long double exp2l(long double x); 1830b57cec5SDimitry Andric 1840b57cec5SDimitry Andric floating_point expm1 (arithmetic x); 1850b57cec5SDimitry Andric float expm1f(float x); 1860b57cec5SDimitry Andric long double expm1l(long double x); 1870b57cec5SDimitry Andric 1880b57cec5SDimitry Andric floating_point fdim (arithmetic x, arithmetic y); 1890b57cec5SDimitry Andric float fdimf(float x, float y); 1900b57cec5SDimitry Andric long double fdiml(long double x, long double y); 1910b57cec5SDimitry Andric 1920b57cec5SDimitry Andric floating_point fma (arithmetic x, arithmetic y, arithmetic z); 1930b57cec5SDimitry Andric float fmaf(float x, float y, float z); 1940b57cec5SDimitry Andric long double fmal(long double x, long double y, long double z); 1950b57cec5SDimitry Andric 1960b57cec5SDimitry Andric floating_point fmax (arithmetic x, arithmetic y); 1970b57cec5SDimitry Andric float fmaxf(float x, float y); 1980b57cec5SDimitry Andric long double fmaxl(long double x, long double y); 1990b57cec5SDimitry Andric 2000b57cec5SDimitry Andric floating_point fmin (arithmetic x, arithmetic y); 2010b57cec5SDimitry Andric float fminf(float x, float y); 2020b57cec5SDimitry Andric long double fminl(long double x, long double y); 2030b57cec5SDimitry Andric 2040b57cec5SDimitry Andric floating_point hypot (arithmetic x, arithmetic y); 2050b57cec5SDimitry Andric float hypotf(float x, float y); 2060b57cec5SDimitry Andric long double hypotl(long double x, long double y); 2070b57cec5SDimitry Andric 2080b57cec5SDimitry Andric int ilogb (arithmetic x); 2090b57cec5SDimitry Andric int ilogbf(float x); 2100b57cec5SDimitry Andric int ilogbl(long double x); 2110b57cec5SDimitry Andric 2120b57cec5SDimitry Andric floating_point lgamma (arithmetic x); 2130b57cec5SDimitry Andric float lgammaf(float x); 2140b57cec5SDimitry Andric long double lgammal(long double x); 2150b57cec5SDimitry Andric 2160b57cec5SDimitry Andric long long llrint (arithmetic x); 2170b57cec5SDimitry Andric long long llrintf(float x); 2180b57cec5SDimitry Andric long long llrintl(long double x); 2190b57cec5SDimitry Andric 2200b57cec5SDimitry Andric long long llround (arithmetic x); 2210b57cec5SDimitry Andric long long llroundf(float x); 2220b57cec5SDimitry Andric long long llroundl(long double x); 2230b57cec5SDimitry Andric 2240b57cec5SDimitry Andric floating_point log1p (arithmetic x); 2250b57cec5SDimitry Andric float log1pf(float x); 2260b57cec5SDimitry Andric long double log1pl(long double x); 2270b57cec5SDimitry Andric 2280b57cec5SDimitry Andric floating_point log2 (arithmetic x); 2290b57cec5SDimitry Andric float log2f(float x); 2300b57cec5SDimitry Andric long double log2l(long double x); 2310b57cec5SDimitry Andric 2320b57cec5SDimitry Andric floating_point logb (arithmetic x); 2330b57cec5SDimitry Andric float logbf(float x); 2340b57cec5SDimitry Andric long double logbl(long double x); 2350b57cec5SDimitry Andric 2360b57cec5SDimitry Andric long lrint (arithmetic x); 2370b57cec5SDimitry Andric long lrintf(float x); 2380b57cec5SDimitry Andric long lrintl(long double x); 2390b57cec5SDimitry Andric 2400b57cec5SDimitry Andric long lround (arithmetic x); 2410b57cec5SDimitry Andric long lroundf(float x); 2420b57cec5SDimitry Andric long lroundl(long double x); 2430b57cec5SDimitry Andric 2440b57cec5SDimitry Andric double nan (const char* str); 2450b57cec5SDimitry Andric float nanf(const char* str); 2460b57cec5SDimitry Andric long double nanl(const char* str); 2470b57cec5SDimitry Andric 2480b57cec5SDimitry Andric floating_point nearbyint (arithmetic x); 2490b57cec5SDimitry Andric float nearbyintf(float x); 2500b57cec5SDimitry Andric long double nearbyintl(long double x); 2510b57cec5SDimitry Andric 2520b57cec5SDimitry Andric floating_point nextafter (arithmetic x, arithmetic y); 2530b57cec5SDimitry Andric float nextafterf(float x, float y); 2540b57cec5SDimitry Andric long double nextafterl(long double x, long double y); 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andric floating_point nexttoward (arithmetic x, long double y); 2570b57cec5SDimitry Andric float nexttowardf(float x, long double y); 2580b57cec5SDimitry Andric long double nexttowardl(long double x, long double y); 2590b57cec5SDimitry Andric 2600b57cec5SDimitry Andric floating_point remainder (arithmetic x, arithmetic y); 2610b57cec5SDimitry Andric float remainderf(float x, float y); 2620b57cec5SDimitry Andric long double remainderl(long double x, long double y); 2630b57cec5SDimitry Andric 2640b57cec5SDimitry Andric floating_point remquo (arithmetic x, arithmetic y, int* pquo); 2650b57cec5SDimitry Andric float remquof(float x, float y, int* pquo); 2660b57cec5SDimitry Andric long double remquol(long double x, long double y, int* pquo); 2670b57cec5SDimitry Andric 2680b57cec5SDimitry Andric floating_point rint (arithmetic x); 2690b57cec5SDimitry Andric float rintf(float x); 2700b57cec5SDimitry Andric long double rintl(long double x); 2710b57cec5SDimitry Andric 2720b57cec5SDimitry Andric floating_point round (arithmetic x); 2730b57cec5SDimitry Andric float roundf(float x); 2740b57cec5SDimitry Andric long double roundl(long double x); 2750b57cec5SDimitry Andric 2760b57cec5SDimitry Andric floating_point scalbln (arithmetic x, long ex); 2770b57cec5SDimitry Andric float scalblnf(float x, long ex); 2780b57cec5SDimitry Andric long double scalblnl(long double x, long ex); 2790b57cec5SDimitry Andric 2800b57cec5SDimitry Andric floating_point scalbn (arithmetic x, int ex); 2810b57cec5SDimitry Andric float scalbnf(float x, int ex); 2820b57cec5SDimitry Andric long double scalbnl(long double x, int ex); 2830b57cec5SDimitry Andric 2840b57cec5SDimitry Andric floating_point tgamma (arithmetic x); 2850b57cec5SDimitry Andric float tgammaf(float x); 2860b57cec5SDimitry Andric long double tgammal(long double x); 2870b57cec5SDimitry Andric 2880b57cec5SDimitry Andric floating_point trunc (arithmetic x); 2890b57cec5SDimitry Andric float truncf(float x); 2900b57cec5SDimitry Andric long double truncl(long double x); 2910b57cec5SDimitry Andric 2920b57cec5SDimitry Andric */ 2930b57cec5SDimitry Andric 2940b57cec5SDimitry Andric #include <__config> 2950b57cec5SDimitry Andric 2960b57cec5SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 2970b57cec5SDimitry Andric # pragma GCC system_header 2980b57cec5SDimitry Andric #endif 2990b57cec5SDimitry Andric 300*bdd1243dSDimitry Andric # if __has_include_next(<math.h>) 3010b57cec5SDimitry Andric # include_next <math.h> 302*bdd1243dSDimitry Andric # endif 3030b57cec5SDimitry Andric 3040b57cec5SDimitry Andric #ifdef __cplusplus 3050b57cec5SDimitry Andric 3060b57cec5SDimitry Andric // We support including .h headers inside 'extern "C"' contexts, so switch 3070b57cec5SDimitry Andric // back to C++ linkage before including these C++ headers. 3080b57cec5SDimitry Andric extern "C++" { 3090b57cec5SDimitry Andric 310*bdd1243dSDimitry Andric #include <__type_traits/enable_if.h> 311*bdd1243dSDimitry Andric #include <__type_traits/is_floating_point.h> 312*bdd1243dSDimitry Andric #include <__type_traits/is_integral.h> 313*bdd1243dSDimitry Andric #include <__type_traits/is_same.h> 314972a253aSDimitry Andric #include <__type_traits/promote.h> 31504eeddc0SDimitry Andric #include <limits> 3165ffd83dbSDimitry Andric #include <stdlib.h> 317*bdd1243dSDimitry Andric 318*bdd1243dSDimitry Andric 319*bdd1243dSDimitry Andric # ifdef fpclassify 320*bdd1243dSDimitry Andric # undef fpclassify 321*bdd1243dSDimitry Andric # endif 322*bdd1243dSDimitry Andric 323*bdd1243dSDimitry Andric # ifdef signbit 324*bdd1243dSDimitry Andric # undef signbit 325*bdd1243dSDimitry Andric # endif 326*bdd1243dSDimitry Andric 327*bdd1243dSDimitry Andric # ifdef isfinite 328*bdd1243dSDimitry Andric # undef isfinite 329*bdd1243dSDimitry Andric # endif 330*bdd1243dSDimitry Andric 331*bdd1243dSDimitry Andric # ifdef isinf 332*bdd1243dSDimitry Andric # undef isinf 333*bdd1243dSDimitry Andric # endif 334*bdd1243dSDimitry Andric 335*bdd1243dSDimitry Andric # ifdef isnan 336*bdd1243dSDimitry Andric # undef isnan 337*bdd1243dSDimitry Andric # endif 338*bdd1243dSDimitry Andric 339*bdd1243dSDimitry Andric # ifdef isnormal 340*bdd1243dSDimitry Andric # undef isnormal 341*bdd1243dSDimitry Andric # endif 342*bdd1243dSDimitry Andric 343*bdd1243dSDimitry Andric # ifdef isgreater 344*bdd1243dSDimitry Andric # undef isgreater 345*bdd1243dSDimitry Andric # endif 346*bdd1243dSDimitry Andric 347*bdd1243dSDimitry Andric # ifdef isgreaterequal 348*bdd1243dSDimitry Andric # undef isgreaterequal 349*bdd1243dSDimitry Andric # endif 350*bdd1243dSDimitry Andric 351*bdd1243dSDimitry Andric # ifdef isless 352*bdd1243dSDimitry Andric # undef isless 353*bdd1243dSDimitry Andric # endif 354*bdd1243dSDimitry Andric 355*bdd1243dSDimitry Andric # ifdef islessequal 356*bdd1243dSDimitry Andric # undef islessequal 357*bdd1243dSDimitry Andric # endif 358*bdd1243dSDimitry Andric 359*bdd1243dSDimitry Andric # ifdef islessgreater 360*bdd1243dSDimitry Andric # undef islessgreater 361*bdd1243dSDimitry Andric # endif 362*bdd1243dSDimitry Andric 363*bdd1243dSDimitry Andric # ifdef isunordered 364*bdd1243dSDimitry Andric # undef isunordered 365*bdd1243dSDimitry Andric # endif 3660b57cec5SDimitry Andric 3670b57cec5SDimitry Andric // signbit 3680b57cec5SDimitry Andric 369*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_floating_point<_A1>::value, int> = 0> 370*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool signbit(_A1 __x) _NOEXCEPT { 371*bdd1243dSDimitry Andric return __builtin_signbit(__x); 3720b57cec5SDimitry Andric } 3730b57cec5SDimitry Andric 374*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_integral<_A1>::value && std::is_signed<_A1>::value, int> = 0> 375*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool signbit(_A1 __x) _NOEXCEPT { 376*bdd1243dSDimitry Andric return __x < 0; 3770b57cec5SDimitry Andric } 3780b57cec5SDimitry Andric 379*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_integral<_A1>::value && !std::is_signed<_A1>::value, int> = 0> 380*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool signbit(_A1) _NOEXCEPT { 381*bdd1243dSDimitry Andric return false; 3820b57cec5SDimitry Andric } 3830b57cec5SDimitry Andric 3840b57cec5SDimitry Andric // fpclassify 3850b57cec5SDimitry Andric 386*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_floating_point<_A1>::value, int> = 0> 387*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI int fpclassify(_A1 __x) _NOEXCEPT { 388*bdd1243dSDimitry Andric return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x); 3890b57cec5SDimitry Andric } 3900b57cec5SDimitry Andric 391*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_integral<_A1>::value, int> = 0> 392*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI int fpclassify(_A1 __x) _NOEXCEPT { 393*bdd1243dSDimitry Andric return __x == 0 ? FP_ZERO : FP_NORMAL; 3940b57cec5SDimitry Andric } 3950b57cec5SDimitry Andric 396*bdd1243dSDimitry Andric // The MSVC runtime already provides these functions as templates 397*bdd1243dSDimitry Andric #ifndef _LIBCPP_MSVCRT 3980b57cec5SDimitry Andric 3990b57cec5SDimitry Andric // isfinite 4000b57cec5SDimitry Andric 401*bdd1243dSDimitry Andric template <class _A1, 402*bdd1243dSDimitry Andric std::__enable_if_t<std::is_arithmetic<_A1>::value && std::numeric_limits<_A1>::has_infinity, int> = 0> 403*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(_A1 __x) _NOEXCEPT { 404*bdd1243dSDimitry Andric return __builtin_isfinite((typename std::__promote<_A1>::type)__x); 4050b57cec5SDimitry Andric } 4060b57cec5SDimitry Andric 407*bdd1243dSDimitry Andric template <class _A1, 408*bdd1243dSDimitry Andric std::__enable_if_t<std::is_arithmetic<_A1>::value && !std::numeric_limits<_A1>::has_infinity, int> = 0> 409*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(_A1) _NOEXCEPT { 410*bdd1243dSDimitry Andric return true; 4110b57cec5SDimitry Andric } 4120b57cec5SDimitry Andric 4130b57cec5SDimitry Andric // isinf 4140b57cec5SDimitry Andric 415*bdd1243dSDimitry Andric template <class _A1, 416*bdd1243dSDimitry Andric std::__enable_if_t<std::is_arithmetic<_A1>::value && std::numeric_limits<_A1>::has_infinity, int> = 0> 417*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(_A1 __x) _NOEXCEPT { 418*bdd1243dSDimitry Andric return __builtin_isinf((typename std::__promote<_A1>::type)__x); 4190b57cec5SDimitry Andric } 4200b57cec5SDimitry Andric 4210b57cec5SDimitry Andric template <class _A1> 422*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI 423*bdd1243dSDimitry Andric typename std::enable_if< std::is_arithmetic<_A1>::value && !std::numeric_limits<_A1>::has_infinity, bool>::type 424*bdd1243dSDimitry Andric isinf(_A1) _NOEXCEPT { 425*bdd1243dSDimitry Andric return false; 426*bdd1243dSDimitry Andric } 4270b57cec5SDimitry Andric 4280b57cec5SDimitry Andric # ifdef _LIBCPP_PREFERRED_OVERLOAD 429*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(float __x) _NOEXCEPT { 430*bdd1243dSDimitry Andric return __builtin_isinf(__x); 431*bdd1243dSDimitry Andric } 4320b57cec5SDimitry Andric 433*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI _LIBCPP_PREFERRED_OVERLOAD bool isinf(double __x) _NOEXCEPT { 434*bdd1243dSDimitry Andric return __builtin_isinf(__x); 435*bdd1243dSDimitry Andric } 4360b57cec5SDimitry Andric 437*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(long double __x) _NOEXCEPT { 438*bdd1243dSDimitry Andric return __builtin_isinf(__x); 439*bdd1243dSDimitry Andric } 4400b57cec5SDimitry Andric # endif 4410b57cec5SDimitry Andric 4420b57cec5SDimitry Andric // isnan 4430b57cec5SDimitry Andric 444*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_floating_point<_A1>::value, int> = 0> 445*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(_A1 __x) _NOEXCEPT { 446*bdd1243dSDimitry Andric return __builtin_isnan(__x); 4470b57cec5SDimitry Andric } 4480b57cec5SDimitry Andric 449*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_integral<_A1>::value, int> = 0> 450*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(_A1) _NOEXCEPT { 451*bdd1243dSDimitry Andric return false; 4520b57cec5SDimitry Andric } 4530b57cec5SDimitry Andric 4540b57cec5SDimitry Andric # ifdef _LIBCPP_PREFERRED_OVERLOAD 455*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(float __x) _NOEXCEPT { 456*bdd1243dSDimitry Andric return __builtin_isnan(__x); 457*bdd1243dSDimitry Andric } 4580b57cec5SDimitry Andric 459*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI _LIBCPP_PREFERRED_OVERLOAD bool isnan(double __x) _NOEXCEPT { 460*bdd1243dSDimitry Andric return __builtin_isnan(__x); 461*bdd1243dSDimitry Andric } 4620b57cec5SDimitry Andric 463*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(long double __x) _NOEXCEPT { 464*bdd1243dSDimitry Andric return __builtin_isnan(__x); 465*bdd1243dSDimitry Andric } 4660b57cec5SDimitry Andric # endif 4670b57cec5SDimitry Andric 4680b57cec5SDimitry Andric // isnormal 4690b57cec5SDimitry Andric 470*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_floating_point<_A1>::value, int> = 0> 471*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnormal(_A1 __x) _NOEXCEPT { 472*bdd1243dSDimitry Andric return __builtin_isnormal(__x); 4730b57cec5SDimitry Andric } 4740b57cec5SDimitry Andric 475*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_integral<_A1>::value, int> = 0> 476*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnormal(_A1 __x) _NOEXCEPT { 477*bdd1243dSDimitry Andric return __x != 0; 4780b57cec5SDimitry Andric } 4790b57cec5SDimitry Andric 4800b57cec5SDimitry Andric // isgreater 4810b57cec5SDimitry Andric 482*bdd1243dSDimitry Andric template <class _A1, 483*bdd1243dSDimitry Andric class _A2, 484*bdd1243dSDimitry Andric std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, int> = 0> 485*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool isgreater(_A1 __x, _A2 __y) _NOEXCEPT { 4860b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type type; 487*bdd1243dSDimitry Andric return __builtin_isgreater((type)__x, (type)__y); 4880b57cec5SDimitry Andric } 4890b57cec5SDimitry Andric 4900b57cec5SDimitry Andric // isgreaterequal 4910b57cec5SDimitry Andric 492*bdd1243dSDimitry Andric template <class _A1, 493*bdd1243dSDimitry Andric class _A2, 494*bdd1243dSDimitry Andric std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, int> = 0> 495*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool isgreaterequal(_A1 __x, _A2 __y) _NOEXCEPT { 4960b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type type; 497*bdd1243dSDimitry Andric return __builtin_isgreaterequal((type)__x, (type)__y); 4980b57cec5SDimitry Andric } 4990b57cec5SDimitry Andric 5000b57cec5SDimitry Andric // isless 5010b57cec5SDimitry Andric 502*bdd1243dSDimitry Andric template <class _A1, 503*bdd1243dSDimitry Andric class _A2, 504*bdd1243dSDimitry Andric std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, int> = 0> 505*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool isless(_A1 __x, _A2 __y) _NOEXCEPT { 5060b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type type; 507*bdd1243dSDimitry Andric return __builtin_isless((type)__x, (type)__y); 5080b57cec5SDimitry Andric } 5090b57cec5SDimitry Andric 5100b57cec5SDimitry Andric // islessequal 5110b57cec5SDimitry Andric 512*bdd1243dSDimitry Andric template <class _A1, 513*bdd1243dSDimitry Andric class _A2, 514*bdd1243dSDimitry Andric std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, int> = 0> 515*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool islessequal(_A1 __x, _A2 __y) _NOEXCEPT { 5160b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type type; 517*bdd1243dSDimitry Andric return __builtin_islessequal((type)__x, (type)__y); 5180b57cec5SDimitry Andric } 5190b57cec5SDimitry Andric 5200b57cec5SDimitry Andric // islessgreater 5210b57cec5SDimitry Andric 522*bdd1243dSDimitry Andric template <class _A1, 523*bdd1243dSDimitry Andric class _A2, 524*bdd1243dSDimitry Andric std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, int> = 0> 525*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool islessgreater(_A1 __x, _A2 __y) _NOEXCEPT { 5260b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type type; 527*bdd1243dSDimitry Andric return __builtin_islessgreater((type)__x, (type)__y); 5280b57cec5SDimitry Andric } 5290b57cec5SDimitry Andric 5300b57cec5SDimitry Andric // isunordered 5310b57cec5SDimitry Andric 532*bdd1243dSDimitry Andric template <class _A1, 533*bdd1243dSDimitry Andric class _A2, 534*bdd1243dSDimitry Andric std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, int> = 0> 535*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool isunordered(_A1 __x, _A2 __y) _NOEXCEPT { 5360b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type type; 537*bdd1243dSDimitry Andric return __builtin_isunordered((type)__x, (type)__y); 5380b57cec5SDimitry Andric } 5390b57cec5SDimitry Andric 540*bdd1243dSDimitry Andric #endif // _LIBCPP_MSVCRT 5410b57cec5SDimitry Andric 5420b57cec5SDimitry Andric // abs 5435ffd83dbSDimitry Andric // 5445ffd83dbSDimitry Andric // handled in stdlib.h 5450b57cec5SDimitry Andric 5460b57cec5SDimitry Andric // div 5475ffd83dbSDimitry Andric // 5485ffd83dbSDimitry Andric // handled in stdlib.h 5490b57cec5SDimitry Andric 550*bdd1243dSDimitry Andric // We have to provide double overloads for <math.h> to work on platforms that don't provide the full set of math 551*bdd1243dSDimitry Andric // functions. To make the overload set work with multiple functions that take the same arguments, we make our overloads 552*bdd1243dSDimitry Andric // templates. Functions are preferred over function templates during overload resolution, which means that our overload 553*bdd1243dSDimitry Andric // will only be selected when the C library doesn't provide one. 554*bdd1243dSDimitry Andric 5550b57cec5SDimitry Andric // acos 5560b57cec5SDimitry Andric 55781ad6265SDimitry Andric # if !defined(__sun__) 558*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float acos(float __x) _NOEXCEPT {return __builtin_acosf(__x);} 559*bdd1243dSDimitry Andric 560*bdd1243dSDimitry Andric template <class = int> 561*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double acos(double __x) _NOEXCEPT { 562*bdd1243dSDimitry Andric return __builtin_acos(__x); 563*bdd1243dSDimitry Andric } 564*bdd1243dSDimitry Andric 565*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double acos(long double __x) _NOEXCEPT {return __builtin_acosl(__x);} 5660b57cec5SDimitry Andric # endif 5670b57cec5SDimitry Andric 5680b57cec5SDimitry Andric template <class _A1> 569*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 5700b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 571*bdd1243dSDimitry Andric acos(_A1 __x) _NOEXCEPT {return __builtin_acos((double)__x);} 5720b57cec5SDimitry Andric 5730b57cec5SDimitry Andric // asin 5740b57cec5SDimitry Andric 57581ad6265SDimitry Andric # if !defined(__sun__) 576*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float asin(float __x) _NOEXCEPT {return __builtin_asinf(__x);} 577*bdd1243dSDimitry Andric 578*bdd1243dSDimitry Andric template <class = int> 579*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double asin(double __x) _NOEXCEPT { 580*bdd1243dSDimitry Andric return __builtin_asin(__x); 581*bdd1243dSDimitry Andric } 582*bdd1243dSDimitry Andric 583*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double asin(long double __x) _NOEXCEPT {return __builtin_asinl(__x);} 5840b57cec5SDimitry Andric # endif 5850b57cec5SDimitry Andric 5860b57cec5SDimitry Andric template <class _A1> 587*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 5880b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 589*bdd1243dSDimitry Andric asin(_A1 __x) _NOEXCEPT {return __builtin_asin((double)__x);} 5900b57cec5SDimitry Andric 5910b57cec5SDimitry Andric // atan 5920b57cec5SDimitry Andric 59381ad6265SDimitry Andric # if !defined(__sun__) 594*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float atan(float __x) _NOEXCEPT {return __builtin_atanf(__x);} 595*bdd1243dSDimitry Andric 596*bdd1243dSDimitry Andric template <class = int> 597*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double atan(double __x) _NOEXCEPT { 598*bdd1243dSDimitry Andric return __builtin_atan(__x); 599*bdd1243dSDimitry Andric } 600*bdd1243dSDimitry Andric 601*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double atan(long double __x) _NOEXCEPT {return __builtin_atanl(__x);} 6020b57cec5SDimitry Andric # endif 6030b57cec5SDimitry Andric 6040b57cec5SDimitry Andric template <class _A1> 605*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 6060b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 607*bdd1243dSDimitry Andric atan(_A1 __x) _NOEXCEPT {return __builtin_atan((double)__x);} 6080b57cec5SDimitry Andric 6090b57cec5SDimitry Andric // atan2 6100b57cec5SDimitry Andric 61181ad6265SDimitry Andric # if !defined(__sun__) 612*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float atan2(float __y, float __x) _NOEXCEPT {return __builtin_atan2f(__y, __x);} 613*bdd1243dSDimitry Andric 614*bdd1243dSDimitry Andric template <class = int> 615*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double atan2(double __x, double __y) _NOEXCEPT { 616*bdd1243dSDimitry Andric return __builtin_atan2(__x, __y); 617*bdd1243dSDimitry Andric } 618*bdd1243dSDimitry Andric 619*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double atan2(long double __y, long double __x) _NOEXCEPT {return __builtin_atan2l(__y, __x);} 6200b57cec5SDimitry Andric # endif 6210b57cec5SDimitry Andric 6220b57cec5SDimitry Andric template <class _A1, class _A2> 623*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 624349cc55cSDimitry Andric typename std::__enable_if_t 6250b57cec5SDimitry Andric < 6260b57cec5SDimitry Andric std::is_arithmetic<_A1>::value && 6270b57cec5SDimitry Andric std::is_arithmetic<_A2>::value, 6280b57cec5SDimitry Andric std::__promote<_A1, _A2> 6290b57cec5SDimitry Andric >::type 630*bdd1243dSDimitry Andric atan2(_A1 __y, _A2 __x) _NOEXCEPT 6310b57cec5SDimitry Andric { 6320b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type __result_type; 6330b57cec5SDimitry Andric static_assert((!(std::_IsSame<_A1, __result_type>::value && 6340b57cec5SDimitry Andric std::_IsSame<_A2, __result_type>::value)), ""); 635*bdd1243dSDimitry Andric return ::atan2((__result_type)__y, (__result_type)__x); 6360b57cec5SDimitry Andric } 6370b57cec5SDimitry Andric 6380b57cec5SDimitry Andric // ceil 6390b57cec5SDimitry Andric 64081ad6265SDimitry Andric # if !defined(__sun__) 641*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float ceil(float __x) _NOEXCEPT {return __builtin_ceilf(__x);} 642*bdd1243dSDimitry Andric 643*bdd1243dSDimitry Andric template <class = int> 644*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double ceil(double __x) _NOEXCEPT { 645*bdd1243dSDimitry Andric return __builtin_ceil(__x); 646*bdd1243dSDimitry Andric } 647*bdd1243dSDimitry Andric 648*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double ceil(long double __x) _NOEXCEPT {return __builtin_ceill(__x);} 6490b57cec5SDimitry Andric # endif 6500b57cec5SDimitry Andric 6510b57cec5SDimitry Andric template <class _A1> 652*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI 6530b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 654*bdd1243dSDimitry Andric ceil(_A1 __x) _NOEXCEPT {return __builtin_ceil((double)__x);} 6550b57cec5SDimitry Andric 6560b57cec5SDimitry Andric // cos 6570b57cec5SDimitry Andric 65881ad6265SDimitry Andric # if !defined(__sun__) 659*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float cos(float __x) _NOEXCEPT {return __builtin_cosf(__x);} 660*bdd1243dSDimitry Andric 661*bdd1243dSDimitry Andric template <class = int> 662*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double cos(double __x) _NOEXCEPT { 663*bdd1243dSDimitry Andric return __builtin_cos(__x); 664*bdd1243dSDimitry Andric } 665*bdd1243dSDimitry Andric 666*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double cos(long double __x) _NOEXCEPT {return __builtin_cosl(__x);} 6670b57cec5SDimitry Andric # endif 6680b57cec5SDimitry Andric 6690b57cec5SDimitry Andric template <class _A1> 670*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 6710b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 672*bdd1243dSDimitry Andric cos(_A1 __x) _NOEXCEPT {return __builtin_cos((double)__x);} 6730b57cec5SDimitry Andric 6740b57cec5SDimitry Andric // cosh 6750b57cec5SDimitry Andric 67681ad6265SDimitry Andric # if !defined(__sun__) 677*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float cosh(float __x) _NOEXCEPT {return __builtin_coshf(__x);} 678*bdd1243dSDimitry Andric 679*bdd1243dSDimitry Andric template <class = int> 680*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double cosh(double __x) _NOEXCEPT { 681*bdd1243dSDimitry Andric return __builtin_cosh(__x); 682*bdd1243dSDimitry Andric } 683*bdd1243dSDimitry Andric 684*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double cosh(long double __x) _NOEXCEPT {return __builtin_coshl(__x);} 6850b57cec5SDimitry Andric # endif 6860b57cec5SDimitry Andric 6870b57cec5SDimitry Andric template <class _A1> 688*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 6890b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 690*bdd1243dSDimitry Andric cosh(_A1 __x) _NOEXCEPT {return __builtin_cosh((double)__x);} 6910b57cec5SDimitry Andric 6920b57cec5SDimitry Andric // exp 6930b57cec5SDimitry Andric 69481ad6265SDimitry Andric # if !defined(__sun__) 695*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float exp(float __x) _NOEXCEPT {return __builtin_expf(__x);} 696*bdd1243dSDimitry Andric 697*bdd1243dSDimitry Andric template <class = int> 698*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double exp(double __x) _NOEXCEPT { 699*bdd1243dSDimitry Andric return __builtin_exp(__x); 700*bdd1243dSDimitry Andric } 701*bdd1243dSDimitry Andric 702*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double exp(long double __x) _NOEXCEPT {return __builtin_expl(__x);} 7030b57cec5SDimitry Andric # endif 7040b57cec5SDimitry Andric 7050b57cec5SDimitry Andric template <class _A1> 706*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 7070b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 708*bdd1243dSDimitry Andric exp(_A1 __x) _NOEXCEPT {return __builtin_exp((double)__x);} 7090b57cec5SDimitry Andric 7100b57cec5SDimitry Andric // fabs 7110b57cec5SDimitry Andric 71281ad6265SDimitry Andric # if !defined(__sun__) 713*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float fabs(float __x) _NOEXCEPT {return __builtin_fabsf(__x);} 714*bdd1243dSDimitry Andric 715*bdd1243dSDimitry Andric template <class = int> 716*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double fabs(double __x) _NOEXCEPT { 717*bdd1243dSDimitry Andric return __builtin_fabs(__x); 718*bdd1243dSDimitry Andric } 719*bdd1243dSDimitry Andric 720*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double fabs(long double __x) _NOEXCEPT {return __builtin_fabsl(__x);} 7210b57cec5SDimitry Andric # endif 7220b57cec5SDimitry Andric 7230b57cec5SDimitry Andric template <class _A1> 724*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI 7250b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 726*bdd1243dSDimitry Andric fabs(_A1 __x) _NOEXCEPT {return __builtin_fabs((double)__x);} 7270b57cec5SDimitry Andric 7280b57cec5SDimitry Andric // floor 7290b57cec5SDimitry Andric 73081ad6265SDimitry Andric # if !defined(__sun__) 731*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float floor(float __x) _NOEXCEPT {return __builtin_floorf(__x);} 732*bdd1243dSDimitry Andric 733*bdd1243dSDimitry Andric template <class = int> 734*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double floor(double __x) _NOEXCEPT { 735*bdd1243dSDimitry Andric return __builtin_floor(__x); 736*bdd1243dSDimitry Andric } 737*bdd1243dSDimitry Andric 738*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double floor(long double __x) _NOEXCEPT {return __builtin_floorl(__x);} 7390b57cec5SDimitry Andric # endif 7400b57cec5SDimitry Andric 7410b57cec5SDimitry Andric template <class _A1> 742*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI 7430b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 744*bdd1243dSDimitry Andric floor(_A1 __x) _NOEXCEPT {return __builtin_floor((double)__x);} 7450b57cec5SDimitry Andric 7460b57cec5SDimitry Andric // fmod 7470b57cec5SDimitry Andric 74881ad6265SDimitry Andric # if !defined(__sun__) 749*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float fmod(float __x, float __y) _NOEXCEPT {return __builtin_fmodf(__x, __y);} 750*bdd1243dSDimitry Andric 751*bdd1243dSDimitry Andric template <class = int> 752*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double fmod(double __x, double __y) _NOEXCEPT { 753*bdd1243dSDimitry Andric return __builtin_fmod(__x, __y); 754*bdd1243dSDimitry Andric } 755*bdd1243dSDimitry Andric 756*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double fmod(long double __x, long double __y) _NOEXCEPT {return __builtin_fmodl(__x, __y);} 7570b57cec5SDimitry Andric # endif 7580b57cec5SDimitry Andric 7590b57cec5SDimitry Andric template <class _A1, class _A2> 760*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 761349cc55cSDimitry Andric typename std::__enable_if_t 7620b57cec5SDimitry Andric < 7630b57cec5SDimitry Andric std::is_arithmetic<_A1>::value && 7640b57cec5SDimitry Andric std::is_arithmetic<_A2>::value, 7650b57cec5SDimitry Andric std::__promote<_A1, _A2> 7660b57cec5SDimitry Andric >::type 767*bdd1243dSDimitry Andric fmod(_A1 __x, _A2 __y) _NOEXCEPT 7680b57cec5SDimitry Andric { 7690b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type __result_type; 7700b57cec5SDimitry Andric static_assert((!(std::_IsSame<_A1, __result_type>::value && 7710b57cec5SDimitry Andric std::_IsSame<_A2, __result_type>::value)), ""); 772*bdd1243dSDimitry Andric return ::fmod((__result_type)__x, (__result_type)__y); 7730b57cec5SDimitry Andric } 7740b57cec5SDimitry Andric 7750b57cec5SDimitry Andric // frexp 7760b57cec5SDimitry Andric 77781ad6265SDimitry Andric # if !defined(__sun__) 778*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float frexp(float __x, int* __e) _NOEXCEPT {return __builtin_frexpf(__x, __e);} 779*bdd1243dSDimitry Andric 780*bdd1243dSDimitry Andric template <class = int> 781*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double frexp(double __x, int* __e) _NOEXCEPT { 782*bdd1243dSDimitry Andric return __builtin_frexp(__x, __e); 783*bdd1243dSDimitry Andric } 784*bdd1243dSDimitry Andric 785*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double frexp(long double __x, int* __e) _NOEXCEPT {return __builtin_frexpl(__x, __e);} 7860b57cec5SDimitry Andric # endif 7870b57cec5SDimitry Andric 7880b57cec5SDimitry Andric template <class _A1> 789*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 7900b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 791*bdd1243dSDimitry Andric frexp(_A1 __x, int* __e) _NOEXCEPT {return __builtin_frexp((double)__x, __e);} 7920b57cec5SDimitry Andric 7930b57cec5SDimitry Andric // ldexp 7940b57cec5SDimitry Andric 79581ad6265SDimitry Andric # if !defined(__sun__) 796*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float ldexp(float __x, int __e) _NOEXCEPT {return __builtin_ldexpf(__x, __e);} 797*bdd1243dSDimitry Andric 798*bdd1243dSDimitry Andric template <class = int> 799*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double ldexp(double __x, int __e) _NOEXCEPT { 800*bdd1243dSDimitry Andric return __builtin_ldexp(__x, __e); 801*bdd1243dSDimitry Andric } 802*bdd1243dSDimitry Andric 803*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double ldexp(long double __x, int __e) _NOEXCEPT {return __builtin_ldexpl(__x, __e);} 8040b57cec5SDimitry Andric # endif 8050b57cec5SDimitry Andric 8060b57cec5SDimitry Andric template <class _A1> 807*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 8080b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 809*bdd1243dSDimitry Andric ldexp(_A1 __x, int __e) _NOEXCEPT {return __builtin_ldexp((double)__x, __e);} 8100b57cec5SDimitry Andric 8110b57cec5SDimitry Andric // log 8120b57cec5SDimitry Andric 81381ad6265SDimitry Andric # if !defined(__sun__) 814*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float log(float __x) _NOEXCEPT {return __builtin_logf(__x);} 815*bdd1243dSDimitry Andric 816*bdd1243dSDimitry Andric template <class = int> 817*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double log(double __x) _NOEXCEPT { 818*bdd1243dSDimitry Andric return __builtin_log(__x); 819*bdd1243dSDimitry Andric } 820*bdd1243dSDimitry Andric 821*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double log(long double __x) _NOEXCEPT {return __builtin_logl(__x);} 8220b57cec5SDimitry Andric # endif 8230b57cec5SDimitry Andric 8240b57cec5SDimitry Andric template <class _A1> 825*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 8260b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 827*bdd1243dSDimitry Andric log(_A1 __x) _NOEXCEPT {return __builtin_log((double)__x);} 8280b57cec5SDimitry Andric 8290b57cec5SDimitry Andric // log10 8300b57cec5SDimitry Andric 83181ad6265SDimitry Andric # if !defined(__sun__) 832*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float log10(float __x) _NOEXCEPT {return __builtin_log10f(__x);} 833*bdd1243dSDimitry Andric 834*bdd1243dSDimitry Andric 835*bdd1243dSDimitry Andric template <class = int> 836*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double log10(double __x) _NOEXCEPT { 837*bdd1243dSDimitry Andric return __builtin_log10(__x); 838*bdd1243dSDimitry Andric } 839*bdd1243dSDimitry Andric 840*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double log10(long double __x) _NOEXCEPT {return __builtin_log10l(__x);} 8410b57cec5SDimitry Andric # endif 8420b57cec5SDimitry Andric 8430b57cec5SDimitry Andric template <class _A1> 844*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 8450b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 846*bdd1243dSDimitry Andric log10(_A1 __x) _NOEXCEPT {return __builtin_log10((double)__x);} 8470b57cec5SDimitry Andric 8480b57cec5SDimitry Andric // modf 8490b57cec5SDimitry Andric 85081ad6265SDimitry Andric # if !defined(__sun__) 851*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float modf(float __x, float* __y) _NOEXCEPT {return __builtin_modff(__x, __y);} 852*bdd1243dSDimitry Andric 853*bdd1243dSDimitry Andric template <class = int> 854*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double modf(double __x, double* __y) _NOEXCEPT { 855*bdd1243dSDimitry Andric return __builtin_modf(__x, __y); 856*bdd1243dSDimitry Andric } 857*bdd1243dSDimitry Andric 858*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double modf(long double __x, long double* __y) _NOEXCEPT {return __builtin_modfl(__x, __y);} 8590b57cec5SDimitry Andric # endif 8600b57cec5SDimitry Andric 8610b57cec5SDimitry Andric // pow 8620b57cec5SDimitry Andric 86381ad6265SDimitry Andric # if !defined(__sun__) 864*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float pow(float __x, float __y) _NOEXCEPT {return __builtin_powf(__x, __y);} 865*bdd1243dSDimitry Andric 866*bdd1243dSDimitry Andric template <class = int> 867*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double pow(double __x, double __y) _NOEXCEPT { 868*bdd1243dSDimitry Andric return __builtin_pow(__x, __y); 869*bdd1243dSDimitry Andric } 870*bdd1243dSDimitry Andric 871*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double pow(long double __x, long double __y) _NOEXCEPT {return __builtin_powl(__x, __y);} 8720b57cec5SDimitry Andric # endif 8730b57cec5SDimitry Andric 8740b57cec5SDimitry Andric template <class _A1, class _A2> 875*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 876349cc55cSDimitry Andric typename std::__enable_if_t 8770b57cec5SDimitry Andric < 8780b57cec5SDimitry Andric std::is_arithmetic<_A1>::value && 8790b57cec5SDimitry Andric std::is_arithmetic<_A2>::value, 8800b57cec5SDimitry Andric std::__promote<_A1, _A2> 8810b57cec5SDimitry Andric >::type 882*bdd1243dSDimitry Andric pow(_A1 __x, _A2 __y) _NOEXCEPT 8830b57cec5SDimitry Andric { 8840b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type __result_type; 8850b57cec5SDimitry Andric static_assert((!(std::_IsSame<_A1, __result_type>::value && 8860b57cec5SDimitry Andric std::_IsSame<_A2, __result_type>::value)), ""); 887*bdd1243dSDimitry Andric return ::pow((__result_type)__x, (__result_type)__y); 8880b57cec5SDimitry Andric } 8890b57cec5SDimitry Andric 8900b57cec5SDimitry Andric // sin 8910b57cec5SDimitry Andric 89281ad6265SDimitry Andric # if !defined(__sun__) 893*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float sin(float __x) _NOEXCEPT {return __builtin_sinf(__x);} 894*bdd1243dSDimitry Andric 895*bdd1243dSDimitry Andric template <class = int> 896*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double sin(double __x) _NOEXCEPT { 897*bdd1243dSDimitry Andric return __builtin_sin(__x); 898*bdd1243dSDimitry Andric } 899*bdd1243dSDimitry Andric 900*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double sin(long double __x) _NOEXCEPT {return __builtin_sinl(__x);} 9010b57cec5SDimitry Andric #endif 9020b57cec5SDimitry Andric 9030b57cec5SDimitry Andric template <class _A1> 904*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 9050b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 906*bdd1243dSDimitry Andric sin(_A1 __x) _NOEXCEPT {return __builtin_sin((double)__x);} 9070b57cec5SDimitry Andric 9080b57cec5SDimitry Andric // sinh 9090b57cec5SDimitry Andric 91081ad6265SDimitry Andric # if !defined(__sun__) 911*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float sinh(float __x) _NOEXCEPT {return __builtin_sinhf(__x);} 912*bdd1243dSDimitry Andric 913*bdd1243dSDimitry Andric template <class = int> 914*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double sinh(double __x) _NOEXCEPT { 915*bdd1243dSDimitry Andric return __builtin_sinh(__x); 916*bdd1243dSDimitry Andric } 917*bdd1243dSDimitry Andric 918*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double sinh(long double __x) _NOEXCEPT {return __builtin_sinhl(__x);} 9190b57cec5SDimitry Andric # endif 9200b57cec5SDimitry Andric 9210b57cec5SDimitry Andric template <class _A1> 922*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 9230b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 924*bdd1243dSDimitry Andric sinh(_A1 __x) _NOEXCEPT {return __builtin_sinh((double)__x);} 9250b57cec5SDimitry Andric 9260b57cec5SDimitry Andric // sqrt 9270b57cec5SDimitry Andric 92881ad6265SDimitry Andric # if !defined(__sun__) 929*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float sqrt(float __x) _NOEXCEPT {return __builtin_sqrtf(__x);} 930*bdd1243dSDimitry Andric 931*bdd1243dSDimitry Andric template <class = int> 932*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double sqrt(double __x) _NOEXCEPT { 933*bdd1243dSDimitry Andric return __builtin_sqrt(__x); 934*bdd1243dSDimitry Andric } 935*bdd1243dSDimitry Andric 936*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double sqrt(long double __x) _NOEXCEPT {return __builtin_sqrtl(__x);} 9370b57cec5SDimitry Andric # endif 9380b57cec5SDimitry Andric 9390b57cec5SDimitry Andric template <class _A1> 940*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 9410b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 942*bdd1243dSDimitry Andric sqrt(_A1 __x) _NOEXCEPT {return __builtin_sqrt((double)__x);} 9430b57cec5SDimitry Andric 9440b57cec5SDimitry Andric // tan 9450b57cec5SDimitry Andric 94681ad6265SDimitry Andric # if !defined(__sun__) 947*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float tan(float __x) _NOEXCEPT {return __builtin_tanf(__x);} 948*bdd1243dSDimitry Andric 949*bdd1243dSDimitry Andric template <class = int> 950*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double tan(double __x) _NOEXCEPT { 951*bdd1243dSDimitry Andric return __builtin_tan(__x); 952*bdd1243dSDimitry Andric } 953*bdd1243dSDimitry Andric 954*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double tan(long double __x) _NOEXCEPT {return __builtin_tanl(__x);} 9550b57cec5SDimitry Andric # endif 9560b57cec5SDimitry Andric 9570b57cec5SDimitry Andric template <class _A1> 958*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 9590b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 960*bdd1243dSDimitry Andric tan(_A1 __x) _NOEXCEPT {return __builtin_tan((double)__x);} 9610b57cec5SDimitry Andric 9620b57cec5SDimitry Andric // tanh 9630b57cec5SDimitry Andric 96481ad6265SDimitry Andric # if !defined(__sun__) 965*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float tanh(float __x) _NOEXCEPT {return __builtin_tanhf(__x);} 966*bdd1243dSDimitry Andric 967*bdd1243dSDimitry Andric template <class = int> 968*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double tanh(double __x) _NOEXCEPT { 969*bdd1243dSDimitry Andric return __builtin_tanh(__x); 970*bdd1243dSDimitry Andric } 971*bdd1243dSDimitry Andric 972*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double tanh(long double __x) _NOEXCEPT {return __builtin_tanhl(__x);} 9730b57cec5SDimitry Andric # endif 9740b57cec5SDimitry Andric 9750b57cec5SDimitry Andric template <class _A1> 976*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 9770b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 978*bdd1243dSDimitry Andric tanh(_A1 __x) _NOEXCEPT {return __builtin_tanh((double)__x);} 9790b57cec5SDimitry Andric 9800b57cec5SDimitry Andric // acosh 9810b57cec5SDimitry Andric 982*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float acosh(float __x) _NOEXCEPT {return __builtin_acoshf(__x);} 983*bdd1243dSDimitry Andric 984*bdd1243dSDimitry Andric template <class = int> 985*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double acosh(double __x) _NOEXCEPT { 986*bdd1243dSDimitry Andric return __builtin_acosh(__x); 987*bdd1243dSDimitry Andric } 988*bdd1243dSDimitry Andric 989*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double acosh(long double __x) _NOEXCEPT {return __builtin_acoshl(__x);} 9900b57cec5SDimitry Andric 9910b57cec5SDimitry Andric template <class _A1> 992*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 9930b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 994*bdd1243dSDimitry Andric acosh(_A1 __x) _NOEXCEPT {return __builtin_acosh((double)__x);} 9950b57cec5SDimitry Andric 9960b57cec5SDimitry Andric // asinh 9970b57cec5SDimitry Andric 998*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float asinh(float __x) _NOEXCEPT {return __builtin_asinhf(__x);} 999*bdd1243dSDimitry Andric 1000*bdd1243dSDimitry Andric template <class = int> 1001*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double asinh(double __x) _NOEXCEPT { 1002*bdd1243dSDimitry Andric return __builtin_asinh(__x); 1003*bdd1243dSDimitry Andric } 1004*bdd1243dSDimitry Andric 1005*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double asinh(long double __x) _NOEXCEPT {return __builtin_asinhl(__x);} 10060b57cec5SDimitry Andric 10070b57cec5SDimitry Andric template <class _A1> 1008*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 10090b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1010*bdd1243dSDimitry Andric asinh(_A1 __x) _NOEXCEPT {return __builtin_asinh((double)__x);} 10110b57cec5SDimitry Andric 10120b57cec5SDimitry Andric // atanh 10130b57cec5SDimitry Andric 1014*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float atanh(float __x) _NOEXCEPT {return __builtin_atanhf(__x);} 1015*bdd1243dSDimitry Andric 1016*bdd1243dSDimitry Andric template <class = int> 1017*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double atanh(double __x) _NOEXCEPT { 1018*bdd1243dSDimitry Andric return __builtin_atanh(__x); 1019*bdd1243dSDimitry Andric } 1020*bdd1243dSDimitry Andric 1021*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double atanh(long double __x) _NOEXCEPT {return __builtin_atanhl(__x);} 10220b57cec5SDimitry Andric 10230b57cec5SDimitry Andric template <class _A1> 1024*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 10250b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1026*bdd1243dSDimitry Andric atanh(_A1 __x) _NOEXCEPT {return __builtin_atanh((double)__x);} 10270b57cec5SDimitry Andric 10280b57cec5SDimitry Andric // cbrt 10290b57cec5SDimitry Andric 1030*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float cbrt(float __x) _NOEXCEPT {return __builtin_cbrtf(__x);} 1031*bdd1243dSDimitry Andric 1032*bdd1243dSDimitry Andric template <class = int> 1033*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double cbrt(double __x) _NOEXCEPT { 1034*bdd1243dSDimitry Andric return __builtin_cbrt(__x); 1035*bdd1243dSDimitry Andric } 1036*bdd1243dSDimitry Andric 1037*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double cbrt(long double __x) _NOEXCEPT {return __builtin_cbrtl(__x);} 10380b57cec5SDimitry Andric 10390b57cec5SDimitry Andric template <class _A1> 1040*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI 10410b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1042*bdd1243dSDimitry Andric cbrt(_A1 __x) _NOEXCEPT {return __builtin_cbrt((double)__x);} 10430b57cec5SDimitry Andric 10440b57cec5SDimitry Andric // copysign 10450b57cec5SDimitry Andric 1046*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float copysign(float __x, float __y) _NOEXCEPT { 1047*bdd1243dSDimitry Andric return ::__builtin_copysignf(__x, __y); 10480b57cec5SDimitry Andric } 1049fe6060f1SDimitry Andric 1050*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double copysign(long double __x, long double __y) _NOEXCEPT { 1051*bdd1243dSDimitry Andric return ::__builtin_copysignl(__x, __y); 1052fe6060f1SDimitry Andric } 1053fe6060f1SDimitry Andric 1054fe6060f1SDimitry Andric template <class _A1, class _A2> 1055*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI 1056349cc55cSDimitry Andric typename std::__enable_if_t 1057fe6060f1SDimitry Andric < 1058fe6060f1SDimitry Andric std::is_arithmetic<_A1>::value && 1059fe6060f1SDimitry Andric std::is_arithmetic<_A2>::value, 1060fe6060f1SDimitry Andric std::__promote<_A1, _A2> 1061fe6060f1SDimitry Andric >::type 1062*bdd1243dSDimitry Andric copysign(_A1 __x, _A2 __y) _NOEXCEPT { 1063*bdd1243dSDimitry Andric return ::__builtin_copysign(__x, __y); 10640b57cec5SDimitry Andric } 10650b57cec5SDimitry Andric 10660b57cec5SDimitry Andric // erf 10670b57cec5SDimitry Andric 1068*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float erf(float __x) _NOEXCEPT {return __builtin_erff(__x);} 1069*bdd1243dSDimitry Andric 1070*bdd1243dSDimitry Andric template <class = int> 1071*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double erf(double __x) _NOEXCEPT { 1072*bdd1243dSDimitry Andric return __builtin_erf(__x); 1073*bdd1243dSDimitry Andric } 1074*bdd1243dSDimitry Andric 1075*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double erf(long double __x) _NOEXCEPT {return __builtin_erfl(__x);} 10760b57cec5SDimitry Andric 10770b57cec5SDimitry Andric template <class _A1> 1078*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 10790b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1080*bdd1243dSDimitry Andric erf(_A1 __x) _NOEXCEPT {return __builtin_erf((double)__x);} 10810b57cec5SDimitry Andric 10820b57cec5SDimitry Andric // erfc 10830b57cec5SDimitry Andric 1084*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float erfc(float __x) _NOEXCEPT {return __builtin_erfcf(__x);} 1085*bdd1243dSDimitry Andric 1086*bdd1243dSDimitry Andric template <class = int> 1087*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double erfc(double __x) _NOEXCEPT { 1088*bdd1243dSDimitry Andric return __builtin_erfc(__x); 1089*bdd1243dSDimitry Andric } 1090*bdd1243dSDimitry Andric 1091*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double erfc(long double __x) _NOEXCEPT {return __builtin_erfcl(__x);} 10920b57cec5SDimitry Andric 10930b57cec5SDimitry Andric template <class _A1> 1094*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 10950b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1096*bdd1243dSDimitry Andric erfc(_A1 __x) _NOEXCEPT {return __builtin_erfc((double)__x);} 10970b57cec5SDimitry Andric 10980b57cec5SDimitry Andric // exp2 10990b57cec5SDimitry Andric 1100*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float exp2(float __x) _NOEXCEPT {return __builtin_exp2f(__x);} 1101*bdd1243dSDimitry Andric 1102*bdd1243dSDimitry Andric template <class = int> 1103*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double exp2(double __x) _NOEXCEPT { 1104*bdd1243dSDimitry Andric return __builtin_exp2(__x); 1105*bdd1243dSDimitry Andric } 1106*bdd1243dSDimitry Andric 1107*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double exp2(long double __x) _NOEXCEPT {return __builtin_exp2l(__x);} 11080b57cec5SDimitry Andric 11090b57cec5SDimitry Andric template <class _A1> 1110*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 11110b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1112*bdd1243dSDimitry Andric exp2(_A1 __x) _NOEXCEPT {return __builtin_exp2((double)__x);} 11130b57cec5SDimitry Andric 11140b57cec5SDimitry Andric // expm1 11150b57cec5SDimitry Andric 1116*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float expm1(float __x) _NOEXCEPT {return __builtin_expm1f(__x);} 1117*bdd1243dSDimitry Andric 1118*bdd1243dSDimitry Andric template <class = int> 1119*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double expm1(double __x) _NOEXCEPT { 1120*bdd1243dSDimitry Andric return __builtin_expm1(__x); 1121*bdd1243dSDimitry Andric } 1122*bdd1243dSDimitry Andric 1123*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double expm1(long double __x) _NOEXCEPT {return __builtin_expm1l(__x);} 11240b57cec5SDimitry Andric 11250b57cec5SDimitry Andric template <class _A1> 1126*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 11270b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1128*bdd1243dSDimitry Andric expm1(_A1 __x) _NOEXCEPT {return __builtin_expm1((double)__x);} 11290b57cec5SDimitry Andric 11300b57cec5SDimitry Andric // fdim 11310b57cec5SDimitry Andric 1132*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float fdim(float __x, float __y) _NOEXCEPT {return __builtin_fdimf(__x, __y);} 1133*bdd1243dSDimitry Andric 1134*bdd1243dSDimitry Andric template <class = int> 1135*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double fdim(double __x, double __y) _NOEXCEPT { 1136*bdd1243dSDimitry Andric return __builtin_fdim(__x, __y); 1137*bdd1243dSDimitry Andric } 1138*bdd1243dSDimitry Andric 1139*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double fdim(long double __x, long double __y) _NOEXCEPT {return __builtin_fdiml(__x, __y);} 11400b57cec5SDimitry Andric 11410b57cec5SDimitry Andric template <class _A1, class _A2> 1142*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 1143349cc55cSDimitry Andric typename std::__enable_if_t 11440b57cec5SDimitry Andric < 11450b57cec5SDimitry Andric std::is_arithmetic<_A1>::value && 11460b57cec5SDimitry Andric std::is_arithmetic<_A2>::value, 11470b57cec5SDimitry Andric std::__promote<_A1, _A2> 11480b57cec5SDimitry Andric >::type 1149*bdd1243dSDimitry Andric fdim(_A1 __x, _A2 __y) _NOEXCEPT 11500b57cec5SDimitry Andric { 11510b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type __result_type; 11520b57cec5SDimitry Andric static_assert((!(std::_IsSame<_A1, __result_type>::value && 11530b57cec5SDimitry Andric std::_IsSame<_A2, __result_type>::value)), ""); 1154*bdd1243dSDimitry Andric return ::fdim((__result_type)__x, (__result_type)__y); 11550b57cec5SDimitry Andric } 11560b57cec5SDimitry Andric 11570b57cec5SDimitry Andric // fma 11580b57cec5SDimitry Andric 1159*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float fma(float __x, float __y, float __z) _NOEXCEPT 1160fe6060f1SDimitry Andric { 1161*bdd1243dSDimitry Andric return __builtin_fmaf(__x, __y, __z); 1162fe6060f1SDimitry Andric } 1163*bdd1243dSDimitry Andric 1164*bdd1243dSDimitry Andric 1165*bdd1243dSDimitry Andric template <class = int> 1166*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double fma(double __x, double __y, double __z) _NOEXCEPT { 1167*bdd1243dSDimitry Andric return __builtin_fma(__x, __y, __z); 1168*bdd1243dSDimitry Andric } 1169*bdd1243dSDimitry Andric 1170*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double fma(long double __x, long double __y, long double __z) _NOEXCEPT 1171fe6060f1SDimitry Andric { 1172*bdd1243dSDimitry Andric return __builtin_fmal(__x, __y, __z); 1173fe6060f1SDimitry Andric } 11740b57cec5SDimitry Andric 11750b57cec5SDimitry Andric template <class _A1, class _A2, class _A3> 1176*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 1177349cc55cSDimitry Andric typename std::__enable_if_t 11780b57cec5SDimitry Andric < 11790b57cec5SDimitry Andric std::is_arithmetic<_A1>::value && 11800b57cec5SDimitry Andric std::is_arithmetic<_A2>::value && 11810b57cec5SDimitry Andric std::is_arithmetic<_A3>::value, 11820b57cec5SDimitry Andric std::__promote<_A1, _A2, _A3> 11830b57cec5SDimitry Andric >::type 1184*bdd1243dSDimitry Andric fma(_A1 __x, _A2 __y, _A3 __z) _NOEXCEPT 11850b57cec5SDimitry Andric { 11860b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2, _A3>::type __result_type; 11870b57cec5SDimitry Andric static_assert((!(std::_IsSame<_A1, __result_type>::value && 11880b57cec5SDimitry Andric std::_IsSame<_A2, __result_type>::value && 11890b57cec5SDimitry Andric std::_IsSame<_A3, __result_type>::value)), ""); 1190*bdd1243dSDimitry Andric return __builtin_fma((__result_type)__x, (__result_type)__y, (__result_type)__z); 11910b57cec5SDimitry Andric } 11920b57cec5SDimitry Andric 11930b57cec5SDimitry Andric // fmax 11940b57cec5SDimitry Andric 1195*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float fmax(float __x, float __y) _NOEXCEPT {return __builtin_fmaxf(__x, __y);} 1196*bdd1243dSDimitry Andric 1197*bdd1243dSDimitry Andric template <class = int> 1198*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double fmax(double __x, double __y) _NOEXCEPT { 1199*bdd1243dSDimitry Andric return __builtin_fmax(__x, __y); 1200*bdd1243dSDimitry Andric } 1201*bdd1243dSDimitry Andric 1202*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double fmax(long double __x, long double __y) _NOEXCEPT {return __builtin_fmaxl(__x, __y);} 12030b57cec5SDimitry Andric 12040b57cec5SDimitry Andric template <class _A1, class _A2> 1205*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI 1206349cc55cSDimitry Andric typename std::__enable_if_t 12070b57cec5SDimitry Andric < 12080b57cec5SDimitry Andric std::is_arithmetic<_A1>::value && 12090b57cec5SDimitry Andric std::is_arithmetic<_A2>::value, 12100b57cec5SDimitry Andric std::__promote<_A1, _A2> 12110b57cec5SDimitry Andric >::type 1212*bdd1243dSDimitry Andric fmax(_A1 __x, _A2 __y) _NOEXCEPT 12130b57cec5SDimitry Andric { 12140b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type __result_type; 12150b57cec5SDimitry Andric static_assert((!(std::_IsSame<_A1, __result_type>::value && 12160b57cec5SDimitry Andric std::_IsSame<_A2, __result_type>::value)), ""); 1217*bdd1243dSDimitry Andric return ::fmax((__result_type)__x, (__result_type)__y); 12180b57cec5SDimitry Andric } 12190b57cec5SDimitry Andric 12200b57cec5SDimitry Andric // fmin 12210b57cec5SDimitry Andric 1222*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float fmin(float __x, float __y) _NOEXCEPT {return __builtin_fminf(__x, __y);} 1223*bdd1243dSDimitry Andric 1224*bdd1243dSDimitry Andric template <class = int> 1225*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double fmin(double __x, double __y) _NOEXCEPT { 1226*bdd1243dSDimitry Andric return __builtin_fmin(__x, __y); 1227*bdd1243dSDimitry Andric } 1228*bdd1243dSDimitry Andric 1229*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double fmin(long double __x, long double __y) _NOEXCEPT {return __builtin_fminl(__x, __y);} 12300b57cec5SDimitry Andric 12310b57cec5SDimitry Andric template <class _A1, class _A2> 1232*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI 1233349cc55cSDimitry Andric typename std::__enable_if_t 12340b57cec5SDimitry Andric < 12350b57cec5SDimitry Andric std::is_arithmetic<_A1>::value && 12360b57cec5SDimitry Andric std::is_arithmetic<_A2>::value, 12370b57cec5SDimitry Andric std::__promote<_A1, _A2> 12380b57cec5SDimitry Andric >::type 1239*bdd1243dSDimitry Andric fmin(_A1 __x, _A2 __y) _NOEXCEPT 12400b57cec5SDimitry Andric { 12410b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type __result_type; 12420b57cec5SDimitry Andric static_assert((!(std::_IsSame<_A1, __result_type>::value && 12430b57cec5SDimitry Andric std::_IsSame<_A2, __result_type>::value)), ""); 1244*bdd1243dSDimitry Andric return ::fmin((__result_type)__x, (__result_type)__y); 12450b57cec5SDimitry Andric } 12460b57cec5SDimitry Andric 12470b57cec5SDimitry Andric // hypot 12480b57cec5SDimitry Andric 1249*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float hypot(float __x, float __y) _NOEXCEPT {return __builtin_hypotf(__x, __y);} 1250*bdd1243dSDimitry Andric 1251*bdd1243dSDimitry Andric template <class = int> 1252*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double hypot(double __x, double __y) _NOEXCEPT { 1253*bdd1243dSDimitry Andric return __builtin_hypot(__x, __y); 1254*bdd1243dSDimitry Andric } 1255*bdd1243dSDimitry Andric 1256*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double hypot(long double __x, long double __y) _NOEXCEPT {return __builtin_hypotl(__x, __y);} 12570b57cec5SDimitry Andric 12580b57cec5SDimitry Andric template <class _A1, class _A2> 1259*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 1260349cc55cSDimitry Andric typename std::__enable_if_t 12610b57cec5SDimitry Andric < 12620b57cec5SDimitry Andric std::is_arithmetic<_A1>::value && 12630b57cec5SDimitry Andric std::is_arithmetic<_A2>::value, 12640b57cec5SDimitry Andric std::__promote<_A1, _A2> 12650b57cec5SDimitry Andric >::type 1266*bdd1243dSDimitry Andric hypot(_A1 __x, _A2 __y) _NOEXCEPT 12670b57cec5SDimitry Andric { 12680b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type __result_type; 12690b57cec5SDimitry Andric static_assert((!(std::_IsSame<_A1, __result_type>::value && 12700b57cec5SDimitry Andric std::_IsSame<_A2, __result_type>::value)), ""); 1271*bdd1243dSDimitry Andric return ::hypot((__result_type)__x, (__result_type)__y); 12720b57cec5SDimitry Andric } 12730b57cec5SDimitry Andric 12740b57cec5SDimitry Andric // ilogb 12750b57cec5SDimitry Andric 1276*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI int ilogb(float __x) _NOEXCEPT {return __builtin_ilogbf(__x);} 1277*bdd1243dSDimitry Andric 1278*bdd1243dSDimitry Andric template <class = int> 1279*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double ilogb(double __x) _NOEXCEPT { 1280*bdd1243dSDimitry Andric return __builtin_ilogb(__x); 1281*bdd1243dSDimitry Andric } 1282*bdd1243dSDimitry Andric 1283*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI int ilogb(long double __x) _NOEXCEPT {return __builtin_ilogbl(__x);} 12840b57cec5SDimitry Andric 12850b57cec5SDimitry Andric template <class _A1> 1286*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 12870b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, int>::type 1288*bdd1243dSDimitry Andric ilogb(_A1 __x) _NOEXCEPT {return __builtin_ilogb((double)__x);} 12890b57cec5SDimitry Andric 12900b57cec5SDimitry Andric // lgamma 12910b57cec5SDimitry Andric 1292*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float lgamma(float __x) _NOEXCEPT {return __builtin_lgammaf(__x);} 1293*bdd1243dSDimitry Andric 1294*bdd1243dSDimitry Andric template <class = int> 1295*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double lgamma(double __x) _NOEXCEPT { 1296*bdd1243dSDimitry Andric return __builtin_lgamma(__x); 1297*bdd1243dSDimitry Andric } 1298*bdd1243dSDimitry Andric 1299*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double lgamma(long double __x) _NOEXCEPT {return __builtin_lgammal(__x);} 13000b57cec5SDimitry Andric 13010b57cec5SDimitry Andric template <class _A1> 1302*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 13030b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1304*bdd1243dSDimitry Andric lgamma(_A1 __x) _NOEXCEPT {return __builtin_lgamma((double)__x);} 13050b57cec5SDimitry Andric 13060b57cec5SDimitry Andric // llrint 13070b57cec5SDimitry Andric 1308*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long long llrint(float __x) _NOEXCEPT 1309fe6060f1SDimitry Andric { 1310*bdd1243dSDimitry Andric return __builtin_llrintf(__x); 1311fe6060f1SDimitry Andric } 1312*bdd1243dSDimitry Andric 1313*bdd1243dSDimitry Andric template <class = int> 1314*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI long long llrint(double __x) _NOEXCEPT { 1315*bdd1243dSDimitry Andric return __builtin_llrint(__x); 1316*bdd1243dSDimitry Andric } 1317*bdd1243dSDimitry Andric 1318*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long long llrint(long double __x) _NOEXCEPT 1319fe6060f1SDimitry Andric { 1320*bdd1243dSDimitry Andric return __builtin_llrintl(__x); 1321fe6060f1SDimitry Andric } 13220b57cec5SDimitry Andric 13230b57cec5SDimitry Andric template <class _A1> 1324*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 13250b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, long long>::type 1326*bdd1243dSDimitry Andric llrint(_A1 __x) _NOEXCEPT 1327fe6060f1SDimitry Andric { 1328*bdd1243dSDimitry Andric return __builtin_llrint((double)__x); 1329fe6060f1SDimitry Andric } 13300b57cec5SDimitry Andric 13310b57cec5SDimitry Andric // llround 13320b57cec5SDimitry Andric 1333*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long long llround(float __x) _NOEXCEPT 1334fe6060f1SDimitry Andric { 1335*bdd1243dSDimitry Andric return __builtin_llroundf(__x); 1336fe6060f1SDimitry Andric } 1337*bdd1243dSDimitry Andric 1338*bdd1243dSDimitry Andric template <class = int> 1339*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI long long llround(double __x) _NOEXCEPT { 1340*bdd1243dSDimitry Andric return __builtin_llround(__x); 1341*bdd1243dSDimitry Andric } 1342*bdd1243dSDimitry Andric 1343*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long long llround(long double __x) _NOEXCEPT 1344fe6060f1SDimitry Andric { 1345*bdd1243dSDimitry Andric return __builtin_llroundl(__x); 1346fe6060f1SDimitry Andric } 13470b57cec5SDimitry Andric 13480b57cec5SDimitry Andric template <class _A1> 1349*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 13500b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, long long>::type 1351*bdd1243dSDimitry Andric llround(_A1 __x) _NOEXCEPT 1352fe6060f1SDimitry Andric { 1353*bdd1243dSDimitry Andric return __builtin_llround((double)__x); 1354fe6060f1SDimitry Andric } 13550b57cec5SDimitry Andric 13560b57cec5SDimitry Andric // log1p 13570b57cec5SDimitry Andric 1358*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float log1p(float __x) _NOEXCEPT {return __builtin_log1pf(__x);} 1359*bdd1243dSDimitry Andric 1360*bdd1243dSDimitry Andric template <class = int> 1361*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double log1p(double __x) _NOEXCEPT { 1362*bdd1243dSDimitry Andric return __builtin_log1p(__x); 1363*bdd1243dSDimitry Andric } 1364*bdd1243dSDimitry Andric 1365*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double log1p(long double __x) _NOEXCEPT {return __builtin_log1pl(__x);} 13660b57cec5SDimitry Andric 13670b57cec5SDimitry Andric template <class _A1> 1368*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 13690b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1370*bdd1243dSDimitry Andric log1p(_A1 __x) _NOEXCEPT {return __builtin_log1p((double)__x);} 13710b57cec5SDimitry Andric 13720b57cec5SDimitry Andric // log2 13730b57cec5SDimitry Andric 1374*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float log2(float __x) _NOEXCEPT {return __builtin_log2f(__x);} 1375*bdd1243dSDimitry Andric 1376*bdd1243dSDimitry Andric template <class = int> 1377*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double log2(double __x) _NOEXCEPT { 1378*bdd1243dSDimitry Andric return __builtin_log2(__x); 1379*bdd1243dSDimitry Andric } 1380*bdd1243dSDimitry Andric 1381*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double log2(long double __x) _NOEXCEPT {return __builtin_log2l(__x);} 13820b57cec5SDimitry Andric 13830b57cec5SDimitry Andric template <class _A1> 1384*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 13850b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1386*bdd1243dSDimitry Andric log2(_A1 __x) _NOEXCEPT {return __builtin_log2((double)__x);} 13870b57cec5SDimitry Andric 13880b57cec5SDimitry Andric // logb 13890b57cec5SDimitry Andric 1390*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float logb(float __x) _NOEXCEPT {return __builtin_logbf(__x);} 1391*bdd1243dSDimitry Andric 1392*bdd1243dSDimitry Andric template <class = int> 1393*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double logb(double __x) _NOEXCEPT { 1394*bdd1243dSDimitry Andric return __builtin_logb(__x); 1395*bdd1243dSDimitry Andric } 1396*bdd1243dSDimitry Andric 1397*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double logb(long double __x) _NOEXCEPT {return __builtin_logbl(__x);} 13980b57cec5SDimitry Andric 13990b57cec5SDimitry Andric template <class _A1> 1400*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 14010b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1402*bdd1243dSDimitry Andric logb(_A1 __x) _NOEXCEPT {return __builtin_logb((double)__x);} 14030b57cec5SDimitry Andric 14040b57cec5SDimitry Andric // lrint 14050b57cec5SDimitry Andric 1406*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long lrint(float __x) _NOEXCEPT 1407fe6060f1SDimitry Andric { 1408*bdd1243dSDimitry Andric return __builtin_lrintf(__x); 1409fe6060f1SDimitry Andric } 1410*bdd1243dSDimitry Andric 1411*bdd1243dSDimitry Andric template <class = int> 1412*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI long lrint(double __x) _NOEXCEPT { 1413*bdd1243dSDimitry Andric return __builtin_lrint(__x); 1414*bdd1243dSDimitry Andric } 1415*bdd1243dSDimitry Andric 1416*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long lrint(long double __x) _NOEXCEPT 1417fe6060f1SDimitry Andric { 1418*bdd1243dSDimitry Andric return __builtin_lrintl(__x); 1419fe6060f1SDimitry Andric } 14200b57cec5SDimitry Andric 14210b57cec5SDimitry Andric template <class _A1> 1422*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 14230b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, long>::type 1424*bdd1243dSDimitry Andric lrint(_A1 __x) _NOEXCEPT 1425fe6060f1SDimitry Andric { 1426*bdd1243dSDimitry Andric return __builtin_lrint((double)__x); 1427fe6060f1SDimitry Andric } 14280b57cec5SDimitry Andric 14290b57cec5SDimitry Andric // lround 14300b57cec5SDimitry Andric 1431*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long lround(float __x) _NOEXCEPT 1432fe6060f1SDimitry Andric { 1433*bdd1243dSDimitry Andric return __builtin_lroundf(__x); 1434fe6060f1SDimitry Andric } 1435*bdd1243dSDimitry Andric 1436*bdd1243dSDimitry Andric template <class = int> 1437*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI long lround(double __x) _NOEXCEPT { 1438*bdd1243dSDimitry Andric return __builtin_lround(__x); 1439*bdd1243dSDimitry Andric } 1440*bdd1243dSDimitry Andric 1441*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long lround(long double __x) _NOEXCEPT 1442fe6060f1SDimitry Andric { 1443*bdd1243dSDimitry Andric return __builtin_lroundl(__x); 1444fe6060f1SDimitry Andric } 14450b57cec5SDimitry Andric 14460b57cec5SDimitry Andric template <class _A1> 1447*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 14480b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, long>::type 1449*bdd1243dSDimitry Andric lround(_A1 __x) _NOEXCEPT 1450fe6060f1SDimitry Andric { 1451*bdd1243dSDimitry Andric return __builtin_lround((double)__x); 1452fe6060f1SDimitry Andric } 14530b57cec5SDimitry Andric 14540b57cec5SDimitry Andric // nan 14550b57cec5SDimitry Andric 14560b57cec5SDimitry Andric // nearbyint 14570b57cec5SDimitry Andric 1458*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float nearbyint(float __x) _NOEXCEPT {return __builtin_nearbyintf(__x);} 1459*bdd1243dSDimitry Andric 1460*bdd1243dSDimitry Andric template <class = int> 1461*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double nearbyint(double __x) _NOEXCEPT { 1462*bdd1243dSDimitry Andric return __builtin_nearbyint(__x); 1463*bdd1243dSDimitry Andric } 1464*bdd1243dSDimitry Andric 1465*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double nearbyint(long double __x) _NOEXCEPT {return __builtin_nearbyintl(__x);} 14660b57cec5SDimitry Andric 14670b57cec5SDimitry Andric template <class _A1> 1468*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI 14690b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1470*bdd1243dSDimitry Andric nearbyint(_A1 __x) _NOEXCEPT {return __builtin_nearbyint((double)__x);} 14710b57cec5SDimitry Andric 14720b57cec5SDimitry Andric // nextafter 14730b57cec5SDimitry Andric 1474*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float nextafter(float __x, float __y) _NOEXCEPT {return __builtin_nextafterf(__x, __y);} 1475*bdd1243dSDimitry Andric 1476*bdd1243dSDimitry Andric template <class = int> 1477*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double nextafter(double __x, double __y) _NOEXCEPT { 1478*bdd1243dSDimitry Andric return __builtin_nextafter(__x, __y); 1479*bdd1243dSDimitry Andric } 1480*bdd1243dSDimitry Andric 1481*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double nextafter(long double __x, long double __y) _NOEXCEPT {return __builtin_nextafterl(__x, __y);} 14820b57cec5SDimitry Andric 14830b57cec5SDimitry Andric template <class _A1, class _A2> 1484*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 1485349cc55cSDimitry Andric typename std::__enable_if_t 14860b57cec5SDimitry Andric < 14870b57cec5SDimitry Andric std::is_arithmetic<_A1>::value && 14880b57cec5SDimitry Andric std::is_arithmetic<_A2>::value, 14890b57cec5SDimitry Andric std::__promote<_A1, _A2> 14900b57cec5SDimitry Andric >::type 1491*bdd1243dSDimitry Andric nextafter(_A1 __x, _A2 __y) _NOEXCEPT 14920b57cec5SDimitry Andric { 14930b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type __result_type; 14940b57cec5SDimitry Andric static_assert((!(std::_IsSame<_A1, __result_type>::value && 14950b57cec5SDimitry Andric std::_IsSame<_A2, __result_type>::value)), ""); 1496*bdd1243dSDimitry Andric return ::nextafter((__result_type)__x, (__result_type)__y); 14970b57cec5SDimitry Andric } 14980b57cec5SDimitry Andric 14990b57cec5SDimitry Andric // nexttoward 15000b57cec5SDimitry Andric 1501*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float nexttoward(float __x, long double __y) _NOEXCEPT {return __builtin_nexttowardf(__x, __y);} 1502*bdd1243dSDimitry Andric 1503*bdd1243dSDimitry Andric template <class = int> 1504*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double nexttoward(double __x, long double __y) _NOEXCEPT { 1505*bdd1243dSDimitry Andric return __builtin_nexttoward(__x, __y); 1506*bdd1243dSDimitry Andric } 1507*bdd1243dSDimitry Andric 1508*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double nexttoward(long double __x, long double __y) _NOEXCEPT {return __builtin_nexttowardl(__x, __y);} 15090b57cec5SDimitry Andric 15100b57cec5SDimitry Andric template <class _A1> 1511*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 15120b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1513*bdd1243dSDimitry Andric nexttoward(_A1 __x, long double __y) _NOEXCEPT {return __builtin_nexttoward((double)__x, __y);} 15140b57cec5SDimitry Andric 15150b57cec5SDimitry Andric // remainder 15160b57cec5SDimitry Andric 1517*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float remainder(float __x, float __y) _NOEXCEPT {return __builtin_remainderf(__x, __y);} 1518*bdd1243dSDimitry Andric 1519*bdd1243dSDimitry Andric template <class = int> 1520*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double remainder(double __x, double __y) _NOEXCEPT { 1521*bdd1243dSDimitry Andric return __builtin_remainder(__x, __y); 1522*bdd1243dSDimitry Andric } 1523*bdd1243dSDimitry Andric 1524*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double remainder(long double __x, long double __y) _NOEXCEPT {return __builtin_remainderl(__x, __y);} 15250b57cec5SDimitry Andric 15260b57cec5SDimitry Andric template <class _A1, class _A2> 1527*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 1528349cc55cSDimitry Andric typename std::__enable_if_t 15290b57cec5SDimitry Andric < 15300b57cec5SDimitry Andric std::is_arithmetic<_A1>::value && 15310b57cec5SDimitry Andric std::is_arithmetic<_A2>::value, 15320b57cec5SDimitry Andric std::__promote<_A1, _A2> 15330b57cec5SDimitry Andric >::type 1534*bdd1243dSDimitry Andric remainder(_A1 __x, _A2 __y) _NOEXCEPT 15350b57cec5SDimitry Andric { 15360b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type __result_type; 15370b57cec5SDimitry Andric static_assert((!(std::_IsSame<_A1, __result_type>::value && 15380b57cec5SDimitry Andric std::_IsSame<_A2, __result_type>::value)), ""); 1539*bdd1243dSDimitry Andric return ::remainder((__result_type)__x, (__result_type)__y); 15400b57cec5SDimitry Andric } 15410b57cec5SDimitry Andric 15420b57cec5SDimitry Andric // remquo 15430b57cec5SDimitry Andric 1544*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float remquo(float __x, float __y, int* __z) _NOEXCEPT {return __builtin_remquof(__x, __y, __z);} 1545*bdd1243dSDimitry Andric 1546*bdd1243dSDimitry Andric template <class = int> 1547*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double remquo(double __x, double __y, int* __z) _NOEXCEPT { 1548*bdd1243dSDimitry Andric return __builtin_remquo(__x, __y, __z); 1549*bdd1243dSDimitry Andric } 1550*bdd1243dSDimitry Andric 1551*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double remquo(long double __x, long double __y, int* __z) _NOEXCEPT {return __builtin_remquol(__x, __y, __z);} 15520b57cec5SDimitry Andric 15530b57cec5SDimitry Andric template <class _A1, class _A2> 1554*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 1555349cc55cSDimitry Andric typename std::__enable_if_t 15560b57cec5SDimitry Andric < 15570b57cec5SDimitry Andric std::is_arithmetic<_A1>::value && 15580b57cec5SDimitry Andric std::is_arithmetic<_A2>::value, 15590b57cec5SDimitry Andric std::__promote<_A1, _A2> 15600b57cec5SDimitry Andric >::type 1561*bdd1243dSDimitry Andric remquo(_A1 __x, _A2 __y, int* __z) _NOEXCEPT 15620b57cec5SDimitry Andric { 15630b57cec5SDimitry Andric typedef typename std::__promote<_A1, _A2>::type __result_type; 15640b57cec5SDimitry Andric static_assert((!(std::_IsSame<_A1, __result_type>::value && 15650b57cec5SDimitry Andric std::_IsSame<_A2, __result_type>::value)), ""); 1566*bdd1243dSDimitry Andric return ::remquo((__result_type)__x, (__result_type)__y, __z); 15670b57cec5SDimitry Andric } 15680b57cec5SDimitry Andric 15690b57cec5SDimitry Andric // rint 15700b57cec5SDimitry Andric 1571*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float rint(float __x) _NOEXCEPT 1572fe6060f1SDimitry Andric { 1573*bdd1243dSDimitry Andric return __builtin_rintf(__x); 1574fe6060f1SDimitry Andric } 1575*bdd1243dSDimitry Andric 1576*bdd1243dSDimitry Andric template <class = int> 1577*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double rint(double __x) _NOEXCEPT { 1578*bdd1243dSDimitry Andric return __builtin_rint(__x); 1579*bdd1243dSDimitry Andric } 1580*bdd1243dSDimitry Andric 1581*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double rint(long double __x) _NOEXCEPT 1582fe6060f1SDimitry Andric { 1583*bdd1243dSDimitry Andric return __builtin_rintl(__x); 1584fe6060f1SDimitry Andric } 15850b57cec5SDimitry Andric 15860b57cec5SDimitry Andric template <class _A1> 1587*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI 15880b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1589*bdd1243dSDimitry Andric rint(_A1 __x) _NOEXCEPT 1590fe6060f1SDimitry Andric { 1591*bdd1243dSDimitry Andric return __builtin_rint((double)__x); 1592fe6060f1SDimitry Andric } 15930b57cec5SDimitry Andric 15940b57cec5SDimitry Andric // round 15950b57cec5SDimitry Andric 1596*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float round(float __x) _NOEXCEPT 1597fe6060f1SDimitry Andric { 1598*bdd1243dSDimitry Andric return __builtin_round(__x); 1599fe6060f1SDimitry Andric } 1600*bdd1243dSDimitry Andric 1601*bdd1243dSDimitry Andric template <class = int> 1602*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double round(double __x) _NOEXCEPT { 1603*bdd1243dSDimitry Andric return __builtin_round(__x); 1604*bdd1243dSDimitry Andric } 1605*bdd1243dSDimitry Andric 1606*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double round(long double __x) _NOEXCEPT 1607fe6060f1SDimitry Andric { 1608*bdd1243dSDimitry Andric return __builtin_roundl(__x); 1609fe6060f1SDimitry Andric } 16100b57cec5SDimitry Andric 16110b57cec5SDimitry Andric template <class _A1> 1612*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI 16130b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1614*bdd1243dSDimitry Andric round(_A1 __x) _NOEXCEPT 1615fe6060f1SDimitry Andric { 1616*bdd1243dSDimitry Andric return __builtin_round((double)__x); 1617fe6060f1SDimitry Andric } 16180b57cec5SDimitry Andric 16190b57cec5SDimitry Andric // scalbln 16200b57cec5SDimitry Andric 1621*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float scalbln(float __x, long __y) _NOEXCEPT {return __builtin_scalblnf(__x, __y);} 1622*bdd1243dSDimitry Andric 1623*bdd1243dSDimitry Andric template <class = int> 1624*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double scalbln(double __x, long __y) _NOEXCEPT { 1625*bdd1243dSDimitry Andric return __builtin_scalbln(__x, __y); 1626*bdd1243dSDimitry Andric } 1627*bdd1243dSDimitry Andric 1628*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double scalbln(long double __x, long __y) _NOEXCEPT {return __builtin_scalblnl(__x, __y);} 16290b57cec5SDimitry Andric 16300b57cec5SDimitry Andric template <class _A1> 1631*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 16320b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1633*bdd1243dSDimitry Andric scalbln(_A1 __x, long __y) _NOEXCEPT {return __builtin_scalbln((double)__x, __y);} 16340b57cec5SDimitry Andric 16350b57cec5SDimitry Andric // scalbn 16360b57cec5SDimitry Andric 1637*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float scalbn(float __x, int __y) _NOEXCEPT {return __builtin_scalbnf(__x, __y);} 1638*bdd1243dSDimitry Andric 1639*bdd1243dSDimitry Andric template <class = int> 1640*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double scalbn(double __x, int __y) _NOEXCEPT { 1641*bdd1243dSDimitry Andric return __builtin_scalbn(__x, __y); 1642*bdd1243dSDimitry Andric } 1643*bdd1243dSDimitry Andric 1644*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double scalbn(long double __x, int __y) _NOEXCEPT {return __builtin_scalbnl(__x, __y);} 16450b57cec5SDimitry Andric 16460b57cec5SDimitry Andric template <class _A1> 1647*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 16480b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1649*bdd1243dSDimitry Andric scalbn(_A1 __x, int __y) _NOEXCEPT {return __builtin_scalbn((double)__x, __y);} 16500b57cec5SDimitry Andric 16510b57cec5SDimitry Andric // tgamma 16520b57cec5SDimitry Andric 1653*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float tgamma(float __x) _NOEXCEPT {return __builtin_tgammaf(__x);} 1654*bdd1243dSDimitry Andric 1655*bdd1243dSDimitry Andric template <class = int> 1656*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double tgamma(double __x) _NOEXCEPT { 1657*bdd1243dSDimitry Andric return __builtin_tgamma(__x); 1658*bdd1243dSDimitry Andric } 1659*bdd1243dSDimitry Andric 1660*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double tgamma(long double __x) _NOEXCEPT {return __builtin_tgammal(__x);} 16610b57cec5SDimitry Andric 16620b57cec5SDimitry Andric template <class _A1> 1663*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 16640b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1665*bdd1243dSDimitry Andric tgamma(_A1 __x) _NOEXCEPT {return __builtin_tgamma((double)__x);} 16660b57cec5SDimitry Andric 16670b57cec5SDimitry Andric // trunc 16680b57cec5SDimitry Andric 1669*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float trunc(float __x) _NOEXCEPT 1670fe6060f1SDimitry Andric { 1671*bdd1243dSDimitry Andric return __builtin_trunc(__x); 1672fe6060f1SDimitry Andric } 1673*bdd1243dSDimitry Andric 1674*bdd1243dSDimitry Andric template <class = int> 1675*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double trunc(double __x) _NOEXCEPT { 1676*bdd1243dSDimitry Andric return __builtin_trunc(__x); 1677*bdd1243dSDimitry Andric } 1678*bdd1243dSDimitry Andric 1679*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double trunc(long double __x) _NOEXCEPT 1680fe6060f1SDimitry Andric { 1681*bdd1243dSDimitry Andric return __builtin_truncl(__x); 1682fe6060f1SDimitry Andric } 16830b57cec5SDimitry Andric 16840b57cec5SDimitry Andric template <class _A1> 1685*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI 16860b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type 1687*bdd1243dSDimitry Andric trunc(_A1 __x) _NOEXCEPT 1688fe6060f1SDimitry Andric { 1689*bdd1243dSDimitry Andric return __builtin_trunc((double)__x); 1690fe6060f1SDimitry Andric } 16910b57cec5SDimitry Andric 16920b57cec5SDimitry Andric } // extern "C++" 16930b57cec5SDimitry Andric 16940b57cec5SDimitry Andric #endif // __cplusplus 16950b57cec5SDimitry Andric 16960b57cec5SDimitry Andric #else // _LIBCPP_MATH_H 16970b57cec5SDimitry Andric 16980b57cec5SDimitry Andric // This include lives outside the header guard in order to support an MSVC 16990b57cec5SDimitry Andric // extension which allows users to do: 17000b57cec5SDimitry Andric // 17010b57cec5SDimitry Andric // #define _USE_MATH_DEFINES 17020b57cec5SDimitry Andric // #include <math.h> 17030b57cec5SDimitry Andric // 17040b57cec5SDimitry Andric // and receive the definitions of mathematical constants, even if <math.h> 17050b57cec5SDimitry Andric // has previously been included. 17060b57cec5SDimitry Andric #if defined(_LIBCPP_MSVCRT) && defined(_USE_MATH_DEFINES) 17070b57cec5SDimitry Andric #include_next <math.h> 17080b57cec5SDimitry Andric #endif 17090b57cec5SDimitry Andric 17100b57cec5SDimitry Andric #endif // _LIBCPP_MATH_H 1711