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_CMATH 110b57cec5SDimitry Andric#define _LIBCPP_CMATH 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric/* 140b57cec5SDimitry Andric cmath synopsis 150b57cec5SDimitry Andric 160b57cec5SDimitry AndricMacros: 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 Andricnamespace std 380b57cec5SDimitry Andric{ 390b57cec5SDimitry Andric 400b57cec5SDimitry AndricTypes: 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric float_t // C99 430b57cec5SDimitry Andric double_t // C99 440b57cec5SDimitry Andric 450b57cec5SDimitry Andric// C90 460b57cec5SDimitry Andric 470b57cec5SDimitry Andricfloating_point abs(floating_point x); 480b57cec5SDimitry Andric 490b57cec5SDimitry Andricfloating_point acos (arithmetic x); 500b57cec5SDimitry Andricfloat acosf(float x); 510b57cec5SDimitry Andriclong double acosl(long double x); 520b57cec5SDimitry Andric 530b57cec5SDimitry Andricfloating_point asin (arithmetic x); 540b57cec5SDimitry Andricfloat asinf(float x); 550b57cec5SDimitry Andriclong double asinl(long double x); 560b57cec5SDimitry Andric 570b57cec5SDimitry Andricfloating_point atan (arithmetic x); 580b57cec5SDimitry Andricfloat atanf(float x); 590b57cec5SDimitry Andriclong double atanl(long double x); 600b57cec5SDimitry Andric 610b57cec5SDimitry Andricfloating_point atan2 (arithmetic y, arithmetic x); 620b57cec5SDimitry Andricfloat atan2f(float y, float x); 630b57cec5SDimitry Andriclong double atan2l(long double y, long double x); 640b57cec5SDimitry Andric 650b57cec5SDimitry Andricfloating_point ceil (arithmetic x); 660b57cec5SDimitry Andricfloat ceilf(float x); 670b57cec5SDimitry Andriclong double ceill(long double x); 680b57cec5SDimitry Andric 690b57cec5SDimitry Andricfloating_point cos (arithmetic x); 700b57cec5SDimitry Andricfloat cosf(float x); 710b57cec5SDimitry Andriclong double cosl(long double x); 720b57cec5SDimitry Andric 730b57cec5SDimitry Andricfloating_point cosh (arithmetic x); 740b57cec5SDimitry Andricfloat coshf(float x); 750b57cec5SDimitry Andriclong double coshl(long double x); 760b57cec5SDimitry Andric 770b57cec5SDimitry Andricfloating_point exp (arithmetic x); 780b57cec5SDimitry Andricfloat expf(float x); 790b57cec5SDimitry Andriclong double expl(long double x); 800b57cec5SDimitry Andric 810b57cec5SDimitry Andricfloating_point fabs (arithmetic x); 820b57cec5SDimitry Andricfloat fabsf(float x); 830b57cec5SDimitry Andriclong double fabsl(long double x); 840b57cec5SDimitry Andric 850b57cec5SDimitry Andricfloating_point floor (arithmetic x); 860b57cec5SDimitry Andricfloat floorf(float x); 870b57cec5SDimitry Andriclong double floorl(long double x); 880b57cec5SDimitry Andric 890b57cec5SDimitry Andricfloating_point fmod (arithmetic x, arithmetic y); 900b57cec5SDimitry Andricfloat fmodf(float x, float y); 910b57cec5SDimitry Andriclong double fmodl(long double x, long double y); 920b57cec5SDimitry Andric 930b57cec5SDimitry Andricfloating_point frexp (arithmetic value, int* exp); 940b57cec5SDimitry Andricfloat frexpf(float value, int* exp); 950b57cec5SDimitry Andriclong double frexpl(long double value, int* exp); 960b57cec5SDimitry Andric 970b57cec5SDimitry Andricfloating_point ldexp (arithmetic value, int exp); 980b57cec5SDimitry Andricfloat ldexpf(float value, int exp); 990b57cec5SDimitry Andriclong double ldexpl(long double value, int exp); 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andricfloating_point log (arithmetic x); 1020b57cec5SDimitry Andricfloat logf(float x); 1030b57cec5SDimitry Andriclong double logl(long double x); 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andricfloating_point log10 (arithmetic x); 1060b57cec5SDimitry Andricfloat log10f(float x); 1070b57cec5SDimitry Andriclong double log10l(long double x); 1080b57cec5SDimitry Andric 1090b57cec5SDimitry Andricfloating_point modf (floating_point value, floating_point* iptr); 1100b57cec5SDimitry Andricfloat modff(float value, float* iptr); 1110b57cec5SDimitry Andriclong double modfl(long double value, long double* iptr); 1120b57cec5SDimitry Andric 1130b57cec5SDimitry Andricfloating_point pow (arithmetic x, arithmetic y); 1140b57cec5SDimitry Andricfloat powf(float x, float y); 1150b57cec5SDimitry Andriclong double powl(long double x, long double y); 1160b57cec5SDimitry Andric 1170b57cec5SDimitry Andricfloating_point sin (arithmetic x); 1180b57cec5SDimitry Andricfloat sinf(float x); 1190b57cec5SDimitry Andriclong double sinl(long double x); 1200b57cec5SDimitry Andric 1210b57cec5SDimitry Andricfloating_point sinh (arithmetic x); 1220b57cec5SDimitry Andricfloat sinhf(float x); 1230b57cec5SDimitry Andriclong double sinhl(long double x); 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andricfloating_point sqrt (arithmetic x); 1260b57cec5SDimitry Andricfloat sqrtf(float x); 1270b57cec5SDimitry Andriclong double sqrtl(long double x); 1280b57cec5SDimitry Andric 1290b57cec5SDimitry Andricfloating_point tan (arithmetic x); 1300b57cec5SDimitry Andricfloat tanf(float x); 1310b57cec5SDimitry Andriclong double tanl(long double x); 1320b57cec5SDimitry Andric 1330b57cec5SDimitry Andricfloating_point tanh (arithmetic x); 1340b57cec5SDimitry Andricfloat tanhf(float x); 1350b57cec5SDimitry Andriclong double tanhl(long double x); 1360b57cec5SDimitry Andric 1370b57cec5SDimitry Andric// C99 1380b57cec5SDimitry Andric 1390b57cec5SDimitry Andricbool signbit(arithmetic x); 1400b57cec5SDimitry Andric 1410b57cec5SDimitry Andricint fpclassify(arithmetic x); 1420b57cec5SDimitry Andric 1430b57cec5SDimitry Andricbool isfinite(arithmetic x); 1440b57cec5SDimitry Andricbool isinf(arithmetic x); 1450b57cec5SDimitry Andricbool isnan(arithmetic x); 1460b57cec5SDimitry Andricbool isnormal(arithmetic x); 1470b57cec5SDimitry Andric 1480b57cec5SDimitry Andricbool isgreater(arithmetic x, arithmetic y); 1490b57cec5SDimitry Andricbool isgreaterequal(arithmetic x, arithmetic y); 1500b57cec5SDimitry Andricbool isless(arithmetic x, arithmetic y); 1510b57cec5SDimitry Andricbool islessequal(arithmetic x, arithmetic y); 1520b57cec5SDimitry Andricbool islessgreater(arithmetic x, arithmetic y); 1530b57cec5SDimitry Andricbool isunordered(arithmetic x, arithmetic y); 1540b57cec5SDimitry Andric 1550b57cec5SDimitry Andricfloating_point acosh (arithmetic x); 1560b57cec5SDimitry Andricfloat acoshf(float x); 1570b57cec5SDimitry Andriclong double acoshl(long double x); 1580b57cec5SDimitry Andric 1590b57cec5SDimitry Andricfloating_point asinh (arithmetic x); 1600b57cec5SDimitry Andricfloat asinhf(float x); 1610b57cec5SDimitry Andriclong double asinhl(long double x); 1620b57cec5SDimitry Andric 1630b57cec5SDimitry Andricfloating_point atanh (arithmetic x); 1640b57cec5SDimitry Andricfloat atanhf(float x); 1650b57cec5SDimitry Andriclong double atanhl(long double x); 1660b57cec5SDimitry Andric 1670b57cec5SDimitry Andricfloating_point cbrt (arithmetic x); 1680b57cec5SDimitry Andricfloat cbrtf(float x); 1690b57cec5SDimitry Andriclong double cbrtl(long double x); 1700b57cec5SDimitry Andric 1710b57cec5SDimitry Andricfloating_point copysign (arithmetic x, arithmetic y); 1720b57cec5SDimitry Andricfloat copysignf(float x, float y); 1730b57cec5SDimitry Andriclong double copysignl(long double x, long double y); 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andricfloating_point erf (arithmetic x); 1760b57cec5SDimitry Andricfloat erff(float x); 1770b57cec5SDimitry Andriclong double erfl(long double x); 1780b57cec5SDimitry Andric 1790b57cec5SDimitry Andricfloating_point erfc (arithmetic x); 1800b57cec5SDimitry Andricfloat erfcf(float x); 1810b57cec5SDimitry Andriclong double erfcl(long double x); 1820b57cec5SDimitry Andric 1830b57cec5SDimitry Andricfloating_point exp2 (arithmetic x); 1840b57cec5SDimitry Andricfloat exp2f(float x); 1850b57cec5SDimitry Andriclong double exp2l(long double x); 1860b57cec5SDimitry Andric 1870b57cec5SDimitry Andricfloating_point expm1 (arithmetic x); 1880b57cec5SDimitry Andricfloat expm1f(float x); 1890b57cec5SDimitry Andriclong double expm1l(long double x); 1900b57cec5SDimitry Andric 1910b57cec5SDimitry Andricfloating_point fdim (arithmetic x, arithmetic y); 1920b57cec5SDimitry Andricfloat fdimf(float x, float y); 1930b57cec5SDimitry Andriclong double fdiml(long double x, long double y); 1940b57cec5SDimitry Andric 1950b57cec5SDimitry Andricfloating_point fma (arithmetic x, arithmetic y, arithmetic z); 1960b57cec5SDimitry Andricfloat fmaf(float x, float y, float z); 1970b57cec5SDimitry Andriclong double fmal(long double x, long double y, long double z); 1980b57cec5SDimitry Andric 1990b57cec5SDimitry Andricfloating_point fmax (arithmetic x, arithmetic y); 2000b57cec5SDimitry Andricfloat fmaxf(float x, float y); 2010b57cec5SDimitry Andriclong double fmaxl(long double x, long double y); 2020b57cec5SDimitry Andric 2030b57cec5SDimitry Andricfloating_point fmin (arithmetic x, arithmetic y); 2040b57cec5SDimitry Andricfloat fminf(float x, float y); 2050b57cec5SDimitry Andriclong double fminl(long double x, long double y); 2060b57cec5SDimitry Andric 2070b57cec5SDimitry Andricfloating_point hypot (arithmetic x, arithmetic y); 2080b57cec5SDimitry Andricfloat hypotf(float x, float y); 2090b57cec5SDimitry Andriclong double hypotl(long double x, long double y); 2100b57cec5SDimitry Andric 2110b57cec5SDimitry Andricdouble hypot(double x, double y, double z); // C++17 2120b57cec5SDimitry Andricfloat hypot(float x, float y, float z); // C++17 2130b57cec5SDimitry Andriclong double hypot(long double x, long double y, long double z); // C++17 2140b57cec5SDimitry Andric 2150b57cec5SDimitry Andricint ilogb (arithmetic x); 2160b57cec5SDimitry Andricint ilogbf(float x); 2170b57cec5SDimitry Andricint ilogbl(long double x); 2180b57cec5SDimitry Andric 2190b57cec5SDimitry Andricfloating_point lgamma (arithmetic x); 2200b57cec5SDimitry Andricfloat lgammaf(float x); 2210b57cec5SDimitry Andriclong double lgammal(long double x); 2220b57cec5SDimitry Andric 2230b57cec5SDimitry Andriclong long llrint (arithmetic x); 2240b57cec5SDimitry Andriclong long llrintf(float x); 2250b57cec5SDimitry Andriclong long llrintl(long double x); 2260b57cec5SDimitry Andric 2270b57cec5SDimitry Andriclong long llround (arithmetic x); 2280b57cec5SDimitry Andriclong long llroundf(float x); 2290b57cec5SDimitry Andriclong long llroundl(long double x); 2300b57cec5SDimitry Andric 2310b57cec5SDimitry Andricfloating_point log1p (arithmetic x); 2320b57cec5SDimitry Andricfloat log1pf(float x); 2330b57cec5SDimitry Andriclong double log1pl(long double x); 2340b57cec5SDimitry Andric 2350b57cec5SDimitry Andricfloating_point log2 (arithmetic x); 2360b57cec5SDimitry Andricfloat log2f(float x); 2370b57cec5SDimitry Andriclong double log2l(long double x); 2380b57cec5SDimitry Andric 2390b57cec5SDimitry Andricfloating_point logb (arithmetic x); 2400b57cec5SDimitry Andricfloat logbf(float x); 2410b57cec5SDimitry Andriclong double logbl(long double x); 2420b57cec5SDimitry Andric 2430b57cec5SDimitry Andriclong lrint (arithmetic x); 2440b57cec5SDimitry Andriclong lrintf(float x); 2450b57cec5SDimitry Andriclong lrintl(long double x); 2460b57cec5SDimitry Andric 2470b57cec5SDimitry Andriclong lround (arithmetic x); 2480b57cec5SDimitry Andriclong lroundf(float x); 2490b57cec5SDimitry Andriclong lroundl(long double x); 2500b57cec5SDimitry Andric 2510b57cec5SDimitry Andricdouble nan (const char* str); 2520b57cec5SDimitry Andricfloat nanf(const char* str); 2530b57cec5SDimitry Andriclong double nanl(const char* str); 2540b57cec5SDimitry Andric 2550b57cec5SDimitry Andricfloating_point nearbyint (arithmetic x); 2560b57cec5SDimitry Andricfloat nearbyintf(float x); 2570b57cec5SDimitry Andriclong double nearbyintl(long double x); 2580b57cec5SDimitry Andric 2590b57cec5SDimitry Andricfloating_point nextafter (arithmetic x, arithmetic y); 2600b57cec5SDimitry Andricfloat nextafterf(float x, float y); 2610b57cec5SDimitry Andriclong double nextafterl(long double x, long double y); 2620b57cec5SDimitry Andric 2630b57cec5SDimitry Andricfloating_point nexttoward (arithmetic x, long double y); 2640b57cec5SDimitry Andricfloat nexttowardf(float x, long double y); 2650b57cec5SDimitry Andriclong double nexttowardl(long double x, long double y); 2660b57cec5SDimitry Andric 2670b57cec5SDimitry Andricfloating_point remainder (arithmetic x, arithmetic y); 2680b57cec5SDimitry Andricfloat remainderf(float x, float y); 2690b57cec5SDimitry Andriclong double remainderl(long double x, long double y); 2700b57cec5SDimitry Andric 2710b57cec5SDimitry Andricfloating_point remquo (arithmetic x, arithmetic y, int* pquo); 2720b57cec5SDimitry Andricfloat remquof(float x, float y, int* pquo); 2730b57cec5SDimitry Andriclong double remquol(long double x, long double y, int* pquo); 2740b57cec5SDimitry Andric 2750b57cec5SDimitry Andricfloating_point rint (arithmetic x); 2760b57cec5SDimitry Andricfloat rintf(float x); 2770b57cec5SDimitry Andriclong double rintl(long double x); 2780b57cec5SDimitry Andric 2790b57cec5SDimitry Andricfloating_point round (arithmetic x); 2800b57cec5SDimitry Andricfloat roundf(float x); 2810b57cec5SDimitry Andriclong double roundl(long double x); 2820b57cec5SDimitry Andric 2830b57cec5SDimitry Andricfloating_point scalbln (arithmetic x, long ex); 2840b57cec5SDimitry Andricfloat scalblnf(float x, long ex); 2850b57cec5SDimitry Andriclong double scalblnl(long double x, long ex); 2860b57cec5SDimitry Andric 2870b57cec5SDimitry Andricfloating_point scalbn (arithmetic x, int ex); 2880b57cec5SDimitry Andricfloat scalbnf(float x, int ex); 2890b57cec5SDimitry Andriclong double scalbnl(long double x, int ex); 2900b57cec5SDimitry Andric 2910b57cec5SDimitry Andricfloating_point tgamma (arithmetic x); 2920b57cec5SDimitry Andricfloat tgammaf(float x); 2930b57cec5SDimitry Andriclong double tgammal(long double x); 2940b57cec5SDimitry Andric 2950b57cec5SDimitry Andricfloating_point trunc (arithmetic x); 2960b57cec5SDimitry Andricfloat truncf(float x); 2970b57cec5SDimitry Andriclong double truncl(long double x); 2980b57cec5SDimitry Andric 2995ffd83dbSDimitry Andricconstexpr float lerp(float a, float b, float t) noexcept; // C++20 3005ffd83dbSDimitry Andricconstexpr double lerp(double a, double b, double t) noexcept; // C++20 3015ffd83dbSDimitry Andricconstexpr long double lerp(long double a, long double b, long double t) noexcept; // C++20 3025ffd83dbSDimitry Andric 3030b57cec5SDimitry Andric} // std 3040b57cec5SDimitry Andric 3050b57cec5SDimitry Andric*/ 3060b57cec5SDimitry Andric 30781ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler 3080b57cec5SDimitry Andric#include <__config> 309*bdd1243dSDimitry Andric#include <__type_traits/enable_if.h> 310*bdd1243dSDimitry Andric#include <__type_traits/is_arithmetic.h> 311*bdd1243dSDimitry Andric#include <__type_traits/is_constant_evaluated.h> 312*bdd1243dSDimitry Andric#include <__type_traits/is_floating_point.h> 313*bdd1243dSDimitry Andric#include <__type_traits/is_same.h> 314*bdd1243dSDimitry Andric#include <__type_traits/remove_cv.h> 31504eeddc0SDimitry Andric#include <version> 3160b57cec5SDimitry Andric 317*bdd1243dSDimitry Andric#include <math.h> 318*bdd1243dSDimitry Andric 319*bdd1243dSDimitry Andric#ifndef _LIBCPP_MATH_H 320*bdd1243dSDimitry Andric# error <cmath> tried including <math.h> but didn't find libc++'s <math.h> header. \ 321*bdd1243dSDimitry Andric This usually means that your header search paths are not configured properly. \ 322*bdd1243dSDimitry Andric The header search paths should contain the C++ Standard Library headers before \ 323*bdd1243dSDimitry Andric any C Standard Library, and you are probably using compiler flags that make that \ 324*bdd1243dSDimitry Andric not be the case. 325*bdd1243dSDimitry Andric#endif 326*bdd1243dSDimitry Andric 3270b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 3280b57cec5SDimitry Andric# pragma GCC system_header 3290b57cec5SDimitry Andric#endif 3300b57cec5SDimitry Andric 3310b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS 3320b57cec5SDimitry Andric#include <__undef_macros> 3330b57cec5SDimitry Andric 3340b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 3350b57cec5SDimitry Andric 336fe6060f1SDimitry Andricusing ::signbit _LIBCPP_USING_IF_EXISTS; 337fe6060f1SDimitry Andricusing ::fpclassify _LIBCPP_USING_IF_EXISTS; 338fe6060f1SDimitry Andricusing ::isfinite _LIBCPP_USING_IF_EXISTS; 339fe6060f1SDimitry Andricusing ::isinf _LIBCPP_USING_IF_EXISTS; 340fe6060f1SDimitry Andricusing ::isnan _LIBCPP_USING_IF_EXISTS; 341fe6060f1SDimitry Andricusing ::isnormal _LIBCPP_USING_IF_EXISTS; 342fe6060f1SDimitry Andricusing ::isgreater _LIBCPP_USING_IF_EXISTS; 343fe6060f1SDimitry Andricusing ::isgreaterequal _LIBCPP_USING_IF_EXISTS; 344fe6060f1SDimitry Andricusing ::isless _LIBCPP_USING_IF_EXISTS; 345fe6060f1SDimitry Andricusing ::islessequal _LIBCPP_USING_IF_EXISTS; 346fe6060f1SDimitry Andricusing ::islessgreater _LIBCPP_USING_IF_EXISTS; 347fe6060f1SDimitry Andricusing ::isunordered _LIBCPP_USING_IF_EXISTS; 348fe6060f1SDimitry Andricusing ::isunordered _LIBCPP_USING_IF_EXISTS; 3490b57cec5SDimitry Andric 350fe6060f1SDimitry Andricusing ::float_t _LIBCPP_USING_IF_EXISTS; 351fe6060f1SDimitry Andricusing ::double_t _LIBCPP_USING_IF_EXISTS; 3520b57cec5SDimitry Andric 353fe6060f1SDimitry Andricusing ::abs _LIBCPP_USING_IF_EXISTS; 3540b57cec5SDimitry Andric 355fe6060f1SDimitry Andricusing ::acos _LIBCPP_USING_IF_EXISTS; 356fe6060f1SDimitry Andricusing ::acosf _LIBCPP_USING_IF_EXISTS; 357fe6060f1SDimitry Andricusing ::asin _LIBCPP_USING_IF_EXISTS; 358fe6060f1SDimitry Andricusing ::asinf _LIBCPP_USING_IF_EXISTS; 359fe6060f1SDimitry Andricusing ::atan _LIBCPP_USING_IF_EXISTS; 360fe6060f1SDimitry Andricusing ::atanf _LIBCPP_USING_IF_EXISTS; 361fe6060f1SDimitry Andricusing ::atan2 _LIBCPP_USING_IF_EXISTS; 362fe6060f1SDimitry Andricusing ::atan2f _LIBCPP_USING_IF_EXISTS; 363fe6060f1SDimitry Andricusing ::ceil _LIBCPP_USING_IF_EXISTS; 364fe6060f1SDimitry Andricusing ::ceilf _LIBCPP_USING_IF_EXISTS; 365fe6060f1SDimitry Andricusing ::cos _LIBCPP_USING_IF_EXISTS; 366fe6060f1SDimitry Andricusing ::cosf _LIBCPP_USING_IF_EXISTS; 367fe6060f1SDimitry Andricusing ::cosh _LIBCPP_USING_IF_EXISTS; 368fe6060f1SDimitry Andricusing ::coshf _LIBCPP_USING_IF_EXISTS; 3690b57cec5SDimitry Andric 370fe6060f1SDimitry Andricusing ::exp _LIBCPP_USING_IF_EXISTS; 371fe6060f1SDimitry Andricusing ::expf _LIBCPP_USING_IF_EXISTS; 3720b57cec5SDimitry Andric 373fe6060f1SDimitry Andricusing ::fabs _LIBCPP_USING_IF_EXISTS; 374fe6060f1SDimitry Andricusing ::fabsf _LIBCPP_USING_IF_EXISTS; 375fe6060f1SDimitry Andricusing ::floor _LIBCPP_USING_IF_EXISTS; 376fe6060f1SDimitry Andricusing ::floorf _LIBCPP_USING_IF_EXISTS; 3770b57cec5SDimitry Andric 378fe6060f1SDimitry Andricusing ::fmod _LIBCPP_USING_IF_EXISTS; 379fe6060f1SDimitry Andricusing ::fmodf _LIBCPP_USING_IF_EXISTS; 3800b57cec5SDimitry Andric 381fe6060f1SDimitry Andricusing ::frexp _LIBCPP_USING_IF_EXISTS; 382fe6060f1SDimitry Andricusing ::frexpf _LIBCPP_USING_IF_EXISTS; 383fe6060f1SDimitry Andricusing ::ldexp _LIBCPP_USING_IF_EXISTS; 384fe6060f1SDimitry Andricusing ::ldexpf _LIBCPP_USING_IF_EXISTS; 3850b57cec5SDimitry Andric 386fe6060f1SDimitry Andricusing ::log _LIBCPP_USING_IF_EXISTS; 387fe6060f1SDimitry Andricusing ::logf _LIBCPP_USING_IF_EXISTS; 3880b57cec5SDimitry Andric 389fe6060f1SDimitry Andricusing ::log10 _LIBCPP_USING_IF_EXISTS; 390fe6060f1SDimitry Andricusing ::log10f _LIBCPP_USING_IF_EXISTS; 391fe6060f1SDimitry Andricusing ::modf _LIBCPP_USING_IF_EXISTS; 392fe6060f1SDimitry Andricusing ::modff _LIBCPP_USING_IF_EXISTS; 3930b57cec5SDimitry Andric 394fe6060f1SDimitry Andricusing ::pow _LIBCPP_USING_IF_EXISTS; 395fe6060f1SDimitry Andricusing ::powf _LIBCPP_USING_IF_EXISTS; 3960b57cec5SDimitry Andric 397fe6060f1SDimitry Andricusing ::sin _LIBCPP_USING_IF_EXISTS; 398fe6060f1SDimitry Andricusing ::sinf _LIBCPP_USING_IF_EXISTS; 399fe6060f1SDimitry Andricusing ::sinh _LIBCPP_USING_IF_EXISTS; 400fe6060f1SDimitry Andricusing ::sinhf _LIBCPP_USING_IF_EXISTS; 4010b57cec5SDimitry Andric 402fe6060f1SDimitry Andricusing ::sqrt _LIBCPP_USING_IF_EXISTS; 403fe6060f1SDimitry Andricusing ::sqrtf _LIBCPP_USING_IF_EXISTS; 404fe6060f1SDimitry Andricusing ::tan _LIBCPP_USING_IF_EXISTS; 405fe6060f1SDimitry Andricusing ::tanf _LIBCPP_USING_IF_EXISTS; 4060b57cec5SDimitry Andric 407fe6060f1SDimitry Andricusing ::tanh _LIBCPP_USING_IF_EXISTS; 408fe6060f1SDimitry Andricusing ::tanhf _LIBCPP_USING_IF_EXISTS; 4090b57cec5SDimitry Andric 410fe6060f1SDimitry Andricusing ::acosh _LIBCPP_USING_IF_EXISTS; 411fe6060f1SDimitry Andricusing ::acoshf _LIBCPP_USING_IF_EXISTS; 412fe6060f1SDimitry Andricusing ::asinh _LIBCPP_USING_IF_EXISTS; 413fe6060f1SDimitry Andricusing ::asinhf _LIBCPP_USING_IF_EXISTS; 414fe6060f1SDimitry Andricusing ::atanh _LIBCPP_USING_IF_EXISTS; 415fe6060f1SDimitry Andricusing ::atanhf _LIBCPP_USING_IF_EXISTS; 416fe6060f1SDimitry Andricusing ::cbrt _LIBCPP_USING_IF_EXISTS; 417fe6060f1SDimitry Andricusing ::cbrtf _LIBCPP_USING_IF_EXISTS; 4180b57cec5SDimitry Andric 419fe6060f1SDimitry Andricusing ::copysign _LIBCPP_USING_IF_EXISTS; 420fe6060f1SDimitry Andricusing ::copysignf _LIBCPP_USING_IF_EXISTS; 4210b57cec5SDimitry Andric 422fe6060f1SDimitry Andricusing ::erf _LIBCPP_USING_IF_EXISTS; 423fe6060f1SDimitry Andricusing ::erff _LIBCPP_USING_IF_EXISTS; 424fe6060f1SDimitry Andricusing ::erfc _LIBCPP_USING_IF_EXISTS; 425fe6060f1SDimitry Andricusing ::erfcf _LIBCPP_USING_IF_EXISTS; 426fe6060f1SDimitry Andricusing ::exp2 _LIBCPP_USING_IF_EXISTS; 427fe6060f1SDimitry Andricusing ::exp2f _LIBCPP_USING_IF_EXISTS; 428fe6060f1SDimitry Andricusing ::expm1 _LIBCPP_USING_IF_EXISTS; 429fe6060f1SDimitry Andricusing ::expm1f _LIBCPP_USING_IF_EXISTS; 430fe6060f1SDimitry Andricusing ::fdim _LIBCPP_USING_IF_EXISTS; 431fe6060f1SDimitry Andricusing ::fdimf _LIBCPP_USING_IF_EXISTS; 432fe6060f1SDimitry Andricusing ::fmaf _LIBCPP_USING_IF_EXISTS; 433fe6060f1SDimitry Andricusing ::fma _LIBCPP_USING_IF_EXISTS; 434fe6060f1SDimitry Andricusing ::fmax _LIBCPP_USING_IF_EXISTS; 435fe6060f1SDimitry Andricusing ::fmaxf _LIBCPP_USING_IF_EXISTS; 436fe6060f1SDimitry Andricusing ::fmin _LIBCPP_USING_IF_EXISTS; 437fe6060f1SDimitry Andricusing ::fminf _LIBCPP_USING_IF_EXISTS; 438fe6060f1SDimitry Andricusing ::hypot _LIBCPP_USING_IF_EXISTS; 439fe6060f1SDimitry Andricusing ::hypotf _LIBCPP_USING_IF_EXISTS; 440fe6060f1SDimitry Andricusing ::ilogb _LIBCPP_USING_IF_EXISTS; 441fe6060f1SDimitry Andricusing ::ilogbf _LIBCPP_USING_IF_EXISTS; 442fe6060f1SDimitry Andricusing ::lgamma _LIBCPP_USING_IF_EXISTS; 443fe6060f1SDimitry Andricusing ::lgammaf _LIBCPP_USING_IF_EXISTS; 444fe6060f1SDimitry Andricusing ::llrint _LIBCPP_USING_IF_EXISTS; 445fe6060f1SDimitry Andricusing ::llrintf _LIBCPP_USING_IF_EXISTS; 446fe6060f1SDimitry Andricusing ::llround _LIBCPP_USING_IF_EXISTS; 447fe6060f1SDimitry Andricusing ::llroundf _LIBCPP_USING_IF_EXISTS; 448fe6060f1SDimitry Andricusing ::log1p _LIBCPP_USING_IF_EXISTS; 449fe6060f1SDimitry Andricusing ::log1pf _LIBCPP_USING_IF_EXISTS; 450fe6060f1SDimitry Andricusing ::log2 _LIBCPP_USING_IF_EXISTS; 451fe6060f1SDimitry Andricusing ::log2f _LIBCPP_USING_IF_EXISTS; 452fe6060f1SDimitry Andricusing ::logb _LIBCPP_USING_IF_EXISTS; 453fe6060f1SDimitry Andricusing ::logbf _LIBCPP_USING_IF_EXISTS; 454fe6060f1SDimitry Andricusing ::lrint _LIBCPP_USING_IF_EXISTS; 455fe6060f1SDimitry Andricusing ::lrintf _LIBCPP_USING_IF_EXISTS; 456fe6060f1SDimitry Andricusing ::lround _LIBCPP_USING_IF_EXISTS; 457fe6060f1SDimitry Andricusing ::lroundf _LIBCPP_USING_IF_EXISTS; 4580b57cec5SDimitry Andric 459fe6060f1SDimitry Andricusing ::nan _LIBCPP_USING_IF_EXISTS; 460fe6060f1SDimitry Andricusing ::nanf _LIBCPP_USING_IF_EXISTS; 4610b57cec5SDimitry Andric 462fe6060f1SDimitry Andricusing ::nearbyint _LIBCPP_USING_IF_EXISTS; 463fe6060f1SDimitry Andricusing ::nearbyintf _LIBCPP_USING_IF_EXISTS; 464fe6060f1SDimitry Andricusing ::nextafter _LIBCPP_USING_IF_EXISTS; 465fe6060f1SDimitry Andricusing ::nextafterf _LIBCPP_USING_IF_EXISTS; 466fe6060f1SDimitry Andricusing ::nexttoward _LIBCPP_USING_IF_EXISTS; 467fe6060f1SDimitry Andricusing ::nexttowardf _LIBCPP_USING_IF_EXISTS; 468fe6060f1SDimitry Andricusing ::remainder _LIBCPP_USING_IF_EXISTS; 469fe6060f1SDimitry Andricusing ::remainderf _LIBCPP_USING_IF_EXISTS; 470fe6060f1SDimitry Andricusing ::remquo _LIBCPP_USING_IF_EXISTS; 471fe6060f1SDimitry Andricusing ::remquof _LIBCPP_USING_IF_EXISTS; 472fe6060f1SDimitry Andricusing ::rint _LIBCPP_USING_IF_EXISTS; 473fe6060f1SDimitry Andricusing ::rintf _LIBCPP_USING_IF_EXISTS; 474fe6060f1SDimitry Andricusing ::round _LIBCPP_USING_IF_EXISTS; 475fe6060f1SDimitry Andricusing ::roundf _LIBCPP_USING_IF_EXISTS; 476fe6060f1SDimitry Andricusing ::scalbln _LIBCPP_USING_IF_EXISTS; 477fe6060f1SDimitry Andricusing ::scalblnf _LIBCPP_USING_IF_EXISTS; 478fe6060f1SDimitry Andricusing ::scalbn _LIBCPP_USING_IF_EXISTS; 479fe6060f1SDimitry Andricusing ::scalbnf _LIBCPP_USING_IF_EXISTS; 480fe6060f1SDimitry Andricusing ::tgamma _LIBCPP_USING_IF_EXISTS; 481fe6060f1SDimitry Andricusing ::tgammaf _LIBCPP_USING_IF_EXISTS; 482fe6060f1SDimitry Andricusing ::trunc _LIBCPP_USING_IF_EXISTS; 483fe6060f1SDimitry Andricusing ::truncf _LIBCPP_USING_IF_EXISTS; 4840b57cec5SDimitry Andric 485fe6060f1SDimitry Andricusing ::acosl _LIBCPP_USING_IF_EXISTS; 486fe6060f1SDimitry Andricusing ::asinl _LIBCPP_USING_IF_EXISTS; 487fe6060f1SDimitry Andricusing ::atanl _LIBCPP_USING_IF_EXISTS; 488fe6060f1SDimitry Andricusing ::atan2l _LIBCPP_USING_IF_EXISTS; 489fe6060f1SDimitry Andricusing ::ceill _LIBCPP_USING_IF_EXISTS; 490fe6060f1SDimitry Andricusing ::cosl _LIBCPP_USING_IF_EXISTS; 491fe6060f1SDimitry Andricusing ::coshl _LIBCPP_USING_IF_EXISTS; 492fe6060f1SDimitry Andricusing ::expl _LIBCPP_USING_IF_EXISTS; 493fe6060f1SDimitry Andricusing ::fabsl _LIBCPP_USING_IF_EXISTS; 494fe6060f1SDimitry Andricusing ::floorl _LIBCPP_USING_IF_EXISTS; 495fe6060f1SDimitry Andricusing ::fmodl _LIBCPP_USING_IF_EXISTS; 496fe6060f1SDimitry Andricusing ::frexpl _LIBCPP_USING_IF_EXISTS; 497fe6060f1SDimitry Andricusing ::ldexpl _LIBCPP_USING_IF_EXISTS; 498fe6060f1SDimitry Andricusing ::logl _LIBCPP_USING_IF_EXISTS; 499fe6060f1SDimitry Andricusing ::log10l _LIBCPP_USING_IF_EXISTS; 500fe6060f1SDimitry Andricusing ::modfl _LIBCPP_USING_IF_EXISTS; 501fe6060f1SDimitry Andricusing ::powl _LIBCPP_USING_IF_EXISTS; 502fe6060f1SDimitry Andricusing ::sinl _LIBCPP_USING_IF_EXISTS; 503fe6060f1SDimitry Andricusing ::sinhl _LIBCPP_USING_IF_EXISTS; 504fe6060f1SDimitry Andricusing ::sqrtl _LIBCPP_USING_IF_EXISTS; 505fe6060f1SDimitry Andricusing ::tanl _LIBCPP_USING_IF_EXISTS; 5060b57cec5SDimitry Andric 507fe6060f1SDimitry Andricusing ::tanhl _LIBCPP_USING_IF_EXISTS; 508fe6060f1SDimitry Andricusing ::acoshl _LIBCPP_USING_IF_EXISTS; 509fe6060f1SDimitry Andricusing ::asinhl _LIBCPP_USING_IF_EXISTS; 510fe6060f1SDimitry Andricusing ::atanhl _LIBCPP_USING_IF_EXISTS; 511fe6060f1SDimitry Andricusing ::cbrtl _LIBCPP_USING_IF_EXISTS; 5120b57cec5SDimitry Andric 513fe6060f1SDimitry Andricusing ::copysignl _LIBCPP_USING_IF_EXISTS; 5140b57cec5SDimitry Andric 515fe6060f1SDimitry Andricusing ::erfl _LIBCPP_USING_IF_EXISTS; 516fe6060f1SDimitry Andricusing ::erfcl _LIBCPP_USING_IF_EXISTS; 517fe6060f1SDimitry Andricusing ::exp2l _LIBCPP_USING_IF_EXISTS; 518fe6060f1SDimitry Andricusing ::expm1l _LIBCPP_USING_IF_EXISTS; 519fe6060f1SDimitry Andricusing ::fdiml _LIBCPP_USING_IF_EXISTS; 520fe6060f1SDimitry Andricusing ::fmal _LIBCPP_USING_IF_EXISTS; 521fe6060f1SDimitry Andricusing ::fmaxl _LIBCPP_USING_IF_EXISTS; 522fe6060f1SDimitry Andricusing ::fminl _LIBCPP_USING_IF_EXISTS; 523fe6060f1SDimitry Andricusing ::hypotl _LIBCPP_USING_IF_EXISTS; 524fe6060f1SDimitry Andricusing ::ilogbl _LIBCPP_USING_IF_EXISTS; 525fe6060f1SDimitry Andricusing ::lgammal _LIBCPP_USING_IF_EXISTS; 526fe6060f1SDimitry Andricusing ::llrintl _LIBCPP_USING_IF_EXISTS; 527fe6060f1SDimitry Andricusing ::llroundl _LIBCPP_USING_IF_EXISTS; 528fe6060f1SDimitry Andricusing ::log1pl _LIBCPP_USING_IF_EXISTS; 529fe6060f1SDimitry Andricusing ::log2l _LIBCPP_USING_IF_EXISTS; 530fe6060f1SDimitry Andricusing ::logbl _LIBCPP_USING_IF_EXISTS; 531fe6060f1SDimitry Andricusing ::lrintl _LIBCPP_USING_IF_EXISTS; 532fe6060f1SDimitry Andricusing ::lroundl _LIBCPP_USING_IF_EXISTS; 533fe6060f1SDimitry Andricusing ::nanl _LIBCPP_USING_IF_EXISTS; 534fe6060f1SDimitry Andricusing ::nearbyintl _LIBCPP_USING_IF_EXISTS; 535fe6060f1SDimitry Andricusing ::nextafterl _LIBCPP_USING_IF_EXISTS; 536fe6060f1SDimitry Andricusing ::nexttowardl _LIBCPP_USING_IF_EXISTS; 537fe6060f1SDimitry Andricusing ::remainderl _LIBCPP_USING_IF_EXISTS; 538fe6060f1SDimitry Andricusing ::remquol _LIBCPP_USING_IF_EXISTS; 539fe6060f1SDimitry Andricusing ::rintl _LIBCPP_USING_IF_EXISTS; 540fe6060f1SDimitry Andricusing ::roundl _LIBCPP_USING_IF_EXISTS; 541fe6060f1SDimitry Andricusing ::scalblnl _LIBCPP_USING_IF_EXISTS; 542fe6060f1SDimitry Andricusing ::scalbnl _LIBCPP_USING_IF_EXISTS; 543fe6060f1SDimitry Andricusing ::tgammal _LIBCPP_USING_IF_EXISTS; 544fe6060f1SDimitry Andricusing ::truncl _LIBCPP_USING_IF_EXISTS; 5450b57cec5SDimitry Andric 5460b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 14 547753f127fSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY float hypot( float __x, float __y, float __z ) { return sqrt(__x*__x + __y*__y + __z*__z); } 548753f127fSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY double hypot( double __x, double __y, double __z ) { return sqrt(__x*__x + __y*__y + __z*__z); } 549753f127fSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY long double hypot( long double __x, long double __y, long double __z ) { return sqrt(__x*__x + __y*__y + __z*__z); } 5500b57cec5SDimitry Andric 5510b57cec5SDimitry Andrictemplate <class _A1, class _A2, class _A3> 5520b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 553349cc55cSDimitry Andrictypename enable_if_t 5540b57cec5SDimitry Andric< 5550b57cec5SDimitry Andric is_arithmetic<_A1>::value && 5560b57cec5SDimitry Andric is_arithmetic<_A2>::value && 5570b57cec5SDimitry Andric is_arithmetic<_A3>::value, 5580b57cec5SDimitry Andric __promote<_A1, _A2, _A3> 5590b57cec5SDimitry Andric>::type 5600b57cec5SDimitry Andrichypot(_A1 __lcpp_x, _A2 __lcpp_y, _A3 __lcpp_z) _NOEXCEPT 5610b57cec5SDimitry Andric{ 5620b57cec5SDimitry Andric typedef typename __promote<_A1, _A2, _A3>::type __result_type; 5630b57cec5SDimitry Andric static_assert((!(is_same<_A1, __result_type>::value && 5640b57cec5SDimitry Andric is_same<_A2, __result_type>::value && 5650b57cec5SDimitry Andric is_same<_A3, __result_type>::value)), ""); 566*bdd1243dSDimitry Andric return std::hypot((__result_type)__lcpp_x, (__result_type)__lcpp_y, (__result_type)__lcpp_z); 5670b57cec5SDimitry Andric} 5680b57cec5SDimitry Andric#endif 5690b57cec5SDimitry Andric 5700b57cec5SDimitry Andrictemplate <class _A1> 5710b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 5720b57cec5SDimitry Andric_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type 573*bdd1243dSDimitry Andric__constexpr_isnan(_A1 __lcpp_x) _NOEXCEPT 5740b57cec5SDimitry Andric{ 5750b57cec5SDimitry Andric#if __has_builtin(__builtin_isnan) 5760b57cec5SDimitry Andric return __builtin_isnan(__lcpp_x); 5770b57cec5SDimitry Andric#else 5780b57cec5SDimitry Andric return isnan(__lcpp_x); 5790b57cec5SDimitry Andric#endif 5800b57cec5SDimitry Andric} 5810b57cec5SDimitry Andric 5820b57cec5SDimitry Andrictemplate <class _A1> 5830b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 5840b57cec5SDimitry Andric_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type 585*bdd1243dSDimitry Andric__constexpr_isnan(_A1 __lcpp_x) _NOEXCEPT 5860b57cec5SDimitry Andric{ 587*bdd1243dSDimitry Andric return std::isnan(__lcpp_x); 5880b57cec5SDimitry Andric} 5890b57cec5SDimitry Andric 5900b57cec5SDimitry Andrictemplate <class _A1> 5910b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 5920b57cec5SDimitry Andric_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type 593*bdd1243dSDimitry Andric__constexpr_isinf(_A1 __lcpp_x) _NOEXCEPT 5940b57cec5SDimitry Andric{ 5950b57cec5SDimitry Andric#if __has_builtin(__builtin_isinf) 5960b57cec5SDimitry Andric return __builtin_isinf(__lcpp_x); 5970b57cec5SDimitry Andric#else 5980b57cec5SDimitry Andric return isinf(__lcpp_x); 5990b57cec5SDimitry Andric#endif 6000b57cec5SDimitry Andric} 6010b57cec5SDimitry Andric 6020b57cec5SDimitry Andrictemplate <class _A1> 6030b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 6040b57cec5SDimitry Andric_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type 605*bdd1243dSDimitry Andric__constexpr_isinf(_A1 __lcpp_x) _NOEXCEPT 6060b57cec5SDimitry Andric{ 607*bdd1243dSDimitry Andric return std::isinf(__lcpp_x); 6080b57cec5SDimitry Andric} 6090b57cec5SDimitry Andric 6100b57cec5SDimitry Andrictemplate <class _A1> 6110b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 6120b57cec5SDimitry Andric_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type 613*bdd1243dSDimitry Andric__constexpr_isfinite(_A1 __lcpp_x) _NOEXCEPT 6140b57cec5SDimitry Andric{ 6150b57cec5SDimitry Andric#if __has_builtin(__builtin_isfinite) 6160b57cec5SDimitry Andric return __builtin_isfinite(__lcpp_x); 6170b57cec5SDimitry Andric#else 6180b57cec5SDimitry Andric return isfinite(__lcpp_x); 6190b57cec5SDimitry Andric#endif 6200b57cec5SDimitry Andric} 6210b57cec5SDimitry Andric 6220b57cec5SDimitry Andrictemplate <class _A1> 6230b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 6240b57cec5SDimitry Andric_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type 625*bdd1243dSDimitry Andric__constexpr_isfinite(_A1 __lcpp_x) _NOEXCEPT 6260b57cec5SDimitry Andric{ 627*bdd1243dSDimitry Andric return __builtin_isfinite(__lcpp_x); 628*bdd1243dSDimitry Andric} 629*bdd1243dSDimitry Andric 630*bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI float __constexpr_copysign(float __x, float __y) _NOEXCEPT { 631*bdd1243dSDimitry Andric return __builtin_copysignf(__x, __y); 632*bdd1243dSDimitry Andric} 633*bdd1243dSDimitry Andric 634*bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI double __constexpr_copysign(double __x, double __y) _NOEXCEPT { 635*bdd1243dSDimitry Andric return __builtin_copysign(__x, __y); 636*bdd1243dSDimitry Andric} 637*bdd1243dSDimitry Andric 638*bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI long double 639*bdd1243dSDimitry Andric__constexpr_copysign(long double __x, long double __y) _NOEXCEPT { 640*bdd1243dSDimitry Andric return __builtin_copysignl(__x, __y); 641*bdd1243dSDimitry Andric} 642*bdd1243dSDimitry Andric 643*bdd1243dSDimitry Andrictemplate <class _A1, class _A2> 644*bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI 645*bdd1243dSDimitry Andric typename std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, 646*bdd1243dSDimitry Andric std::__promote<_A1, _A2> >::type 647*bdd1243dSDimitry Andric __constexpr_copysign(_A1 __x, _A2 __y) _NOEXCEPT { 648*bdd1243dSDimitry Andric typedef typename std::__promote<_A1, _A2>::type __result_type; 649*bdd1243dSDimitry Andric static_assert((!(std::_IsSame<_A1, __result_type>::value && std::_IsSame<_A2, __result_type>::value)), ""); 650*bdd1243dSDimitry Andric return __builtin_copysign((__result_type)__x, (__result_type)__y); 651*bdd1243dSDimitry Andric} 652*bdd1243dSDimitry Andric 653*bdd1243dSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR float __constexpr_fabs(float __x) _NOEXCEPT { 654*bdd1243dSDimitry Andric return __builtin_fabsf(__x); 655*bdd1243dSDimitry Andric} 656*bdd1243dSDimitry Andric 657*bdd1243dSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR double __constexpr_fabs(double __x) _NOEXCEPT { 658*bdd1243dSDimitry Andric return __builtin_fabs(__x); 659*bdd1243dSDimitry Andric} 660*bdd1243dSDimitry Andric 661*bdd1243dSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR long double __constexpr_fabs(long double __x) _NOEXCEPT { 662*bdd1243dSDimitry Andric return __builtin_fabsl(__x); 663*bdd1243dSDimitry Andric} 664*bdd1243dSDimitry Andric 665*bdd1243dSDimitry Andrictemplate <class _Tp, __enable_if_t<is_integral<_Tp>::value, int> = 0> 666*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR double __constexpr_fabs(_Tp __x) _NOEXCEPT { 667*bdd1243dSDimitry Andric return __builtin_fabs(static_cast<double>(__x)); 668*bdd1243dSDimitry Andric} 669*bdd1243dSDimitry Andric 670*bdd1243dSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 float __constexpr_fmax(float __x, float __y) _NOEXCEPT { 671*bdd1243dSDimitry Andric#if !__has_constexpr_builtin(__builtin_fmaxf) 672*bdd1243dSDimitry Andric if (__libcpp_is_constant_evaluated()) { 673*bdd1243dSDimitry Andric if (std::__constexpr_isnan(__x)) 674*bdd1243dSDimitry Andric return __y; 675*bdd1243dSDimitry Andric if (std::__constexpr_isnan(__y)) 676*bdd1243dSDimitry Andric return __x; 677*bdd1243dSDimitry Andric return __x < __y ? __y : __x; 678*bdd1243dSDimitry Andric } 679*bdd1243dSDimitry Andric#endif 680*bdd1243dSDimitry Andric return __builtin_fmaxf(__x, __y); 681*bdd1243dSDimitry Andric} 682*bdd1243dSDimitry Andric 683*bdd1243dSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 double __constexpr_fmax(double __x, double __y) _NOEXCEPT { 684*bdd1243dSDimitry Andric#if !__has_constexpr_builtin(__builtin_fmax) 685*bdd1243dSDimitry Andric if (__libcpp_is_constant_evaluated()) { 686*bdd1243dSDimitry Andric if (std::__constexpr_isnan(__x)) 687*bdd1243dSDimitry Andric return __y; 688*bdd1243dSDimitry Andric if (std::__constexpr_isnan(__y)) 689*bdd1243dSDimitry Andric return __x; 690*bdd1243dSDimitry Andric return __x < __y ? __y : __x; 691*bdd1243dSDimitry Andric } 692*bdd1243dSDimitry Andric#endif 693*bdd1243dSDimitry Andric return __builtin_fmax(__x, __y); 694*bdd1243dSDimitry Andric} 695*bdd1243dSDimitry Andric 696*bdd1243dSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 long double 697*bdd1243dSDimitry Andric__constexpr_fmax(long double __x, long double __y) _NOEXCEPT { 698*bdd1243dSDimitry Andric#if !__has_constexpr_builtin(__builtin_fmaxl) 699*bdd1243dSDimitry Andric if (__libcpp_is_constant_evaluated()) { 700*bdd1243dSDimitry Andric if (std::__constexpr_isnan(__x)) 701*bdd1243dSDimitry Andric return __y; 702*bdd1243dSDimitry Andric if (std::__constexpr_isnan(__y)) 703*bdd1243dSDimitry Andric return __x; 704*bdd1243dSDimitry Andric return __x < __y ? __y : __x; 705*bdd1243dSDimitry Andric } 706*bdd1243dSDimitry Andric#endif 707*bdd1243dSDimitry Andric return __builtin_fmaxl(__x, __y); 708*bdd1243dSDimitry Andric} 709*bdd1243dSDimitry Andric 710*bdd1243dSDimitry Andrictemplate <class _Tp, class _Up, __enable_if_t<is_arithmetic<_Tp>::value && is_arithmetic<_Up>::value, int> = 0> 711*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 typename __promote<_Tp, _Up>::type 712*bdd1243dSDimitry Andric__constexpr_fmax(_Tp __x, _Up __y) _NOEXCEPT { 713*bdd1243dSDimitry Andric using __result_type = typename __promote<_Tp, _Up>::type; 714*bdd1243dSDimitry Andric return std::__constexpr_fmax(static_cast<__result_type>(__x), static_cast<__result_type>(__y)); 715*bdd1243dSDimitry Andric} 716*bdd1243dSDimitry Andric 717*bdd1243dSDimitry Andrictemplate <class _Tp> 718*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp __constexpr_logb(_Tp __x) { 719*bdd1243dSDimitry Andric#if !__has_constexpr_builtin(__builtin_logb) 720*bdd1243dSDimitry Andric if (__libcpp_is_constant_evaluated()) { 721*bdd1243dSDimitry Andric if (__x == _Tp(0)) { 722*bdd1243dSDimitry Andric // raise FE_DIVBYZERO 723*bdd1243dSDimitry Andric return -numeric_limits<_Tp>::infinity(); 724*bdd1243dSDimitry Andric } 725*bdd1243dSDimitry Andric 726*bdd1243dSDimitry Andric if (std::__constexpr_isinf(__x)) 727*bdd1243dSDimitry Andric return numeric_limits<_Tp>::infinity(); 728*bdd1243dSDimitry Andric 729*bdd1243dSDimitry Andric if (std::__constexpr_isnan(__x)) 730*bdd1243dSDimitry Andric return numeric_limits<_Tp>::quiet_NaN(); 731*bdd1243dSDimitry Andric 732*bdd1243dSDimitry Andric __x = std::__constexpr_fabs(__x); 733*bdd1243dSDimitry Andric unsigned long long __exp = 0; 734*bdd1243dSDimitry Andric while (__x >= numeric_limits<_Tp>::radix) { 735*bdd1243dSDimitry Andric __x /= numeric_limits<_Tp>::radix; 736*bdd1243dSDimitry Andric __exp += 1; 737*bdd1243dSDimitry Andric } 738*bdd1243dSDimitry Andric return _Tp(__exp); 739*bdd1243dSDimitry Andric } 740*bdd1243dSDimitry Andric#endif // !__has_constexpr_builtin(__builtin_logb) 741*bdd1243dSDimitry Andric return __builtin_logb(__x); 742*bdd1243dSDimitry Andric} 743*bdd1243dSDimitry Andric 744*bdd1243dSDimitry Andrictemplate <class _Tp> 745*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Tp __constexpr_scalbn(_Tp __x, int __exp) { 746*bdd1243dSDimitry Andric#if !__has_constexpr_builtin(__builtin_scalbln) 747*bdd1243dSDimitry Andric if (__libcpp_is_constant_evaluated()) { 748*bdd1243dSDimitry Andric if (__x == _Tp(0)) 749*bdd1243dSDimitry Andric return __x; 750*bdd1243dSDimitry Andric 751*bdd1243dSDimitry Andric if (std::__constexpr_isinf(__x)) 752*bdd1243dSDimitry Andric return __x; 753*bdd1243dSDimitry Andric 754*bdd1243dSDimitry Andric if (__exp == _Tp(0)) 755*bdd1243dSDimitry Andric return __x; 756*bdd1243dSDimitry Andric 757*bdd1243dSDimitry Andric if (std::__constexpr_isnan(__x)) 758*bdd1243dSDimitry Andric return numeric_limits<_Tp>::quiet_NaN(); 759*bdd1243dSDimitry Andric 760*bdd1243dSDimitry Andric _Tp __mult(1); 761*bdd1243dSDimitry Andric if (__exp > 0) { 762*bdd1243dSDimitry Andric __mult = numeric_limits<_Tp>::radix; 763*bdd1243dSDimitry Andric --__exp; 764*bdd1243dSDimitry Andric } else { 765*bdd1243dSDimitry Andric ++__exp; 766*bdd1243dSDimitry Andric __exp = -__exp; 767*bdd1243dSDimitry Andric __mult /= numeric_limits<_Tp>::radix; 768*bdd1243dSDimitry Andric } 769*bdd1243dSDimitry Andric 770*bdd1243dSDimitry Andric while (__exp > 0) { 771*bdd1243dSDimitry Andric if (!(__exp & 1)) { 772*bdd1243dSDimitry Andric __mult *= __mult; 773*bdd1243dSDimitry Andric __exp >>= 1; 774*bdd1243dSDimitry Andric } else { 775*bdd1243dSDimitry Andric __x *= __mult; 776*bdd1243dSDimitry Andric --__exp; 777*bdd1243dSDimitry Andric } 778*bdd1243dSDimitry Andric } 779*bdd1243dSDimitry Andric return __x; 780*bdd1243dSDimitry Andric } 781*bdd1243dSDimitry Andric#endif // !__has_constexpr_builtin(__builtin_scalbln) 782*bdd1243dSDimitry Andric return __builtin_scalbn(__x, __exp); 7830b57cec5SDimitry Andric} 7840b57cec5SDimitry Andric 7850b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 17 7860b57cec5SDimitry Andrictemplate <typename _Fp> 787*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI constexpr 7880b57cec5SDimitry Andric_Fp __lerp(_Fp __a, _Fp __b, _Fp __t) noexcept { 7890b57cec5SDimitry Andric if ((__a <= 0 && __b >= 0) || (__a >= 0 && __b <= 0)) 7900b57cec5SDimitry Andric return __t * __b + (1 - __t) * __a; 7910b57cec5SDimitry Andric 7920b57cec5SDimitry Andric if (__t == 1) return __b; 7930b57cec5SDimitry Andric const _Fp __x = __a + __t * (__b - __a); 794fe6060f1SDimitry Andric if ((__t > 1) == (__b > __a)) 7950b57cec5SDimitry Andric return __b < __x ? __x : __b; 7960b57cec5SDimitry Andric else 7970b57cec5SDimitry Andric return __x < __b ? __x : __b; 7980b57cec5SDimitry Andric} 7990b57cec5SDimitry Andric 800*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI constexpr float 8010b57cec5SDimitry Andriclerp(float __a, float __b, float __t) _NOEXCEPT { return __lerp(__a, __b, __t); } 8020b57cec5SDimitry Andric 803*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI constexpr double 8040b57cec5SDimitry Andriclerp(double __a, double __b, double __t) _NOEXCEPT { return __lerp(__a, __b, __t); } 8050b57cec5SDimitry Andric 806*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI constexpr long double 8070b57cec5SDimitry Andriclerp(long double __a, long double __b, long double __t) _NOEXCEPT { return __lerp(__a, __b, __t); } 8080b57cec5SDimitry Andric 80904eeddc0SDimitry Andrictemplate <class _A1, class _A2, class _A3> 81004eeddc0SDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 81104eeddc0SDimitry Andricconstexpr typename enable_if_t 81204eeddc0SDimitry Andric< 81304eeddc0SDimitry Andric is_arithmetic<_A1>::value && 81404eeddc0SDimitry Andric is_arithmetic<_A2>::value && 81504eeddc0SDimitry Andric is_arithmetic<_A3>::value, 81604eeddc0SDimitry Andric __promote<_A1, _A2, _A3> 81704eeddc0SDimitry Andric>::type 81804eeddc0SDimitry Andriclerp(_A1 __a, _A2 __b, _A3 __t) noexcept 81904eeddc0SDimitry Andric{ 82004eeddc0SDimitry Andric typedef typename __promote<_A1, _A2, _A3>::type __result_type; 82104eeddc0SDimitry Andric static_assert(!(_IsSame<_A1, __result_type>::value && 82204eeddc0SDimitry Andric _IsSame<_A2, __result_type>::value && 82304eeddc0SDimitry Andric _IsSame<_A3, __result_type>::value)); 824*bdd1243dSDimitry Andric return std::__lerp((__result_type)__a, (__result_type)__b, (__result_type)__t); 82504eeddc0SDimitry Andric} 8260b57cec5SDimitry Andric#endif // _LIBCPP_STD_VER > 17 8270b57cec5SDimitry Andric 8280b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 8290b57cec5SDimitry Andric 8300b57cec5SDimitry Andric_LIBCPP_POP_MACROS 8310b57cec5SDimitry Andric 832*bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 833*bdd1243dSDimitry Andric# include <type_traits> 834*bdd1243dSDimitry Andric#endif 835*bdd1243dSDimitry Andric 8360b57cec5SDimitry Andric#endif // _LIBCPP_CMATH 837