xref: /openbsd-src/gnu/llvm/libcxx/include/cmath (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
146035553Spatrick// -*- C++ -*-
2*4bdff4beSrobert//===----------------------------------------------------------------------===//
346035553Spatrick//
446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick// See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick//
846035553Spatrick//===----------------------------------------------------------------------===//
946035553Spatrick
1046035553Spatrick#ifndef _LIBCPP_CMATH
1146035553Spatrick#define _LIBCPP_CMATH
1246035553Spatrick
1346035553Spatrick/*
1446035553Spatrick    cmath synopsis
1546035553Spatrick
1646035553SpatrickMacros:
1746035553Spatrick
1846035553Spatrick    HUGE_VAL
1946035553Spatrick    HUGE_VALF               // C99
2046035553Spatrick    HUGE_VALL               // C99
2146035553Spatrick    INFINITY                // C99
2246035553Spatrick    NAN                     // C99
2346035553Spatrick    FP_INFINITE             // C99
2446035553Spatrick    FP_NAN                  // C99
2546035553Spatrick    FP_NORMAL               // C99
2646035553Spatrick    FP_SUBNORMAL            // C99
2746035553Spatrick    FP_ZERO                 // C99
2846035553Spatrick    FP_FAST_FMA             // C99
2946035553Spatrick    FP_FAST_FMAF            // C99
3046035553Spatrick    FP_FAST_FMAL            // C99
3146035553Spatrick    FP_ILOGB0               // C99
3246035553Spatrick    FP_ILOGBNAN             // C99
3346035553Spatrick    MATH_ERRNO              // C99
3446035553Spatrick    MATH_ERREXCEPT          // C99
3546035553Spatrick    math_errhandling        // C99
3646035553Spatrick
3746035553Spatricknamespace std
3846035553Spatrick{
3946035553Spatrick
4046035553SpatrickTypes:
4146035553Spatrick
4246035553Spatrick    float_t                 // C99
4346035553Spatrick    double_t                // C99
4446035553Spatrick
4546035553Spatrick// C90
4646035553Spatrick
4746035553Spatrickfloating_point abs(floating_point x);
4846035553Spatrick
4946035553Spatrickfloating_point acos (arithmetic x);
5046035553Spatrickfloat          acosf(float x);
5146035553Spatricklong double    acosl(long double x);
5246035553Spatrick
5346035553Spatrickfloating_point asin (arithmetic x);
5446035553Spatrickfloat          asinf(float x);
5546035553Spatricklong double    asinl(long double x);
5646035553Spatrick
5746035553Spatrickfloating_point atan (arithmetic x);
5846035553Spatrickfloat          atanf(float x);
5946035553Spatricklong double    atanl(long double x);
6046035553Spatrick
6146035553Spatrickfloating_point atan2 (arithmetic y, arithmetic x);
6246035553Spatrickfloat          atan2f(float y, float x);
6346035553Spatricklong double    atan2l(long double y, long double x);
6446035553Spatrick
6546035553Spatrickfloating_point ceil (arithmetic x);
6646035553Spatrickfloat          ceilf(float x);
6746035553Spatricklong double    ceill(long double x);
6846035553Spatrick
6946035553Spatrickfloating_point cos (arithmetic x);
7046035553Spatrickfloat          cosf(float x);
7146035553Spatricklong double    cosl(long double x);
7246035553Spatrick
7346035553Spatrickfloating_point cosh (arithmetic x);
7446035553Spatrickfloat          coshf(float x);
7546035553Spatricklong double    coshl(long double x);
7646035553Spatrick
7746035553Spatrickfloating_point exp (arithmetic x);
7846035553Spatrickfloat          expf(float x);
7946035553Spatricklong double    expl(long double x);
8046035553Spatrick
8146035553Spatrickfloating_point fabs (arithmetic x);
8246035553Spatrickfloat          fabsf(float x);
8346035553Spatricklong double    fabsl(long double x);
8446035553Spatrick
8546035553Spatrickfloating_point floor (arithmetic x);
8646035553Spatrickfloat          floorf(float x);
8746035553Spatricklong double    floorl(long double x);
8846035553Spatrick
8946035553Spatrickfloating_point fmod (arithmetic x, arithmetic y);
9046035553Spatrickfloat          fmodf(float x, float y);
9146035553Spatricklong double    fmodl(long double x, long double y);
9246035553Spatrick
9346035553Spatrickfloating_point frexp (arithmetic value, int* exp);
9446035553Spatrickfloat          frexpf(float value, int* exp);
9546035553Spatricklong double    frexpl(long double value, int* exp);
9646035553Spatrick
9746035553Spatrickfloating_point ldexp (arithmetic value, int exp);
9846035553Spatrickfloat          ldexpf(float value, int exp);
9946035553Spatricklong double    ldexpl(long double value, int exp);
10046035553Spatrick
10146035553Spatrickfloating_point log (arithmetic x);
10246035553Spatrickfloat          logf(float x);
10346035553Spatricklong double    logl(long double x);
10446035553Spatrick
10546035553Spatrickfloating_point log10 (arithmetic x);
10646035553Spatrickfloat          log10f(float x);
10746035553Spatricklong double    log10l(long double x);
10846035553Spatrick
10946035553Spatrickfloating_point modf (floating_point value, floating_point* iptr);
11046035553Spatrickfloat          modff(float value, float* iptr);
11146035553Spatricklong double    modfl(long double value, long double* iptr);
11246035553Spatrick
11346035553Spatrickfloating_point pow (arithmetic x, arithmetic y);
11446035553Spatrickfloat          powf(float x, float y);
11546035553Spatricklong double    powl(long double x, long double y);
11646035553Spatrick
11746035553Spatrickfloating_point sin (arithmetic x);
11846035553Spatrickfloat          sinf(float x);
11946035553Spatricklong double    sinl(long double x);
12046035553Spatrick
12146035553Spatrickfloating_point sinh (arithmetic x);
12246035553Spatrickfloat          sinhf(float x);
12346035553Spatricklong double    sinhl(long double x);
12446035553Spatrick
12546035553Spatrickfloating_point sqrt (arithmetic x);
12646035553Spatrickfloat          sqrtf(float x);
12746035553Spatricklong double    sqrtl(long double x);
12846035553Spatrick
12946035553Spatrickfloating_point tan (arithmetic x);
13046035553Spatrickfloat          tanf(float x);
13146035553Spatricklong double    tanl(long double x);
13246035553Spatrick
13346035553Spatrickfloating_point tanh (arithmetic x);
13446035553Spatrickfloat          tanhf(float x);
13546035553Spatricklong double    tanhl(long double x);
13646035553Spatrick
13746035553Spatrick//  C99
13846035553Spatrick
13946035553Spatrickbool signbit(arithmetic x);
14046035553Spatrick
14146035553Spatrickint fpclassify(arithmetic x);
14246035553Spatrick
14346035553Spatrickbool isfinite(arithmetic x);
14446035553Spatrickbool isinf(arithmetic x);
14546035553Spatrickbool isnan(arithmetic x);
14646035553Spatrickbool isnormal(arithmetic x);
14746035553Spatrick
14846035553Spatrickbool isgreater(arithmetic x, arithmetic y);
14946035553Spatrickbool isgreaterequal(arithmetic x, arithmetic y);
15046035553Spatrickbool isless(arithmetic x, arithmetic y);
15146035553Spatrickbool islessequal(arithmetic x, arithmetic y);
15246035553Spatrickbool islessgreater(arithmetic x, arithmetic y);
15346035553Spatrickbool isunordered(arithmetic x, arithmetic y);
15446035553Spatrick
15546035553Spatrickfloating_point acosh (arithmetic x);
15646035553Spatrickfloat          acoshf(float x);
15746035553Spatricklong double    acoshl(long double x);
15846035553Spatrick
15946035553Spatrickfloating_point asinh (arithmetic x);
16046035553Spatrickfloat          asinhf(float x);
16146035553Spatricklong double    asinhl(long double x);
16246035553Spatrick
16346035553Spatrickfloating_point atanh (arithmetic x);
16446035553Spatrickfloat          atanhf(float x);
16546035553Spatricklong double    atanhl(long double x);
16646035553Spatrick
16746035553Spatrickfloating_point cbrt (arithmetic x);
16846035553Spatrickfloat          cbrtf(float x);
16946035553Spatricklong double    cbrtl(long double x);
17046035553Spatrick
17146035553Spatrickfloating_point copysign (arithmetic x, arithmetic y);
17246035553Spatrickfloat          copysignf(float x, float y);
17346035553Spatricklong double    copysignl(long double x, long double y);
17446035553Spatrick
17546035553Spatrickfloating_point erf (arithmetic x);
17646035553Spatrickfloat          erff(float x);
17746035553Spatricklong double    erfl(long double x);
17846035553Spatrick
17946035553Spatrickfloating_point erfc (arithmetic x);
18046035553Spatrickfloat          erfcf(float x);
18146035553Spatricklong double    erfcl(long double x);
18246035553Spatrick
18346035553Spatrickfloating_point exp2 (arithmetic x);
18446035553Spatrickfloat          exp2f(float x);
18546035553Spatricklong double    exp2l(long double x);
18646035553Spatrick
18746035553Spatrickfloating_point expm1 (arithmetic x);
18846035553Spatrickfloat          expm1f(float x);
18946035553Spatricklong double    expm1l(long double x);
19046035553Spatrick
19146035553Spatrickfloating_point fdim (arithmetic x, arithmetic y);
19246035553Spatrickfloat          fdimf(float x, float y);
19346035553Spatricklong double    fdiml(long double x, long double y);
19446035553Spatrick
19546035553Spatrickfloating_point fma (arithmetic x, arithmetic y, arithmetic z);
19646035553Spatrickfloat          fmaf(float x, float y, float z);
19746035553Spatricklong double    fmal(long double x, long double y, long double z);
19846035553Spatrick
19946035553Spatrickfloating_point fmax (arithmetic x, arithmetic y);
20046035553Spatrickfloat          fmaxf(float x, float y);
20146035553Spatricklong double    fmaxl(long double x, long double y);
20246035553Spatrick
20346035553Spatrickfloating_point fmin (arithmetic x, arithmetic y);
20446035553Spatrickfloat          fminf(float x, float y);
20546035553Spatricklong double    fminl(long double x, long double y);
20646035553Spatrick
20746035553Spatrickfloating_point hypot (arithmetic x, arithmetic y);
20846035553Spatrickfloat          hypotf(float x, float y);
20946035553Spatricklong double    hypotl(long double x, long double y);
21046035553Spatrick
21146035553Spatrickdouble       hypot(double x, double y, double z);                // C++17
21246035553Spatrickfloat        hypot(float x, float y, float z);                   // C++17
21346035553Spatricklong double  hypot(long double x, long double y, long double z); // C++17
21446035553Spatrick
21546035553Spatrickint ilogb (arithmetic x);
21646035553Spatrickint ilogbf(float x);
21746035553Spatrickint ilogbl(long double x);
21846035553Spatrick
21946035553Spatrickfloating_point lgamma (arithmetic x);
22046035553Spatrickfloat          lgammaf(float x);
22146035553Spatricklong double    lgammal(long double x);
22246035553Spatrick
22346035553Spatricklong long llrint (arithmetic x);
22446035553Spatricklong long llrintf(float x);
22546035553Spatricklong long llrintl(long double x);
22646035553Spatrick
22746035553Spatricklong long llround (arithmetic x);
22846035553Spatricklong long llroundf(float x);
22946035553Spatricklong long llroundl(long double x);
23046035553Spatrick
23146035553Spatrickfloating_point log1p (arithmetic x);
23246035553Spatrickfloat          log1pf(float x);
23346035553Spatricklong double    log1pl(long double x);
23446035553Spatrick
23546035553Spatrickfloating_point log2 (arithmetic x);
23646035553Spatrickfloat          log2f(float x);
23746035553Spatricklong double    log2l(long double x);
23846035553Spatrick
23946035553Spatrickfloating_point logb (arithmetic x);
24046035553Spatrickfloat          logbf(float x);
24146035553Spatricklong double    logbl(long double x);
24246035553Spatrick
24346035553Spatricklong lrint (arithmetic x);
24446035553Spatricklong lrintf(float x);
24546035553Spatricklong lrintl(long double x);
24646035553Spatrick
24746035553Spatricklong lround (arithmetic x);
24846035553Spatricklong lroundf(float x);
24946035553Spatricklong lroundl(long double x);
25046035553Spatrick
25146035553Spatrickdouble      nan (const char* str);
25246035553Spatrickfloat       nanf(const char* str);
25346035553Spatricklong double nanl(const char* str);
25446035553Spatrick
25546035553Spatrickfloating_point nearbyint (arithmetic x);
25646035553Spatrickfloat          nearbyintf(float x);
25746035553Spatricklong double    nearbyintl(long double x);
25846035553Spatrick
25946035553Spatrickfloating_point nextafter (arithmetic x, arithmetic y);
26046035553Spatrickfloat          nextafterf(float x, float y);
26146035553Spatricklong double    nextafterl(long double x, long double y);
26246035553Spatrick
26346035553Spatrickfloating_point nexttoward (arithmetic x, long double y);
26446035553Spatrickfloat          nexttowardf(float x, long double y);
26546035553Spatricklong double    nexttowardl(long double x, long double y);
26646035553Spatrick
26746035553Spatrickfloating_point remainder (arithmetic x, arithmetic y);
26846035553Spatrickfloat          remainderf(float x, float y);
26946035553Spatricklong double    remainderl(long double x, long double y);
27046035553Spatrick
27146035553Spatrickfloating_point remquo (arithmetic x, arithmetic y, int* pquo);
27246035553Spatrickfloat          remquof(float x, float y, int* pquo);
27346035553Spatricklong double    remquol(long double x, long double y, int* pquo);
27446035553Spatrick
27546035553Spatrickfloating_point rint (arithmetic x);
27646035553Spatrickfloat          rintf(float x);
27746035553Spatricklong double    rintl(long double x);
27846035553Spatrick
27946035553Spatrickfloating_point round (arithmetic x);
28046035553Spatrickfloat          roundf(float x);
28146035553Spatricklong double    roundl(long double x);
28246035553Spatrick
28346035553Spatrickfloating_point scalbln (arithmetic x, long ex);
28446035553Spatrickfloat          scalblnf(float x, long ex);
28546035553Spatricklong double    scalblnl(long double x, long ex);
28646035553Spatrick
28746035553Spatrickfloating_point scalbn (arithmetic x, int ex);
28846035553Spatrickfloat          scalbnf(float x, int ex);
28946035553Spatricklong double    scalbnl(long double x, int ex);
29046035553Spatrick
29146035553Spatrickfloating_point tgamma (arithmetic x);
29246035553Spatrickfloat          tgammaf(float x);
29346035553Spatricklong double    tgammal(long double x);
29446035553Spatrick
29546035553Spatrickfloating_point trunc (arithmetic x);
29646035553Spatrickfloat          truncf(float x);
29746035553Spatricklong double    truncl(long double x);
29846035553Spatrick
299037e7968Spatrickconstexpr float       lerp(float a, float b, float t) noexcept;                   // C++20
300037e7968Spatrickconstexpr double      lerp(double a, double b, double t) noexcept;                // C++20
301037e7968Spatrickconstexpr long double lerp(long double a, long double b, long double t) noexcept; // C++20
302037e7968Spatrick
30346035553Spatrick}  // std
30446035553Spatrick
30546035553Spatrick*/
30646035553Spatrick
307*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler
30846035553Spatrick#include <__config>
309*4bdff4beSrobert#include <__type_traits/enable_if.h>
310*4bdff4beSrobert#include <__type_traits/is_arithmetic.h>
311*4bdff4beSrobert#include <__type_traits/is_constant_evaluated.h>
312*4bdff4beSrobert#include <__type_traits/is_floating_point.h>
313*4bdff4beSrobert#include <__type_traits/is_same.h>
314*4bdff4beSrobert#include <__type_traits/remove_cv.h>
31546035553Spatrick#include <version>
316*4bdff4beSrobert
317*4bdff4beSrobert#include <math.h>
318*4bdff4beSrobert
319*4bdff4beSrobert#ifndef _LIBCPP_MATH_H
320*4bdff4beSrobert#   error <cmath> tried including <math.h> but didn't find libc++'s <math.h> header. \
321*4bdff4beSrobert          This usually means that your header search paths are not configured properly. \
322*4bdff4beSrobert          The header search paths should contain the C++ Standard Library headers before \
323*4bdff4beSrobert          any C Standard Library, and you are probably using compiler flags that make that \
324*4bdff4beSrobert          not be the case.
325*4bdff4beSrobert#endif
32646035553Spatrick
32746035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
32846035553Spatrick#  pragma GCC system_header
32946035553Spatrick#endif
33046035553Spatrick
33146035553Spatrick_LIBCPP_PUSH_MACROS
33246035553Spatrick#include <__undef_macros>
33346035553Spatrick
33446035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD
33546035553Spatrick
33676d0caaeSpatrickusing ::signbit _LIBCPP_USING_IF_EXISTS;
33776d0caaeSpatrickusing ::fpclassify _LIBCPP_USING_IF_EXISTS;
33876d0caaeSpatrickusing ::isfinite _LIBCPP_USING_IF_EXISTS;
33976d0caaeSpatrickusing ::isinf _LIBCPP_USING_IF_EXISTS;
34076d0caaeSpatrickusing ::isnan _LIBCPP_USING_IF_EXISTS;
34176d0caaeSpatrickusing ::isnormal _LIBCPP_USING_IF_EXISTS;
34276d0caaeSpatrickusing ::isgreater _LIBCPP_USING_IF_EXISTS;
34376d0caaeSpatrickusing ::isgreaterequal _LIBCPP_USING_IF_EXISTS;
34476d0caaeSpatrickusing ::isless _LIBCPP_USING_IF_EXISTS;
34576d0caaeSpatrickusing ::islessequal _LIBCPP_USING_IF_EXISTS;
34676d0caaeSpatrickusing ::islessgreater _LIBCPP_USING_IF_EXISTS;
34776d0caaeSpatrickusing ::isunordered _LIBCPP_USING_IF_EXISTS;
34876d0caaeSpatrickusing ::isunordered _LIBCPP_USING_IF_EXISTS;
34946035553Spatrick
35076d0caaeSpatrickusing ::float_t _LIBCPP_USING_IF_EXISTS;
35176d0caaeSpatrickusing ::double_t _LIBCPP_USING_IF_EXISTS;
35246035553Spatrick
35376d0caaeSpatrickusing ::abs _LIBCPP_USING_IF_EXISTS;
35446035553Spatrick
35576d0caaeSpatrickusing ::acos _LIBCPP_USING_IF_EXISTS;
35676d0caaeSpatrickusing ::acosf _LIBCPP_USING_IF_EXISTS;
35776d0caaeSpatrickusing ::asin _LIBCPP_USING_IF_EXISTS;
35876d0caaeSpatrickusing ::asinf _LIBCPP_USING_IF_EXISTS;
35976d0caaeSpatrickusing ::atan _LIBCPP_USING_IF_EXISTS;
36076d0caaeSpatrickusing ::atanf _LIBCPP_USING_IF_EXISTS;
36176d0caaeSpatrickusing ::atan2 _LIBCPP_USING_IF_EXISTS;
36276d0caaeSpatrickusing ::atan2f _LIBCPP_USING_IF_EXISTS;
36376d0caaeSpatrickusing ::ceil _LIBCPP_USING_IF_EXISTS;
36476d0caaeSpatrickusing ::ceilf _LIBCPP_USING_IF_EXISTS;
36576d0caaeSpatrickusing ::cos _LIBCPP_USING_IF_EXISTS;
36676d0caaeSpatrickusing ::cosf _LIBCPP_USING_IF_EXISTS;
36776d0caaeSpatrickusing ::cosh _LIBCPP_USING_IF_EXISTS;
36876d0caaeSpatrickusing ::coshf _LIBCPP_USING_IF_EXISTS;
36946035553Spatrick
37076d0caaeSpatrickusing ::exp _LIBCPP_USING_IF_EXISTS;
37176d0caaeSpatrickusing ::expf _LIBCPP_USING_IF_EXISTS;
37246035553Spatrick
37376d0caaeSpatrickusing ::fabs _LIBCPP_USING_IF_EXISTS;
37476d0caaeSpatrickusing ::fabsf _LIBCPP_USING_IF_EXISTS;
37576d0caaeSpatrickusing ::floor _LIBCPP_USING_IF_EXISTS;
37676d0caaeSpatrickusing ::floorf _LIBCPP_USING_IF_EXISTS;
37746035553Spatrick
37876d0caaeSpatrickusing ::fmod _LIBCPP_USING_IF_EXISTS;
37976d0caaeSpatrickusing ::fmodf _LIBCPP_USING_IF_EXISTS;
38046035553Spatrick
38176d0caaeSpatrickusing ::frexp _LIBCPP_USING_IF_EXISTS;
38276d0caaeSpatrickusing ::frexpf _LIBCPP_USING_IF_EXISTS;
38376d0caaeSpatrickusing ::ldexp _LIBCPP_USING_IF_EXISTS;
38476d0caaeSpatrickusing ::ldexpf _LIBCPP_USING_IF_EXISTS;
38546035553Spatrick
38676d0caaeSpatrickusing ::log _LIBCPP_USING_IF_EXISTS;
38776d0caaeSpatrickusing ::logf _LIBCPP_USING_IF_EXISTS;
38846035553Spatrick
38976d0caaeSpatrickusing ::log10 _LIBCPP_USING_IF_EXISTS;
39076d0caaeSpatrickusing ::log10f _LIBCPP_USING_IF_EXISTS;
39176d0caaeSpatrickusing ::modf _LIBCPP_USING_IF_EXISTS;
39276d0caaeSpatrickusing ::modff _LIBCPP_USING_IF_EXISTS;
39346035553Spatrick
39476d0caaeSpatrickusing ::pow _LIBCPP_USING_IF_EXISTS;
39576d0caaeSpatrickusing ::powf _LIBCPP_USING_IF_EXISTS;
39646035553Spatrick
39776d0caaeSpatrickusing ::sin _LIBCPP_USING_IF_EXISTS;
39876d0caaeSpatrickusing ::sinf _LIBCPP_USING_IF_EXISTS;
39976d0caaeSpatrickusing ::sinh _LIBCPP_USING_IF_EXISTS;
40076d0caaeSpatrickusing ::sinhf _LIBCPP_USING_IF_EXISTS;
40146035553Spatrick
40276d0caaeSpatrickusing ::sqrt _LIBCPP_USING_IF_EXISTS;
40376d0caaeSpatrickusing ::sqrtf _LIBCPP_USING_IF_EXISTS;
40476d0caaeSpatrickusing ::tan _LIBCPP_USING_IF_EXISTS;
40576d0caaeSpatrickusing ::tanf _LIBCPP_USING_IF_EXISTS;
40646035553Spatrick
40776d0caaeSpatrickusing ::tanh _LIBCPP_USING_IF_EXISTS;
40876d0caaeSpatrickusing ::tanhf _LIBCPP_USING_IF_EXISTS;
40946035553Spatrick
41076d0caaeSpatrickusing ::acosh _LIBCPP_USING_IF_EXISTS;
41176d0caaeSpatrickusing ::acoshf _LIBCPP_USING_IF_EXISTS;
41276d0caaeSpatrickusing ::asinh _LIBCPP_USING_IF_EXISTS;
41376d0caaeSpatrickusing ::asinhf _LIBCPP_USING_IF_EXISTS;
41476d0caaeSpatrickusing ::atanh _LIBCPP_USING_IF_EXISTS;
41576d0caaeSpatrickusing ::atanhf _LIBCPP_USING_IF_EXISTS;
41676d0caaeSpatrickusing ::cbrt _LIBCPP_USING_IF_EXISTS;
41776d0caaeSpatrickusing ::cbrtf _LIBCPP_USING_IF_EXISTS;
41846035553Spatrick
41976d0caaeSpatrickusing ::copysign _LIBCPP_USING_IF_EXISTS;
42076d0caaeSpatrickusing ::copysignf _LIBCPP_USING_IF_EXISTS;
42146035553Spatrick
42276d0caaeSpatrickusing ::erf _LIBCPP_USING_IF_EXISTS;
42376d0caaeSpatrickusing ::erff _LIBCPP_USING_IF_EXISTS;
42476d0caaeSpatrickusing ::erfc _LIBCPP_USING_IF_EXISTS;
42576d0caaeSpatrickusing ::erfcf _LIBCPP_USING_IF_EXISTS;
42676d0caaeSpatrickusing ::exp2 _LIBCPP_USING_IF_EXISTS;
42776d0caaeSpatrickusing ::exp2f _LIBCPP_USING_IF_EXISTS;
42876d0caaeSpatrickusing ::expm1 _LIBCPP_USING_IF_EXISTS;
42976d0caaeSpatrickusing ::expm1f _LIBCPP_USING_IF_EXISTS;
43076d0caaeSpatrickusing ::fdim _LIBCPP_USING_IF_EXISTS;
43176d0caaeSpatrickusing ::fdimf _LIBCPP_USING_IF_EXISTS;
43276d0caaeSpatrickusing ::fmaf _LIBCPP_USING_IF_EXISTS;
43376d0caaeSpatrickusing ::fma _LIBCPP_USING_IF_EXISTS;
43476d0caaeSpatrickusing ::fmax _LIBCPP_USING_IF_EXISTS;
43576d0caaeSpatrickusing ::fmaxf _LIBCPP_USING_IF_EXISTS;
43676d0caaeSpatrickusing ::fmin _LIBCPP_USING_IF_EXISTS;
43776d0caaeSpatrickusing ::fminf _LIBCPP_USING_IF_EXISTS;
43876d0caaeSpatrickusing ::hypot _LIBCPP_USING_IF_EXISTS;
43976d0caaeSpatrickusing ::hypotf _LIBCPP_USING_IF_EXISTS;
44076d0caaeSpatrickusing ::ilogb _LIBCPP_USING_IF_EXISTS;
44176d0caaeSpatrickusing ::ilogbf _LIBCPP_USING_IF_EXISTS;
44276d0caaeSpatrickusing ::lgamma _LIBCPP_USING_IF_EXISTS;
44376d0caaeSpatrickusing ::lgammaf _LIBCPP_USING_IF_EXISTS;
44476d0caaeSpatrickusing ::llrint _LIBCPP_USING_IF_EXISTS;
44576d0caaeSpatrickusing ::llrintf _LIBCPP_USING_IF_EXISTS;
44676d0caaeSpatrickusing ::llround _LIBCPP_USING_IF_EXISTS;
44776d0caaeSpatrickusing ::llroundf _LIBCPP_USING_IF_EXISTS;
44876d0caaeSpatrickusing ::log1p _LIBCPP_USING_IF_EXISTS;
44976d0caaeSpatrickusing ::log1pf _LIBCPP_USING_IF_EXISTS;
45076d0caaeSpatrickusing ::log2 _LIBCPP_USING_IF_EXISTS;
45176d0caaeSpatrickusing ::log2f _LIBCPP_USING_IF_EXISTS;
45276d0caaeSpatrickusing ::logb _LIBCPP_USING_IF_EXISTS;
45376d0caaeSpatrickusing ::logbf _LIBCPP_USING_IF_EXISTS;
45476d0caaeSpatrickusing ::lrint _LIBCPP_USING_IF_EXISTS;
45576d0caaeSpatrickusing ::lrintf _LIBCPP_USING_IF_EXISTS;
45676d0caaeSpatrickusing ::lround _LIBCPP_USING_IF_EXISTS;
45776d0caaeSpatrickusing ::lroundf _LIBCPP_USING_IF_EXISTS;
45846035553Spatrick
45976d0caaeSpatrickusing ::nan _LIBCPP_USING_IF_EXISTS;
46076d0caaeSpatrickusing ::nanf _LIBCPP_USING_IF_EXISTS;
46146035553Spatrick
46276d0caaeSpatrickusing ::nearbyint _LIBCPP_USING_IF_EXISTS;
46376d0caaeSpatrickusing ::nearbyintf _LIBCPP_USING_IF_EXISTS;
46476d0caaeSpatrickusing ::nextafter _LIBCPP_USING_IF_EXISTS;
46576d0caaeSpatrickusing ::nextafterf _LIBCPP_USING_IF_EXISTS;
46676d0caaeSpatrickusing ::nexttoward _LIBCPP_USING_IF_EXISTS;
46776d0caaeSpatrickusing ::nexttowardf _LIBCPP_USING_IF_EXISTS;
46876d0caaeSpatrickusing ::remainder _LIBCPP_USING_IF_EXISTS;
46976d0caaeSpatrickusing ::remainderf _LIBCPP_USING_IF_EXISTS;
47076d0caaeSpatrickusing ::remquo _LIBCPP_USING_IF_EXISTS;
47176d0caaeSpatrickusing ::remquof _LIBCPP_USING_IF_EXISTS;
47276d0caaeSpatrickusing ::rint _LIBCPP_USING_IF_EXISTS;
47376d0caaeSpatrickusing ::rintf _LIBCPP_USING_IF_EXISTS;
47476d0caaeSpatrickusing ::round _LIBCPP_USING_IF_EXISTS;
47576d0caaeSpatrickusing ::roundf _LIBCPP_USING_IF_EXISTS;
47676d0caaeSpatrickusing ::scalbln _LIBCPP_USING_IF_EXISTS;
47776d0caaeSpatrickusing ::scalblnf _LIBCPP_USING_IF_EXISTS;
47876d0caaeSpatrickusing ::scalbn _LIBCPP_USING_IF_EXISTS;
47976d0caaeSpatrickusing ::scalbnf _LIBCPP_USING_IF_EXISTS;
48076d0caaeSpatrickusing ::tgamma _LIBCPP_USING_IF_EXISTS;
48176d0caaeSpatrickusing ::tgammaf _LIBCPP_USING_IF_EXISTS;
48276d0caaeSpatrickusing ::trunc _LIBCPP_USING_IF_EXISTS;
48376d0caaeSpatrickusing ::truncf _LIBCPP_USING_IF_EXISTS;
48446035553Spatrick
48576d0caaeSpatrickusing ::acosl _LIBCPP_USING_IF_EXISTS;
48676d0caaeSpatrickusing ::asinl _LIBCPP_USING_IF_EXISTS;
48776d0caaeSpatrickusing ::atanl _LIBCPP_USING_IF_EXISTS;
48876d0caaeSpatrickusing ::atan2l _LIBCPP_USING_IF_EXISTS;
48976d0caaeSpatrickusing ::ceill _LIBCPP_USING_IF_EXISTS;
49076d0caaeSpatrickusing ::cosl _LIBCPP_USING_IF_EXISTS;
49176d0caaeSpatrickusing ::coshl _LIBCPP_USING_IF_EXISTS;
49276d0caaeSpatrickusing ::expl _LIBCPP_USING_IF_EXISTS;
49376d0caaeSpatrickusing ::fabsl _LIBCPP_USING_IF_EXISTS;
49476d0caaeSpatrickusing ::floorl _LIBCPP_USING_IF_EXISTS;
49576d0caaeSpatrickusing ::fmodl _LIBCPP_USING_IF_EXISTS;
49676d0caaeSpatrickusing ::frexpl _LIBCPP_USING_IF_EXISTS;
49776d0caaeSpatrickusing ::ldexpl _LIBCPP_USING_IF_EXISTS;
49876d0caaeSpatrickusing ::logl _LIBCPP_USING_IF_EXISTS;
49976d0caaeSpatrickusing ::log10l _LIBCPP_USING_IF_EXISTS;
50076d0caaeSpatrickusing ::modfl _LIBCPP_USING_IF_EXISTS;
50176d0caaeSpatrickusing ::powl _LIBCPP_USING_IF_EXISTS;
50276d0caaeSpatrickusing ::sinl _LIBCPP_USING_IF_EXISTS;
50376d0caaeSpatrickusing ::sinhl _LIBCPP_USING_IF_EXISTS;
50476d0caaeSpatrickusing ::sqrtl _LIBCPP_USING_IF_EXISTS;
50576d0caaeSpatrickusing ::tanl _LIBCPP_USING_IF_EXISTS;
50646035553Spatrick
50776d0caaeSpatrickusing ::tanhl _LIBCPP_USING_IF_EXISTS;
50876d0caaeSpatrickusing ::acoshl _LIBCPP_USING_IF_EXISTS;
50976d0caaeSpatrickusing ::asinhl _LIBCPP_USING_IF_EXISTS;
51076d0caaeSpatrickusing ::atanhl _LIBCPP_USING_IF_EXISTS;
51176d0caaeSpatrickusing ::cbrtl _LIBCPP_USING_IF_EXISTS;
51246035553Spatrick
51376d0caaeSpatrickusing ::copysignl _LIBCPP_USING_IF_EXISTS;
51446035553Spatrick
51576d0caaeSpatrickusing ::erfl _LIBCPP_USING_IF_EXISTS;
51676d0caaeSpatrickusing ::erfcl _LIBCPP_USING_IF_EXISTS;
51776d0caaeSpatrickusing ::exp2l _LIBCPP_USING_IF_EXISTS;
51876d0caaeSpatrickusing ::expm1l _LIBCPP_USING_IF_EXISTS;
51976d0caaeSpatrickusing ::fdiml _LIBCPP_USING_IF_EXISTS;
52076d0caaeSpatrickusing ::fmal _LIBCPP_USING_IF_EXISTS;
52176d0caaeSpatrickusing ::fmaxl _LIBCPP_USING_IF_EXISTS;
52276d0caaeSpatrickusing ::fminl _LIBCPP_USING_IF_EXISTS;
52376d0caaeSpatrickusing ::hypotl _LIBCPP_USING_IF_EXISTS;
52476d0caaeSpatrickusing ::ilogbl _LIBCPP_USING_IF_EXISTS;
52576d0caaeSpatrickusing ::lgammal _LIBCPP_USING_IF_EXISTS;
52676d0caaeSpatrickusing ::llrintl _LIBCPP_USING_IF_EXISTS;
52776d0caaeSpatrickusing ::llroundl _LIBCPP_USING_IF_EXISTS;
52876d0caaeSpatrickusing ::log1pl _LIBCPP_USING_IF_EXISTS;
52976d0caaeSpatrickusing ::log2l _LIBCPP_USING_IF_EXISTS;
53076d0caaeSpatrickusing ::logbl _LIBCPP_USING_IF_EXISTS;
53176d0caaeSpatrickusing ::lrintl _LIBCPP_USING_IF_EXISTS;
53276d0caaeSpatrickusing ::lroundl _LIBCPP_USING_IF_EXISTS;
53376d0caaeSpatrickusing ::nanl _LIBCPP_USING_IF_EXISTS;
53476d0caaeSpatrickusing ::nearbyintl _LIBCPP_USING_IF_EXISTS;
53576d0caaeSpatrickusing ::nextafterl _LIBCPP_USING_IF_EXISTS;
53676d0caaeSpatrickusing ::nexttowardl _LIBCPP_USING_IF_EXISTS;
53776d0caaeSpatrickusing ::remainderl _LIBCPP_USING_IF_EXISTS;
53876d0caaeSpatrickusing ::remquol _LIBCPP_USING_IF_EXISTS;
53976d0caaeSpatrickusing ::rintl _LIBCPP_USING_IF_EXISTS;
54076d0caaeSpatrickusing ::roundl _LIBCPP_USING_IF_EXISTS;
54176d0caaeSpatrickusing ::scalblnl _LIBCPP_USING_IF_EXISTS;
54276d0caaeSpatrickusing ::scalbnl _LIBCPP_USING_IF_EXISTS;
54376d0caaeSpatrickusing ::tgammal _LIBCPP_USING_IF_EXISTS;
54476d0caaeSpatrickusing ::truncl _LIBCPP_USING_IF_EXISTS;
54546035553Spatrick
54646035553Spatrick#if _LIBCPP_STD_VER > 14
547*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY float       hypot(       float __x,       float __y,       float __z ) { return sqrt(__x*__x + __y*__y + __z*__z); }
548*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY double      hypot(      double __x,      double __y,      double __z ) { return sqrt(__x*__x + __y*__y + __z*__z); }
549*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY long double hypot( long double __x, long double __y, long double __z ) { return sqrt(__x*__x + __y*__y + __z*__z); }
55046035553Spatrick
55146035553Spatricktemplate <class _A1, class _A2, class _A3>
55246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
553*4bdff4beSroberttypename enable_if_t
55446035553Spatrick<
55546035553Spatrick    is_arithmetic<_A1>::value &&
55646035553Spatrick    is_arithmetic<_A2>::value &&
55746035553Spatrick    is_arithmetic<_A3>::value,
55846035553Spatrick    __promote<_A1, _A2, _A3>
55946035553Spatrick>::type
56046035553Spatrickhypot(_A1 __lcpp_x, _A2 __lcpp_y, _A3 __lcpp_z) _NOEXCEPT
56146035553Spatrick{
56246035553Spatrick    typedef typename __promote<_A1, _A2, _A3>::type __result_type;
56346035553Spatrick    static_assert((!(is_same<_A1, __result_type>::value &&
56446035553Spatrick                     is_same<_A2, __result_type>::value &&
56546035553Spatrick                     is_same<_A3, __result_type>::value)), "");
566*4bdff4beSrobert    return std::hypot((__result_type)__lcpp_x, (__result_type)__lcpp_y, (__result_type)__lcpp_z);
56746035553Spatrick}
56846035553Spatrick#endif
56946035553Spatrick
57046035553Spatricktemplate <class _A1>
57146035553Spatrick_LIBCPP_INLINE_VISIBILITY
57246035553Spatrick_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type
573*4bdff4beSrobert__constexpr_isnan(_A1 __lcpp_x) _NOEXCEPT
57446035553Spatrick{
57546035553Spatrick#if __has_builtin(__builtin_isnan)
57646035553Spatrick    return __builtin_isnan(__lcpp_x);
57746035553Spatrick#else
57846035553Spatrick    return isnan(__lcpp_x);
57946035553Spatrick#endif
58046035553Spatrick}
58146035553Spatrick
58246035553Spatricktemplate <class _A1>
58346035553Spatrick_LIBCPP_INLINE_VISIBILITY
58446035553Spatrick_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type
585*4bdff4beSrobert__constexpr_isnan(_A1 __lcpp_x) _NOEXCEPT
58646035553Spatrick{
587*4bdff4beSrobert    return std::isnan(__lcpp_x);
58846035553Spatrick}
58946035553Spatrick
59046035553Spatricktemplate <class _A1>
59146035553Spatrick_LIBCPP_INLINE_VISIBILITY
59246035553Spatrick_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type
593*4bdff4beSrobert__constexpr_isinf(_A1 __lcpp_x) _NOEXCEPT
59446035553Spatrick{
59546035553Spatrick#if __has_builtin(__builtin_isinf)
59646035553Spatrick    return __builtin_isinf(__lcpp_x);
59746035553Spatrick#else
59846035553Spatrick    return isinf(__lcpp_x);
59946035553Spatrick#endif
60046035553Spatrick}
60146035553Spatrick
60246035553Spatricktemplate <class _A1>
60346035553Spatrick_LIBCPP_INLINE_VISIBILITY
60446035553Spatrick_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type
605*4bdff4beSrobert__constexpr_isinf(_A1 __lcpp_x) _NOEXCEPT
60646035553Spatrick{
607*4bdff4beSrobert    return std::isinf(__lcpp_x);
60846035553Spatrick}
60946035553Spatrick
61046035553Spatricktemplate <class _A1>
61146035553Spatrick_LIBCPP_INLINE_VISIBILITY
61246035553Spatrick_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type
613*4bdff4beSrobert__constexpr_isfinite(_A1 __lcpp_x) _NOEXCEPT
61446035553Spatrick{
61546035553Spatrick#if __has_builtin(__builtin_isfinite)
61646035553Spatrick    return __builtin_isfinite(__lcpp_x);
61746035553Spatrick#else
61846035553Spatrick    return isfinite(__lcpp_x);
61946035553Spatrick#endif
62046035553Spatrick}
62146035553Spatrick
62246035553Spatricktemplate <class _A1>
62346035553Spatrick_LIBCPP_INLINE_VISIBILITY
62446035553Spatrick_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type
625*4bdff4beSrobert__constexpr_isfinite(_A1 __lcpp_x) _NOEXCEPT
62646035553Spatrick{
627*4bdff4beSrobert    return __builtin_isfinite(__lcpp_x);
628*4bdff4beSrobert}
629*4bdff4beSrobert
630*4bdff4beSrobert_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI float __constexpr_copysign(float __x, float __y) _NOEXCEPT {
631*4bdff4beSrobert    return __builtin_copysignf(__x, __y);
632*4bdff4beSrobert}
633*4bdff4beSrobert
634*4bdff4beSrobert_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI double __constexpr_copysign(double __x, double __y) _NOEXCEPT {
635*4bdff4beSrobert    return __builtin_copysign(__x, __y);
636*4bdff4beSrobert}
637*4bdff4beSrobert
638*4bdff4beSrobert_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI long double
639*4bdff4beSrobert__constexpr_copysign(long double __x, long double __y) _NOEXCEPT {
640*4bdff4beSrobert    return __builtin_copysignl(__x, __y);
641*4bdff4beSrobert}
642*4bdff4beSrobert
643*4bdff4beSroberttemplate <class _A1, class _A2>
644*4bdff4beSrobert_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI
645*4bdff4beSrobert    typename std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value,
646*4bdff4beSrobert                                std::__promote<_A1, _A2> >::type
647*4bdff4beSrobert    __constexpr_copysign(_A1 __x, _A2 __y) _NOEXCEPT {
648*4bdff4beSrobert    typedef typename std::__promote<_A1, _A2>::type __result_type;
649*4bdff4beSrobert    static_assert((!(std::_IsSame<_A1, __result_type>::value && std::_IsSame<_A2, __result_type>::value)), "");
650*4bdff4beSrobert    return __builtin_copysign((__result_type)__x, (__result_type)__y);
651*4bdff4beSrobert}
652*4bdff4beSrobert
653*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR float __constexpr_fabs(float __x) _NOEXCEPT {
654*4bdff4beSrobert    return __builtin_fabsf(__x);
655*4bdff4beSrobert}
656*4bdff4beSrobert
657*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR double __constexpr_fabs(double __x) _NOEXCEPT {
658*4bdff4beSrobert    return __builtin_fabs(__x);
659*4bdff4beSrobert}
660*4bdff4beSrobert
661*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR long double __constexpr_fabs(long double __x) _NOEXCEPT {
662*4bdff4beSrobert    return __builtin_fabsl(__x);
663*4bdff4beSrobert}
664*4bdff4beSrobert
665*4bdff4beSroberttemplate <class _Tp, __enable_if_t<is_integral<_Tp>::value, int> = 0>
666*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR double __constexpr_fabs(_Tp __x) _NOEXCEPT {
667*4bdff4beSrobert    return __builtin_fabs(static_cast<double>(__x));
668*4bdff4beSrobert}
669*4bdff4beSrobert
670*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 float __constexpr_fmax(float __x, float __y) _NOEXCEPT {
671*4bdff4beSrobert#if !__has_constexpr_builtin(__builtin_fmaxf)
672*4bdff4beSrobert  if (__libcpp_is_constant_evaluated()) {
673*4bdff4beSrobert    if (std::__constexpr_isnan(__x))
674*4bdff4beSrobert      return __y;
675*4bdff4beSrobert    if (std::__constexpr_isnan(__y))
676*4bdff4beSrobert      return __x;
677*4bdff4beSrobert    return __x < __y ? __y : __x;
678*4bdff4beSrobert  }
679*4bdff4beSrobert#endif
680*4bdff4beSrobert  return __builtin_fmaxf(__x, __y);
681*4bdff4beSrobert}
682*4bdff4beSrobert
683*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 double __constexpr_fmax(double __x, double __y) _NOEXCEPT {
684*4bdff4beSrobert#if !__has_constexpr_builtin(__builtin_fmax)
685*4bdff4beSrobert  if (__libcpp_is_constant_evaluated()) {
686*4bdff4beSrobert    if (std::__constexpr_isnan(__x))
687*4bdff4beSrobert      return __y;
688*4bdff4beSrobert    if (std::__constexpr_isnan(__y))
689*4bdff4beSrobert      return __x;
690*4bdff4beSrobert    return __x < __y ? __y : __x;
691*4bdff4beSrobert  }
692*4bdff4beSrobert#endif
693*4bdff4beSrobert  return __builtin_fmax(__x, __y);
694*4bdff4beSrobert}
695*4bdff4beSrobert
696*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 long double
697*4bdff4beSrobert__constexpr_fmax(long double __x, long double __y) _NOEXCEPT {
698*4bdff4beSrobert#if !__has_constexpr_builtin(__builtin_fmaxl)
699*4bdff4beSrobert  if (__libcpp_is_constant_evaluated()) {
700*4bdff4beSrobert    if (std::__constexpr_isnan(__x))
701*4bdff4beSrobert      return __y;
702*4bdff4beSrobert    if (std::__constexpr_isnan(__y))
703*4bdff4beSrobert      return __x;
704*4bdff4beSrobert    return __x < __y ? __y : __x;
705*4bdff4beSrobert  }
706*4bdff4beSrobert#endif
707*4bdff4beSrobert  return __builtin_fmaxl(__x, __y);
708*4bdff4beSrobert}
709*4bdff4beSrobert
710*4bdff4beSroberttemplate <class _Tp, class _Up, __enable_if_t<is_arithmetic<_Tp>::value && is_arithmetic<_Up>::value, int> = 0>
711*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 typename __promote<_Tp, _Up>::type
712*4bdff4beSrobert__constexpr_fmax(_Tp __x, _Up __y) _NOEXCEPT {
713*4bdff4beSrobert  using __result_type = typename __promote<_Tp, _Up>::type;
714*4bdff4beSrobert  return std::__constexpr_fmax(static_cast<__result_type>(__x), static_cast<__result_type>(__y));
715*4bdff4beSrobert}
716*4bdff4beSrobert
717*4bdff4beSroberttemplate <class _Tp>
718*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp __constexpr_logb(_Tp __x) {
719*4bdff4beSrobert#if !__has_constexpr_builtin(__builtin_logb)
720*4bdff4beSrobert  if (__libcpp_is_constant_evaluated()) {
721*4bdff4beSrobert    if (__x == _Tp(0)) {
722*4bdff4beSrobert      // raise FE_DIVBYZERO
723*4bdff4beSrobert      return -numeric_limits<_Tp>::infinity();
724*4bdff4beSrobert    }
725*4bdff4beSrobert
726*4bdff4beSrobert    if (std::__constexpr_isinf(__x))
727*4bdff4beSrobert      return numeric_limits<_Tp>::infinity();
728*4bdff4beSrobert
729*4bdff4beSrobert    if (std::__constexpr_isnan(__x))
730*4bdff4beSrobert      return numeric_limits<_Tp>::quiet_NaN();
731*4bdff4beSrobert
732*4bdff4beSrobert    __x = std::__constexpr_fabs(__x);
733*4bdff4beSrobert    unsigned long long __exp = 0;
734*4bdff4beSrobert    while (__x >= numeric_limits<_Tp>::radix) {
735*4bdff4beSrobert      __x /= numeric_limits<_Tp>::radix;
736*4bdff4beSrobert      __exp += 1;
737*4bdff4beSrobert    }
738*4bdff4beSrobert    return _Tp(__exp);
739*4bdff4beSrobert  }
740*4bdff4beSrobert#endif // !__has_constexpr_builtin(__builtin_logb)
741*4bdff4beSrobert  return __builtin_logb(__x);
742*4bdff4beSrobert}
743*4bdff4beSrobert
744*4bdff4beSroberttemplate <class _Tp>
745*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Tp __constexpr_scalbn(_Tp __x, int __exp) {
746*4bdff4beSrobert#if !__has_constexpr_builtin(__builtin_scalbln)
747*4bdff4beSrobert  if (__libcpp_is_constant_evaluated()) {
748*4bdff4beSrobert    if (__x == _Tp(0))
749*4bdff4beSrobert      return __x;
750*4bdff4beSrobert
751*4bdff4beSrobert    if (std::__constexpr_isinf(__x))
752*4bdff4beSrobert      return __x;
753*4bdff4beSrobert
754*4bdff4beSrobert    if (__exp == _Tp(0))
755*4bdff4beSrobert      return __x;
756*4bdff4beSrobert
757*4bdff4beSrobert    if (std::__constexpr_isnan(__x))
758*4bdff4beSrobert      return numeric_limits<_Tp>::quiet_NaN();
759*4bdff4beSrobert
760*4bdff4beSrobert    _Tp __mult(1);
761*4bdff4beSrobert    if (__exp > 0) {
762*4bdff4beSrobert      __mult = numeric_limits<_Tp>::radix;
763*4bdff4beSrobert      --__exp;
764*4bdff4beSrobert    } else {
765*4bdff4beSrobert      ++__exp;
766*4bdff4beSrobert      __exp = -__exp;
767*4bdff4beSrobert      __mult /= numeric_limits<_Tp>::radix;
768*4bdff4beSrobert    }
769*4bdff4beSrobert
770*4bdff4beSrobert    while (__exp > 0) {
771*4bdff4beSrobert      if (!(__exp & 1)) {
772*4bdff4beSrobert        __mult *= __mult;
773*4bdff4beSrobert        __exp >>= 1;
774*4bdff4beSrobert      } else {
775*4bdff4beSrobert        __x *= __mult;
776*4bdff4beSrobert        --__exp;
777*4bdff4beSrobert      }
778*4bdff4beSrobert    }
779*4bdff4beSrobert    return __x;
780*4bdff4beSrobert  }
781*4bdff4beSrobert#endif // !__has_constexpr_builtin(__builtin_scalbln)
782*4bdff4beSrobert  return __builtin_scalbn(__x, __exp);
78346035553Spatrick}
78446035553Spatrick
78546035553Spatrick#if _LIBCPP_STD_VER > 17
78646035553Spatricktemplate <typename _Fp>
787*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr
78846035553Spatrick_Fp __lerp(_Fp __a, _Fp __b, _Fp __t) noexcept {
78946035553Spatrick    if ((__a <= 0 && __b >= 0) || (__a >= 0 && __b <= 0))
79046035553Spatrick        return __t * __b + (1 - __t) * __a;
79146035553Spatrick
79246035553Spatrick    if (__t == 1) return __b;
79346035553Spatrick    const _Fp __x = __a + __t * (__b - __a);
79476d0caaeSpatrick    if ((__t > 1) == (__b > __a))
79546035553Spatrick        return __b < __x ? __x : __b;
79646035553Spatrick    else
79746035553Spatrick        return __x < __b ? __x : __b;
79846035553Spatrick}
79946035553Spatrick
800*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr float
80146035553Spatricklerp(float __a, float __b, float __t)                   _NOEXCEPT { return __lerp(__a, __b, __t); }
80246035553Spatrick
803*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr double
80446035553Spatricklerp(double __a, double __b, double __t)                _NOEXCEPT { return __lerp(__a, __b, __t); }
80546035553Spatrick
806*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr long double
80746035553Spatricklerp(long double __a, long double __b, long double __t) _NOEXCEPT { return __lerp(__a, __b, __t); }
80846035553Spatrick
809*4bdff4beSroberttemplate <class _A1, class _A2, class _A3>
810*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI
811*4bdff4beSrobertconstexpr typename enable_if_t
812*4bdff4beSrobert<
813*4bdff4beSrobert    is_arithmetic<_A1>::value &&
814*4bdff4beSrobert    is_arithmetic<_A2>::value &&
815*4bdff4beSrobert    is_arithmetic<_A3>::value,
816*4bdff4beSrobert    __promote<_A1, _A2, _A3>
817*4bdff4beSrobert>::type
818*4bdff4beSrobertlerp(_A1 __a, _A2 __b, _A3 __t) noexcept
819*4bdff4beSrobert{
820*4bdff4beSrobert    typedef typename __promote<_A1, _A2, _A3>::type __result_type;
821*4bdff4beSrobert    static_assert(!(_IsSame<_A1, __result_type>::value &&
822*4bdff4beSrobert                    _IsSame<_A2, __result_type>::value &&
823*4bdff4beSrobert                    _IsSame<_A3, __result_type>::value));
824*4bdff4beSrobert    return std::__lerp((__result_type)__a, (__result_type)__b, (__result_type)__t);
825*4bdff4beSrobert}
82646035553Spatrick#endif // _LIBCPP_STD_VER > 17
82746035553Spatrick
82846035553Spatrick_LIBCPP_END_NAMESPACE_STD
82946035553Spatrick
83046035553Spatrick_LIBCPP_POP_MACROS
83146035553Spatrick
832*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
833*4bdff4beSrobert#  include <type_traits>
834*4bdff4beSrobert#endif
835*4bdff4beSrobert
83646035553Spatrick#endif // _LIBCPP_CMATH
837