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