xref: /freebsd/contrib/llvm-project/libcxx/include/cmath (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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