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> 309bdd1243dSDimitry Andric#include <__type_traits/enable_if.h> 310bdd1243dSDimitry Andric#include <__type_traits/is_arithmetic.h> 311bdd1243dSDimitry Andric#include <__type_traits/is_constant_evaluated.h> 312bdd1243dSDimitry Andric#include <__type_traits/is_floating_point.h> 313bdd1243dSDimitry Andric#include <__type_traits/is_same.h> 314*06c3fb27SDimitry Andric#include <__type_traits/promote.h> 315bdd1243dSDimitry Andric#include <__type_traits/remove_cv.h> 31604eeddc0SDimitry Andric#include <version> 3170b57cec5SDimitry Andric 318bdd1243dSDimitry Andric#include <math.h> 319bdd1243dSDimitry Andric 320bdd1243dSDimitry Andric#ifndef _LIBCPP_MATH_H 321bdd1243dSDimitry Andric# error <cmath> tried including <math.h> but didn't find libc++'s <math.h> header. \ 322bdd1243dSDimitry Andric This usually means that your header search paths are not configured properly. \ 323bdd1243dSDimitry Andric The header search paths should contain the C++ Standard Library headers before \ 324bdd1243dSDimitry Andric any C Standard Library, and you are probably using compiler flags that make that \ 325bdd1243dSDimitry Andric not be the case. 326bdd1243dSDimitry Andric#endif 327bdd1243dSDimitry Andric 3280b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 3290b57cec5SDimitry Andric# pragma GCC system_header 3300b57cec5SDimitry Andric#endif 3310b57cec5SDimitry Andric 3320b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS 3330b57cec5SDimitry Andric#include <__undef_macros> 3340b57cec5SDimitry Andric 3350b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 3360b57cec5SDimitry Andric 337fe6060f1SDimitry Andricusing ::signbit _LIBCPP_USING_IF_EXISTS; 338fe6060f1SDimitry Andricusing ::fpclassify _LIBCPP_USING_IF_EXISTS; 339fe6060f1SDimitry Andricusing ::isfinite _LIBCPP_USING_IF_EXISTS; 340fe6060f1SDimitry Andricusing ::isinf _LIBCPP_USING_IF_EXISTS; 341fe6060f1SDimitry Andricusing ::isnan _LIBCPP_USING_IF_EXISTS; 342fe6060f1SDimitry Andricusing ::isnormal _LIBCPP_USING_IF_EXISTS; 343fe6060f1SDimitry Andricusing ::isgreater _LIBCPP_USING_IF_EXISTS; 344fe6060f1SDimitry Andricusing ::isgreaterequal _LIBCPP_USING_IF_EXISTS; 345fe6060f1SDimitry Andricusing ::isless _LIBCPP_USING_IF_EXISTS; 346fe6060f1SDimitry Andricusing ::islessequal _LIBCPP_USING_IF_EXISTS; 347fe6060f1SDimitry Andricusing ::islessgreater _LIBCPP_USING_IF_EXISTS; 348fe6060f1SDimitry Andricusing ::isunordered _LIBCPP_USING_IF_EXISTS; 349fe6060f1SDimitry Andricusing ::isunordered _LIBCPP_USING_IF_EXISTS; 3500b57cec5SDimitry Andric 351fe6060f1SDimitry Andricusing ::float_t _LIBCPP_USING_IF_EXISTS; 352fe6060f1SDimitry Andricusing ::double_t _LIBCPP_USING_IF_EXISTS; 3530b57cec5SDimitry Andric 354fe6060f1SDimitry Andricusing ::abs _LIBCPP_USING_IF_EXISTS; 3550b57cec5SDimitry Andric 356fe6060f1SDimitry Andricusing ::acos _LIBCPP_USING_IF_EXISTS; 357fe6060f1SDimitry Andricusing ::acosf _LIBCPP_USING_IF_EXISTS; 358fe6060f1SDimitry Andricusing ::asin _LIBCPP_USING_IF_EXISTS; 359fe6060f1SDimitry Andricusing ::asinf _LIBCPP_USING_IF_EXISTS; 360fe6060f1SDimitry Andricusing ::atan _LIBCPP_USING_IF_EXISTS; 361fe6060f1SDimitry Andricusing ::atanf _LIBCPP_USING_IF_EXISTS; 362fe6060f1SDimitry Andricusing ::atan2 _LIBCPP_USING_IF_EXISTS; 363fe6060f1SDimitry Andricusing ::atan2f _LIBCPP_USING_IF_EXISTS; 364fe6060f1SDimitry Andricusing ::ceil _LIBCPP_USING_IF_EXISTS; 365fe6060f1SDimitry Andricusing ::ceilf _LIBCPP_USING_IF_EXISTS; 366fe6060f1SDimitry Andricusing ::cos _LIBCPP_USING_IF_EXISTS; 367fe6060f1SDimitry Andricusing ::cosf _LIBCPP_USING_IF_EXISTS; 368fe6060f1SDimitry Andricusing ::cosh _LIBCPP_USING_IF_EXISTS; 369fe6060f1SDimitry Andricusing ::coshf _LIBCPP_USING_IF_EXISTS; 3700b57cec5SDimitry Andric 371fe6060f1SDimitry Andricusing ::exp _LIBCPP_USING_IF_EXISTS; 372fe6060f1SDimitry Andricusing ::expf _LIBCPP_USING_IF_EXISTS; 3730b57cec5SDimitry Andric 374fe6060f1SDimitry Andricusing ::fabs _LIBCPP_USING_IF_EXISTS; 375fe6060f1SDimitry Andricusing ::fabsf _LIBCPP_USING_IF_EXISTS; 376fe6060f1SDimitry Andricusing ::floor _LIBCPP_USING_IF_EXISTS; 377fe6060f1SDimitry Andricusing ::floorf _LIBCPP_USING_IF_EXISTS; 3780b57cec5SDimitry Andric 379fe6060f1SDimitry Andricusing ::fmod _LIBCPP_USING_IF_EXISTS; 380fe6060f1SDimitry Andricusing ::fmodf _LIBCPP_USING_IF_EXISTS; 3810b57cec5SDimitry Andric 382fe6060f1SDimitry Andricusing ::frexp _LIBCPP_USING_IF_EXISTS; 383fe6060f1SDimitry Andricusing ::frexpf _LIBCPP_USING_IF_EXISTS; 384fe6060f1SDimitry Andricusing ::ldexp _LIBCPP_USING_IF_EXISTS; 385fe6060f1SDimitry Andricusing ::ldexpf _LIBCPP_USING_IF_EXISTS; 3860b57cec5SDimitry Andric 387fe6060f1SDimitry Andricusing ::log _LIBCPP_USING_IF_EXISTS; 388fe6060f1SDimitry Andricusing ::logf _LIBCPP_USING_IF_EXISTS; 3890b57cec5SDimitry Andric 390fe6060f1SDimitry Andricusing ::log10 _LIBCPP_USING_IF_EXISTS; 391fe6060f1SDimitry Andricusing ::log10f _LIBCPP_USING_IF_EXISTS; 392fe6060f1SDimitry Andricusing ::modf _LIBCPP_USING_IF_EXISTS; 393fe6060f1SDimitry Andricusing ::modff _LIBCPP_USING_IF_EXISTS; 3940b57cec5SDimitry Andric 395fe6060f1SDimitry Andricusing ::pow _LIBCPP_USING_IF_EXISTS; 396fe6060f1SDimitry Andricusing ::powf _LIBCPP_USING_IF_EXISTS; 3970b57cec5SDimitry Andric 398fe6060f1SDimitry Andricusing ::sin _LIBCPP_USING_IF_EXISTS; 399fe6060f1SDimitry Andricusing ::sinf _LIBCPP_USING_IF_EXISTS; 400fe6060f1SDimitry Andricusing ::sinh _LIBCPP_USING_IF_EXISTS; 401fe6060f1SDimitry Andricusing ::sinhf _LIBCPP_USING_IF_EXISTS; 4020b57cec5SDimitry Andric 403fe6060f1SDimitry Andricusing ::sqrt _LIBCPP_USING_IF_EXISTS; 404fe6060f1SDimitry Andricusing ::sqrtf _LIBCPP_USING_IF_EXISTS; 405fe6060f1SDimitry Andricusing ::tan _LIBCPP_USING_IF_EXISTS; 406fe6060f1SDimitry Andricusing ::tanf _LIBCPP_USING_IF_EXISTS; 4070b57cec5SDimitry Andric 408fe6060f1SDimitry Andricusing ::tanh _LIBCPP_USING_IF_EXISTS; 409fe6060f1SDimitry Andricusing ::tanhf _LIBCPP_USING_IF_EXISTS; 4100b57cec5SDimitry Andric 411fe6060f1SDimitry Andricusing ::acosh _LIBCPP_USING_IF_EXISTS; 412fe6060f1SDimitry Andricusing ::acoshf _LIBCPP_USING_IF_EXISTS; 413fe6060f1SDimitry Andricusing ::asinh _LIBCPP_USING_IF_EXISTS; 414fe6060f1SDimitry Andricusing ::asinhf _LIBCPP_USING_IF_EXISTS; 415fe6060f1SDimitry Andricusing ::atanh _LIBCPP_USING_IF_EXISTS; 416fe6060f1SDimitry Andricusing ::atanhf _LIBCPP_USING_IF_EXISTS; 417fe6060f1SDimitry Andricusing ::cbrt _LIBCPP_USING_IF_EXISTS; 418fe6060f1SDimitry Andricusing ::cbrtf _LIBCPP_USING_IF_EXISTS; 4190b57cec5SDimitry Andric 420fe6060f1SDimitry Andricusing ::copysign _LIBCPP_USING_IF_EXISTS; 421fe6060f1SDimitry Andricusing ::copysignf _LIBCPP_USING_IF_EXISTS; 4220b57cec5SDimitry Andric 423fe6060f1SDimitry Andricusing ::erf _LIBCPP_USING_IF_EXISTS; 424fe6060f1SDimitry Andricusing ::erff _LIBCPP_USING_IF_EXISTS; 425fe6060f1SDimitry Andricusing ::erfc _LIBCPP_USING_IF_EXISTS; 426fe6060f1SDimitry Andricusing ::erfcf _LIBCPP_USING_IF_EXISTS; 427fe6060f1SDimitry Andricusing ::exp2 _LIBCPP_USING_IF_EXISTS; 428fe6060f1SDimitry Andricusing ::exp2f _LIBCPP_USING_IF_EXISTS; 429fe6060f1SDimitry Andricusing ::expm1 _LIBCPP_USING_IF_EXISTS; 430fe6060f1SDimitry Andricusing ::expm1f _LIBCPP_USING_IF_EXISTS; 431fe6060f1SDimitry Andricusing ::fdim _LIBCPP_USING_IF_EXISTS; 432fe6060f1SDimitry Andricusing ::fdimf _LIBCPP_USING_IF_EXISTS; 433fe6060f1SDimitry Andricusing ::fmaf _LIBCPP_USING_IF_EXISTS; 434fe6060f1SDimitry Andricusing ::fma _LIBCPP_USING_IF_EXISTS; 435fe6060f1SDimitry Andricusing ::fmax _LIBCPP_USING_IF_EXISTS; 436fe6060f1SDimitry Andricusing ::fmaxf _LIBCPP_USING_IF_EXISTS; 437fe6060f1SDimitry Andricusing ::fmin _LIBCPP_USING_IF_EXISTS; 438fe6060f1SDimitry Andricusing ::fminf _LIBCPP_USING_IF_EXISTS; 439fe6060f1SDimitry Andricusing ::hypot _LIBCPP_USING_IF_EXISTS; 440fe6060f1SDimitry Andricusing ::hypotf _LIBCPP_USING_IF_EXISTS; 441fe6060f1SDimitry Andricusing ::ilogb _LIBCPP_USING_IF_EXISTS; 442fe6060f1SDimitry Andricusing ::ilogbf _LIBCPP_USING_IF_EXISTS; 443fe6060f1SDimitry Andricusing ::lgamma _LIBCPP_USING_IF_EXISTS; 444fe6060f1SDimitry Andricusing ::lgammaf _LIBCPP_USING_IF_EXISTS; 445fe6060f1SDimitry Andricusing ::llrint _LIBCPP_USING_IF_EXISTS; 446fe6060f1SDimitry Andricusing ::llrintf _LIBCPP_USING_IF_EXISTS; 447fe6060f1SDimitry Andricusing ::llround _LIBCPP_USING_IF_EXISTS; 448fe6060f1SDimitry Andricusing ::llroundf _LIBCPP_USING_IF_EXISTS; 449fe6060f1SDimitry Andricusing ::log1p _LIBCPP_USING_IF_EXISTS; 450fe6060f1SDimitry Andricusing ::log1pf _LIBCPP_USING_IF_EXISTS; 451fe6060f1SDimitry Andricusing ::log2 _LIBCPP_USING_IF_EXISTS; 452fe6060f1SDimitry Andricusing ::log2f _LIBCPP_USING_IF_EXISTS; 453fe6060f1SDimitry Andricusing ::logb _LIBCPP_USING_IF_EXISTS; 454fe6060f1SDimitry Andricusing ::logbf _LIBCPP_USING_IF_EXISTS; 455fe6060f1SDimitry Andricusing ::lrint _LIBCPP_USING_IF_EXISTS; 456fe6060f1SDimitry Andricusing ::lrintf _LIBCPP_USING_IF_EXISTS; 457fe6060f1SDimitry Andricusing ::lround _LIBCPP_USING_IF_EXISTS; 458fe6060f1SDimitry Andricusing ::lroundf _LIBCPP_USING_IF_EXISTS; 4590b57cec5SDimitry Andric 460fe6060f1SDimitry Andricusing ::nan _LIBCPP_USING_IF_EXISTS; 461fe6060f1SDimitry Andricusing ::nanf _LIBCPP_USING_IF_EXISTS; 4620b57cec5SDimitry Andric 463fe6060f1SDimitry Andricusing ::nearbyint _LIBCPP_USING_IF_EXISTS; 464fe6060f1SDimitry Andricusing ::nearbyintf _LIBCPP_USING_IF_EXISTS; 465fe6060f1SDimitry Andricusing ::nextafter _LIBCPP_USING_IF_EXISTS; 466fe6060f1SDimitry Andricusing ::nextafterf _LIBCPP_USING_IF_EXISTS; 467fe6060f1SDimitry Andricusing ::nexttoward _LIBCPP_USING_IF_EXISTS; 468fe6060f1SDimitry Andricusing ::nexttowardf _LIBCPP_USING_IF_EXISTS; 469fe6060f1SDimitry Andricusing ::remainder _LIBCPP_USING_IF_EXISTS; 470fe6060f1SDimitry Andricusing ::remainderf _LIBCPP_USING_IF_EXISTS; 471fe6060f1SDimitry Andricusing ::remquo _LIBCPP_USING_IF_EXISTS; 472fe6060f1SDimitry Andricusing ::remquof _LIBCPP_USING_IF_EXISTS; 473fe6060f1SDimitry Andricusing ::rint _LIBCPP_USING_IF_EXISTS; 474fe6060f1SDimitry Andricusing ::rintf _LIBCPP_USING_IF_EXISTS; 475fe6060f1SDimitry Andricusing ::round _LIBCPP_USING_IF_EXISTS; 476fe6060f1SDimitry Andricusing ::roundf _LIBCPP_USING_IF_EXISTS; 477fe6060f1SDimitry Andricusing ::scalbln _LIBCPP_USING_IF_EXISTS; 478fe6060f1SDimitry Andricusing ::scalblnf _LIBCPP_USING_IF_EXISTS; 479fe6060f1SDimitry Andricusing ::scalbn _LIBCPP_USING_IF_EXISTS; 480fe6060f1SDimitry Andricusing ::scalbnf _LIBCPP_USING_IF_EXISTS; 481fe6060f1SDimitry Andricusing ::tgamma _LIBCPP_USING_IF_EXISTS; 482fe6060f1SDimitry Andricusing ::tgammaf _LIBCPP_USING_IF_EXISTS; 483fe6060f1SDimitry Andricusing ::trunc _LIBCPP_USING_IF_EXISTS; 484fe6060f1SDimitry Andricusing ::truncf _LIBCPP_USING_IF_EXISTS; 4850b57cec5SDimitry Andric 486fe6060f1SDimitry Andricusing ::acosl _LIBCPP_USING_IF_EXISTS; 487fe6060f1SDimitry Andricusing ::asinl _LIBCPP_USING_IF_EXISTS; 488fe6060f1SDimitry Andricusing ::atanl _LIBCPP_USING_IF_EXISTS; 489fe6060f1SDimitry Andricusing ::atan2l _LIBCPP_USING_IF_EXISTS; 490fe6060f1SDimitry Andricusing ::ceill _LIBCPP_USING_IF_EXISTS; 491fe6060f1SDimitry Andricusing ::cosl _LIBCPP_USING_IF_EXISTS; 492fe6060f1SDimitry Andricusing ::coshl _LIBCPP_USING_IF_EXISTS; 493fe6060f1SDimitry Andricusing ::expl _LIBCPP_USING_IF_EXISTS; 494fe6060f1SDimitry Andricusing ::fabsl _LIBCPP_USING_IF_EXISTS; 495fe6060f1SDimitry Andricusing ::floorl _LIBCPP_USING_IF_EXISTS; 496fe6060f1SDimitry Andricusing ::fmodl _LIBCPP_USING_IF_EXISTS; 497fe6060f1SDimitry Andricusing ::frexpl _LIBCPP_USING_IF_EXISTS; 498fe6060f1SDimitry Andricusing ::ldexpl _LIBCPP_USING_IF_EXISTS; 499fe6060f1SDimitry Andricusing ::logl _LIBCPP_USING_IF_EXISTS; 500fe6060f1SDimitry Andricusing ::log10l _LIBCPP_USING_IF_EXISTS; 501fe6060f1SDimitry Andricusing ::modfl _LIBCPP_USING_IF_EXISTS; 502fe6060f1SDimitry Andricusing ::powl _LIBCPP_USING_IF_EXISTS; 503fe6060f1SDimitry Andricusing ::sinl _LIBCPP_USING_IF_EXISTS; 504fe6060f1SDimitry Andricusing ::sinhl _LIBCPP_USING_IF_EXISTS; 505fe6060f1SDimitry Andricusing ::sqrtl _LIBCPP_USING_IF_EXISTS; 506fe6060f1SDimitry Andricusing ::tanl _LIBCPP_USING_IF_EXISTS; 5070b57cec5SDimitry Andric 508fe6060f1SDimitry Andricusing ::tanhl _LIBCPP_USING_IF_EXISTS; 509fe6060f1SDimitry Andricusing ::acoshl _LIBCPP_USING_IF_EXISTS; 510fe6060f1SDimitry Andricusing ::asinhl _LIBCPP_USING_IF_EXISTS; 511fe6060f1SDimitry Andricusing ::atanhl _LIBCPP_USING_IF_EXISTS; 512fe6060f1SDimitry Andricusing ::cbrtl _LIBCPP_USING_IF_EXISTS; 5130b57cec5SDimitry Andric 514fe6060f1SDimitry Andricusing ::copysignl _LIBCPP_USING_IF_EXISTS; 5150b57cec5SDimitry Andric 516fe6060f1SDimitry Andricusing ::erfl _LIBCPP_USING_IF_EXISTS; 517fe6060f1SDimitry Andricusing ::erfcl _LIBCPP_USING_IF_EXISTS; 518fe6060f1SDimitry Andricusing ::exp2l _LIBCPP_USING_IF_EXISTS; 519fe6060f1SDimitry Andricusing ::expm1l _LIBCPP_USING_IF_EXISTS; 520fe6060f1SDimitry Andricusing ::fdiml _LIBCPP_USING_IF_EXISTS; 521fe6060f1SDimitry Andricusing ::fmal _LIBCPP_USING_IF_EXISTS; 522fe6060f1SDimitry Andricusing ::fmaxl _LIBCPP_USING_IF_EXISTS; 523fe6060f1SDimitry Andricusing ::fminl _LIBCPP_USING_IF_EXISTS; 524fe6060f1SDimitry Andricusing ::hypotl _LIBCPP_USING_IF_EXISTS; 525fe6060f1SDimitry Andricusing ::ilogbl _LIBCPP_USING_IF_EXISTS; 526fe6060f1SDimitry Andricusing ::lgammal _LIBCPP_USING_IF_EXISTS; 527fe6060f1SDimitry Andricusing ::llrintl _LIBCPP_USING_IF_EXISTS; 528fe6060f1SDimitry Andricusing ::llroundl _LIBCPP_USING_IF_EXISTS; 529fe6060f1SDimitry Andricusing ::log1pl _LIBCPP_USING_IF_EXISTS; 530fe6060f1SDimitry Andricusing ::log2l _LIBCPP_USING_IF_EXISTS; 531fe6060f1SDimitry Andricusing ::logbl _LIBCPP_USING_IF_EXISTS; 532fe6060f1SDimitry Andricusing ::lrintl _LIBCPP_USING_IF_EXISTS; 533fe6060f1SDimitry Andricusing ::lroundl _LIBCPP_USING_IF_EXISTS; 534fe6060f1SDimitry Andricusing ::nanl _LIBCPP_USING_IF_EXISTS; 535fe6060f1SDimitry Andricusing ::nearbyintl _LIBCPP_USING_IF_EXISTS; 536fe6060f1SDimitry Andricusing ::nextafterl _LIBCPP_USING_IF_EXISTS; 537fe6060f1SDimitry Andricusing ::nexttowardl _LIBCPP_USING_IF_EXISTS; 538fe6060f1SDimitry Andricusing ::remainderl _LIBCPP_USING_IF_EXISTS; 539fe6060f1SDimitry Andricusing ::remquol _LIBCPP_USING_IF_EXISTS; 540fe6060f1SDimitry Andricusing ::rintl _LIBCPP_USING_IF_EXISTS; 541fe6060f1SDimitry Andricusing ::roundl _LIBCPP_USING_IF_EXISTS; 542fe6060f1SDimitry Andricusing ::scalblnl _LIBCPP_USING_IF_EXISTS; 543fe6060f1SDimitry Andricusing ::scalbnl _LIBCPP_USING_IF_EXISTS; 544fe6060f1SDimitry Andricusing ::tgammal _LIBCPP_USING_IF_EXISTS; 545fe6060f1SDimitry Andricusing ::truncl _LIBCPP_USING_IF_EXISTS; 5460b57cec5SDimitry Andric 547*06c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 17 548753f127fSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY float hypot( float __x, float __y, float __z ) { return sqrt(__x*__x + __y*__y + __z*__z); } 549753f127fSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY double hypot( double __x, double __y, double __z ) { return sqrt(__x*__x + __y*__y + __z*__z); } 550753f127fSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY long double hypot( long double __x, long double __y, long double __z ) { return sqrt(__x*__x + __y*__y + __z*__z); } 5510b57cec5SDimitry Andric 5520b57cec5SDimitry Andrictemplate <class _A1, class _A2, class _A3> 5530b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 554349cc55cSDimitry Andrictypename enable_if_t 5550b57cec5SDimitry Andric< 5560b57cec5SDimitry Andric is_arithmetic<_A1>::value && 5570b57cec5SDimitry Andric is_arithmetic<_A2>::value && 5580b57cec5SDimitry Andric is_arithmetic<_A3>::value, 5590b57cec5SDimitry Andric __promote<_A1, _A2, _A3> 5600b57cec5SDimitry Andric>::type 5610b57cec5SDimitry Andrichypot(_A1 __lcpp_x, _A2 __lcpp_y, _A3 __lcpp_z) _NOEXCEPT 5620b57cec5SDimitry Andric{ 5630b57cec5SDimitry Andric typedef typename __promote<_A1, _A2, _A3>::type __result_type; 5640b57cec5SDimitry Andric static_assert((!(is_same<_A1, __result_type>::value && 5650b57cec5SDimitry Andric is_same<_A2, __result_type>::value && 5660b57cec5SDimitry Andric is_same<_A3, __result_type>::value)), ""); 567bdd1243dSDimitry Andric return std::hypot((__result_type)__lcpp_x, (__result_type)__lcpp_y, (__result_type)__lcpp_z); 5680b57cec5SDimitry Andric} 5690b57cec5SDimitry Andric#endif 5700b57cec5SDimitry Andric 5710b57cec5SDimitry Andrictemplate <class _A1> 5720b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 5730b57cec5SDimitry Andric_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type 574bdd1243dSDimitry Andric__constexpr_isnan(_A1 __lcpp_x) _NOEXCEPT 5750b57cec5SDimitry Andric{ 5760b57cec5SDimitry Andric#if __has_builtin(__builtin_isnan) 5770b57cec5SDimitry Andric return __builtin_isnan(__lcpp_x); 5780b57cec5SDimitry Andric#else 5790b57cec5SDimitry Andric return isnan(__lcpp_x); 5800b57cec5SDimitry Andric#endif 5810b57cec5SDimitry Andric} 5820b57cec5SDimitry Andric 5830b57cec5SDimitry Andrictemplate <class _A1> 5840b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 5850b57cec5SDimitry Andric_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type 586bdd1243dSDimitry Andric__constexpr_isnan(_A1 __lcpp_x) _NOEXCEPT 5870b57cec5SDimitry Andric{ 588bdd1243dSDimitry Andric return std::isnan(__lcpp_x); 5890b57cec5SDimitry Andric} 5900b57cec5SDimitry Andric 5910b57cec5SDimitry Andrictemplate <class _A1> 5920b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 5930b57cec5SDimitry Andric_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type 594bdd1243dSDimitry Andric__constexpr_isinf(_A1 __lcpp_x) _NOEXCEPT 5950b57cec5SDimitry Andric{ 5960b57cec5SDimitry Andric#if __has_builtin(__builtin_isinf) 5970b57cec5SDimitry Andric return __builtin_isinf(__lcpp_x); 5980b57cec5SDimitry Andric#else 5990b57cec5SDimitry Andric return isinf(__lcpp_x); 6000b57cec5SDimitry Andric#endif 6010b57cec5SDimitry Andric} 6020b57cec5SDimitry Andric 6030b57cec5SDimitry Andrictemplate <class _A1> 6040b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 6050b57cec5SDimitry Andric_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type 606bdd1243dSDimitry Andric__constexpr_isinf(_A1 __lcpp_x) _NOEXCEPT 6070b57cec5SDimitry Andric{ 608bdd1243dSDimitry Andric return std::isinf(__lcpp_x); 6090b57cec5SDimitry Andric} 6100b57cec5SDimitry Andric 6110b57cec5SDimitry Andrictemplate <class _A1> 6120b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 6130b57cec5SDimitry Andric_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type 614bdd1243dSDimitry Andric__constexpr_isfinite(_A1 __lcpp_x) _NOEXCEPT 6150b57cec5SDimitry Andric{ 6160b57cec5SDimitry Andric#if __has_builtin(__builtin_isfinite) 6170b57cec5SDimitry Andric return __builtin_isfinite(__lcpp_x); 6180b57cec5SDimitry Andric#else 6190b57cec5SDimitry Andric return isfinite(__lcpp_x); 6200b57cec5SDimitry Andric#endif 6210b57cec5SDimitry Andric} 6220b57cec5SDimitry Andric 6230b57cec5SDimitry Andrictemplate <class _A1> 6240b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 6250b57cec5SDimitry Andric_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type 626bdd1243dSDimitry Andric__constexpr_isfinite(_A1 __lcpp_x) _NOEXCEPT 6270b57cec5SDimitry Andric{ 628bdd1243dSDimitry Andric return __builtin_isfinite(__lcpp_x); 629bdd1243dSDimitry Andric} 630bdd1243dSDimitry Andric 631bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI float __constexpr_copysign(float __x, float __y) _NOEXCEPT { 632bdd1243dSDimitry Andric return __builtin_copysignf(__x, __y); 633bdd1243dSDimitry Andric} 634bdd1243dSDimitry Andric 635bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI double __constexpr_copysign(double __x, double __y) _NOEXCEPT { 636bdd1243dSDimitry Andric return __builtin_copysign(__x, __y); 637bdd1243dSDimitry Andric} 638bdd1243dSDimitry Andric 639bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI long double 640bdd1243dSDimitry Andric__constexpr_copysign(long double __x, long double __y) _NOEXCEPT { 641bdd1243dSDimitry Andric return __builtin_copysignl(__x, __y); 642bdd1243dSDimitry Andric} 643bdd1243dSDimitry Andric 644bdd1243dSDimitry Andrictemplate <class _A1, class _A2> 645bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI 646bdd1243dSDimitry Andric typename std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, 647bdd1243dSDimitry Andric std::__promote<_A1, _A2> >::type 648bdd1243dSDimitry Andric __constexpr_copysign(_A1 __x, _A2 __y) _NOEXCEPT { 649bdd1243dSDimitry Andric typedef typename std::__promote<_A1, _A2>::type __result_type; 650bdd1243dSDimitry Andric static_assert((!(std::_IsSame<_A1, __result_type>::value && std::_IsSame<_A2, __result_type>::value)), ""); 651bdd1243dSDimitry Andric return __builtin_copysign((__result_type)__x, (__result_type)__y); 652bdd1243dSDimitry Andric} 653bdd1243dSDimitry Andric 654bdd1243dSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR float __constexpr_fabs(float __x) _NOEXCEPT { 655bdd1243dSDimitry Andric return __builtin_fabsf(__x); 656bdd1243dSDimitry Andric} 657bdd1243dSDimitry Andric 658bdd1243dSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR double __constexpr_fabs(double __x) _NOEXCEPT { 659bdd1243dSDimitry Andric return __builtin_fabs(__x); 660bdd1243dSDimitry Andric} 661bdd1243dSDimitry Andric 662bdd1243dSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR long double __constexpr_fabs(long double __x) _NOEXCEPT { 663bdd1243dSDimitry Andric return __builtin_fabsl(__x); 664bdd1243dSDimitry Andric} 665bdd1243dSDimitry Andric 666bdd1243dSDimitry Andrictemplate <class _Tp, __enable_if_t<is_integral<_Tp>::value, int> = 0> 667bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR double __constexpr_fabs(_Tp __x) _NOEXCEPT { 668bdd1243dSDimitry Andric return __builtin_fabs(static_cast<double>(__x)); 669bdd1243dSDimitry Andric} 670bdd1243dSDimitry Andric 671bdd1243dSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 float __constexpr_fmax(float __x, float __y) _NOEXCEPT { 672bdd1243dSDimitry Andric#if !__has_constexpr_builtin(__builtin_fmaxf) 673bdd1243dSDimitry Andric if (__libcpp_is_constant_evaluated()) { 674bdd1243dSDimitry Andric if (std::__constexpr_isnan(__x)) 675bdd1243dSDimitry Andric return __y; 676bdd1243dSDimitry Andric if (std::__constexpr_isnan(__y)) 677bdd1243dSDimitry Andric return __x; 678bdd1243dSDimitry Andric return __x < __y ? __y : __x; 679bdd1243dSDimitry Andric } 680bdd1243dSDimitry Andric#endif 681bdd1243dSDimitry Andric return __builtin_fmaxf(__x, __y); 682bdd1243dSDimitry Andric} 683bdd1243dSDimitry Andric 684bdd1243dSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 double __constexpr_fmax(double __x, double __y) _NOEXCEPT { 685bdd1243dSDimitry Andric#if !__has_constexpr_builtin(__builtin_fmax) 686bdd1243dSDimitry Andric if (__libcpp_is_constant_evaluated()) { 687bdd1243dSDimitry Andric if (std::__constexpr_isnan(__x)) 688bdd1243dSDimitry Andric return __y; 689bdd1243dSDimitry Andric if (std::__constexpr_isnan(__y)) 690bdd1243dSDimitry Andric return __x; 691bdd1243dSDimitry Andric return __x < __y ? __y : __x; 692bdd1243dSDimitry Andric } 693bdd1243dSDimitry Andric#endif 694bdd1243dSDimitry Andric return __builtin_fmax(__x, __y); 695bdd1243dSDimitry Andric} 696bdd1243dSDimitry Andric 697bdd1243dSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 long double 698bdd1243dSDimitry Andric__constexpr_fmax(long double __x, long double __y) _NOEXCEPT { 699bdd1243dSDimitry Andric#if !__has_constexpr_builtin(__builtin_fmaxl) 700bdd1243dSDimitry Andric if (__libcpp_is_constant_evaluated()) { 701bdd1243dSDimitry Andric if (std::__constexpr_isnan(__x)) 702bdd1243dSDimitry Andric return __y; 703bdd1243dSDimitry Andric if (std::__constexpr_isnan(__y)) 704bdd1243dSDimitry Andric return __x; 705bdd1243dSDimitry Andric return __x < __y ? __y : __x; 706bdd1243dSDimitry Andric } 707bdd1243dSDimitry Andric#endif 708bdd1243dSDimitry Andric return __builtin_fmaxl(__x, __y); 709bdd1243dSDimitry Andric} 710bdd1243dSDimitry Andric 711bdd1243dSDimitry Andrictemplate <class _Tp, class _Up, __enable_if_t<is_arithmetic<_Tp>::value && is_arithmetic<_Up>::value, int> = 0> 712bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 typename __promote<_Tp, _Up>::type 713bdd1243dSDimitry Andric__constexpr_fmax(_Tp __x, _Up __y) _NOEXCEPT { 714bdd1243dSDimitry Andric using __result_type = typename __promote<_Tp, _Up>::type; 715bdd1243dSDimitry Andric return std::__constexpr_fmax(static_cast<__result_type>(__x), static_cast<__result_type>(__y)); 716bdd1243dSDimitry Andric} 717bdd1243dSDimitry Andric 718bdd1243dSDimitry Andrictemplate <class _Tp> 719bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp __constexpr_logb(_Tp __x) { 720bdd1243dSDimitry Andric#if !__has_constexpr_builtin(__builtin_logb) 721bdd1243dSDimitry Andric if (__libcpp_is_constant_evaluated()) { 722bdd1243dSDimitry Andric if (__x == _Tp(0)) { 723bdd1243dSDimitry Andric // raise FE_DIVBYZERO 724bdd1243dSDimitry Andric return -numeric_limits<_Tp>::infinity(); 725bdd1243dSDimitry Andric } 726bdd1243dSDimitry Andric 727bdd1243dSDimitry Andric if (std::__constexpr_isinf(__x)) 728bdd1243dSDimitry Andric return numeric_limits<_Tp>::infinity(); 729bdd1243dSDimitry Andric 730bdd1243dSDimitry Andric if (std::__constexpr_isnan(__x)) 731bdd1243dSDimitry Andric return numeric_limits<_Tp>::quiet_NaN(); 732bdd1243dSDimitry Andric 733bdd1243dSDimitry Andric __x = std::__constexpr_fabs(__x); 734bdd1243dSDimitry Andric unsigned long long __exp = 0; 735bdd1243dSDimitry Andric while (__x >= numeric_limits<_Tp>::radix) { 736bdd1243dSDimitry Andric __x /= numeric_limits<_Tp>::radix; 737bdd1243dSDimitry Andric __exp += 1; 738bdd1243dSDimitry Andric } 739bdd1243dSDimitry Andric return _Tp(__exp); 740bdd1243dSDimitry Andric } 741bdd1243dSDimitry Andric#endif // !__has_constexpr_builtin(__builtin_logb) 742bdd1243dSDimitry Andric return __builtin_logb(__x); 743bdd1243dSDimitry Andric} 744bdd1243dSDimitry Andric 745bdd1243dSDimitry Andrictemplate <class _Tp> 746bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Tp __constexpr_scalbn(_Tp __x, int __exp) { 747bdd1243dSDimitry Andric#if !__has_constexpr_builtin(__builtin_scalbln) 748bdd1243dSDimitry Andric if (__libcpp_is_constant_evaluated()) { 749bdd1243dSDimitry Andric if (__x == _Tp(0)) 750bdd1243dSDimitry Andric return __x; 751bdd1243dSDimitry Andric 752bdd1243dSDimitry Andric if (std::__constexpr_isinf(__x)) 753bdd1243dSDimitry Andric return __x; 754bdd1243dSDimitry Andric 755bdd1243dSDimitry Andric if (__exp == _Tp(0)) 756bdd1243dSDimitry Andric return __x; 757bdd1243dSDimitry Andric 758bdd1243dSDimitry Andric if (std::__constexpr_isnan(__x)) 759bdd1243dSDimitry Andric return numeric_limits<_Tp>::quiet_NaN(); 760bdd1243dSDimitry Andric 761bdd1243dSDimitry Andric _Tp __mult(1); 762bdd1243dSDimitry Andric if (__exp > 0) { 763bdd1243dSDimitry Andric __mult = numeric_limits<_Tp>::radix; 764bdd1243dSDimitry Andric --__exp; 765bdd1243dSDimitry Andric } else { 766bdd1243dSDimitry Andric ++__exp; 767bdd1243dSDimitry Andric __exp = -__exp; 768bdd1243dSDimitry Andric __mult /= numeric_limits<_Tp>::radix; 769bdd1243dSDimitry Andric } 770bdd1243dSDimitry Andric 771bdd1243dSDimitry Andric while (__exp > 0) { 772bdd1243dSDimitry Andric if (!(__exp & 1)) { 773bdd1243dSDimitry Andric __mult *= __mult; 774bdd1243dSDimitry Andric __exp >>= 1; 775bdd1243dSDimitry Andric } else { 776bdd1243dSDimitry Andric __x *= __mult; 777bdd1243dSDimitry Andric --__exp; 778bdd1243dSDimitry Andric } 779bdd1243dSDimitry Andric } 780bdd1243dSDimitry Andric return __x; 781bdd1243dSDimitry Andric } 782bdd1243dSDimitry Andric#endif // !__has_constexpr_builtin(__builtin_scalbln) 783bdd1243dSDimitry Andric return __builtin_scalbn(__x, __exp); 7840b57cec5SDimitry Andric} 7850b57cec5SDimitry Andric 786*06c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 20 7870b57cec5SDimitry Andrictemplate <typename _Fp> 788bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI constexpr 7890b57cec5SDimitry Andric_Fp __lerp(_Fp __a, _Fp __b, _Fp __t) noexcept { 7900b57cec5SDimitry Andric if ((__a <= 0 && __b >= 0) || (__a >= 0 && __b <= 0)) 7910b57cec5SDimitry Andric return __t * __b + (1 - __t) * __a; 7920b57cec5SDimitry Andric 7930b57cec5SDimitry Andric if (__t == 1) return __b; 7940b57cec5SDimitry Andric const _Fp __x = __a + __t * (__b - __a); 795fe6060f1SDimitry Andric if ((__t > 1) == (__b > __a)) 7960b57cec5SDimitry Andric return __b < __x ? __x : __b; 7970b57cec5SDimitry Andric else 7980b57cec5SDimitry Andric return __x < __b ? __x : __b; 7990b57cec5SDimitry Andric} 8000b57cec5SDimitry Andric 801bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI constexpr float 8020b57cec5SDimitry Andriclerp(float __a, float __b, float __t) _NOEXCEPT { return __lerp(__a, __b, __t); } 8030b57cec5SDimitry Andric 804bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI constexpr double 8050b57cec5SDimitry Andriclerp(double __a, double __b, double __t) _NOEXCEPT { return __lerp(__a, __b, __t); } 8060b57cec5SDimitry Andric 807bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI constexpr long double 8080b57cec5SDimitry Andriclerp(long double __a, long double __b, long double __t) _NOEXCEPT { return __lerp(__a, __b, __t); } 8090b57cec5SDimitry Andric 81004eeddc0SDimitry Andrictemplate <class _A1, class _A2, class _A3> 81104eeddc0SDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 81204eeddc0SDimitry Andricconstexpr typename enable_if_t 81304eeddc0SDimitry Andric< 81404eeddc0SDimitry Andric is_arithmetic<_A1>::value && 81504eeddc0SDimitry Andric is_arithmetic<_A2>::value && 81604eeddc0SDimitry Andric is_arithmetic<_A3>::value, 81704eeddc0SDimitry Andric __promote<_A1, _A2, _A3> 81804eeddc0SDimitry Andric>::type 81904eeddc0SDimitry Andriclerp(_A1 __a, _A2 __b, _A3 __t) noexcept 82004eeddc0SDimitry Andric{ 82104eeddc0SDimitry Andric typedef typename __promote<_A1, _A2, _A3>::type __result_type; 82204eeddc0SDimitry Andric static_assert(!(_IsSame<_A1, __result_type>::value && 82304eeddc0SDimitry Andric _IsSame<_A2, __result_type>::value && 82404eeddc0SDimitry Andric _IsSame<_A3, __result_type>::value)); 825bdd1243dSDimitry Andric return std::__lerp((__result_type)__a, (__result_type)__b, (__result_type)__t); 82604eeddc0SDimitry Andric} 827*06c3fb27SDimitry Andric#endif // _LIBCPP_STD_VER >= 20 8280b57cec5SDimitry Andric 8290b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 8300b57cec5SDimitry Andric 8310b57cec5SDimitry Andric_LIBCPP_POP_MACROS 8320b57cec5SDimitry Andric 833bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 834bdd1243dSDimitry Andric# include <type_traits> 835bdd1243dSDimitry Andric#endif 836bdd1243dSDimitry Andric 8370b57cec5SDimitry Andric#endif // _LIBCPP_CMATH 838