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