brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.7 KiB · bee743f Raw
621 lines · plain
1// -*- C++ -*-2//===----------------------------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10#ifndef _LIBCPP_CMATH11#define _LIBCPP_CMATH12 13/*14    cmath synopsis15 16Macros:17 18    HUGE_VAL19    HUGE_VALF               // C9920    HUGE_VALL               // C9921    INFINITY                // C9922    NAN                     // C9923    FP_INFINITE             // C9924    FP_NAN                  // C9925    FP_NORMAL               // C9926    FP_SUBNORMAL            // C9927    FP_ZERO                 // C9928    FP_FAST_FMA             // C9929    FP_FAST_FMAF            // C9930    FP_FAST_FMAL            // C9931    FP_ILOGB0               // C9932    FP_ILOGBNAN             // C9933    MATH_ERRNO              // C9934    MATH_ERREXCEPT          // C9935    math_errhandling        // C9936 37namespace std38{39 40Types:41 42    float_t                 // C9943    double_t                // C9944 45// C9046 47floating_point abs(floating_point x);48 49floating_point acos (arithmetic x);50float          acosf(float x);51long double    acosl(long double x);52 53floating_point asin (arithmetic x);54float          asinf(float x);55long double    asinl(long double x);56 57floating_point atan (arithmetic x);58float          atanf(float x);59long double    atanl(long double x);60 61floating_point atan2 (arithmetic y, arithmetic x);62float          atan2f(float y, float x);63long double    atan2l(long double y, long double x);64 65floating_point ceil (arithmetic x);66float          ceilf(float x);67long double    ceill(long double x);68 69floating_point cos (arithmetic x);70float          cosf(float x);71long double    cosl(long double x);72 73floating_point cosh (arithmetic x);74float          coshf(float x);75long double    coshl(long double x);76 77floating_point exp (arithmetic x);78float          expf(float x);79long double    expl(long double x);80 81floating_point fabs (arithmetic x);82float          fabsf(float x);83long double    fabsl(long double x);84 85floating_point floor (arithmetic x);86float          floorf(float x);87long double    floorl(long double x);88 89floating_point fmod (arithmetic x, arithmetic y);90float          fmodf(float x, float y);91long double    fmodl(long double x, long double y);92 93floating_point frexp (arithmetic value, int* exp);94float          frexpf(float value, int* exp);95long double    frexpl(long double value, int* exp);96 97floating_point ldexp (arithmetic value, int exp);98float          ldexpf(float value, int exp);99long double    ldexpl(long double value, int exp);100 101floating_point log (arithmetic x);102float          logf(float x);103long double    logl(long double x);104 105floating_point log10 (arithmetic x);106float          log10f(float x);107long double    log10l(long double x);108 109floating_point modf (floating_point value, floating_point* iptr);110float          modff(float value, float* iptr);111long double    modfl(long double value, long double* iptr);112 113floating_point pow (arithmetic x, arithmetic y);114float          powf(float x, float y);115long double    powl(long double x, long double y);116 117floating_point sin (arithmetic x);118float          sinf(float x);119long double    sinl(long double x);120 121floating_point sinh (arithmetic x);122float          sinhf(float x);123long double    sinhl(long double x);124 125floating_point sqrt (arithmetic x);126float          sqrtf(float x);127long double    sqrtl(long double x);128 129floating_point tan (arithmetic x);130float          tanf(float x);131long double    tanl(long double x);132 133floating_point tanh (arithmetic x);134float          tanhf(float x);135long double    tanhl(long double x);136 137//  C99138 139bool signbit(arithmetic x);140 141int fpclassify(arithmetic x);142 143bool isfinite(arithmetic x);144bool isinf(arithmetic x);145bool isnan(arithmetic x);146bool isnormal(arithmetic x);147 148bool isgreater(arithmetic x, arithmetic y);149bool isgreaterequal(arithmetic x, arithmetic y);150bool isless(arithmetic x, arithmetic y);151bool islessequal(arithmetic x, arithmetic y);152bool islessgreater(arithmetic x, arithmetic y);153bool isunordered(arithmetic x, arithmetic y);154 155floating_point acosh (arithmetic x);156float          acoshf(float x);157long double    acoshl(long double x);158 159floating_point asinh (arithmetic x);160float          asinhf(float x);161long double    asinhl(long double x);162 163floating_point atanh (arithmetic x);164float          atanhf(float x);165long double    atanhl(long double x);166 167floating_point cbrt (arithmetic x);168float          cbrtf(float x);169long double    cbrtl(long double x);170 171floating_point copysign (arithmetic x, arithmetic y);172float          copysignf(float x, float y);173long double    copysignl(long double x, long double y);174 175floating_point erf (arithmetic x);176float          erff(float x);177long double    erfl(long double x);178 179floating_point erfc (arithmetic x);180float          erfcf(float x);181long double    erfcl(long double x);182 183floating_point exp2 (arithmetic x);184float          exp2f(float x);185long double    exp2l(long double x);186 187floating_point expm1 (arithmetic x);188float          expm1f(float x);189long double    expm1l(long double x);190 191floating_point fdim (arithmetic x, arithmetic y);192float          fdimf(float x, float y);193long double    fdiml(long double x, long double y);194 195floating_point fma (arithmetic x, arithmetic y, arithmetic z);196float          fmaf(float x, float y, float z);197long double    fmal(long double x, long double y, long double z);198 199floating_point fmax (arithmetic x, arithmetic y);200float          fmaxf(float x, float y);201long double    fmaxl(long double x, long double y);202 203floating_point fmin (arithmetic x, arithmetic y);204float          fminf(float x, float y);205long double    fminl(long double x, long double y);206 207double         hermite(unsigned n, double x);                    // C++17208float          hermite(unsigned n, float x);                     // C++17209long double    hermite(unsigned n, long double x);               // C++17210float          hermitef(unsigned n, float x);                    // C++17211long double    hermitel(unsigned n, long double x);              // C++17212template <class Integer>213double         hermite(unsigned n, Integer x);                   // C++17214 215floating_point hypot (arithmetic x, arithmetic y);216float          hypotf(float x, float y);217long double    hypotl(long double x, long double y);218 219double       hypot(double x, double y, double z);                // C++17220float        hypot(float x, float y, float z);                   // C++17221long double  hypot(long double x, long double y, long double z); // C++17222 223int ilogb (arithmetic x);224int ilogbf(float x);225int ilogbl(long double x);226 227floating_point lgamma (arithmetic x);228float          lgammaf(float x);229long double    lgammal(long double x);230 231long long llrint (arithmetic x);232long long llrintf(float x);233long long llrintl(long double x);234 235long long llround (arithmetic x);236long long llroundf(float x);237long long llroundl(long double x);238 239floating_point log1p (arithmetic x);240float          log1pf(float x);241long double    log1pl(long double x);242 243floating_point log2 (arithmetic x);244float          log2f(float x);245long double    log2l(long double x);246 247floating_point logb (arithmetic x);248float          logbf(float x);249long double    logbl(long double x);250 251long lrint (arithmetic x);252long lrintf(float x);253long lrintl(long double x);254 255long lround (arithmetic x);256long lroundf(float x);257long lroundl(long double x);258 259double      nan (const char* str);260float       nanf(const char* str);261long double nanl(const char* str);262 263floating_point nearbyint (arithmetic x);264float          nearbyintf(float x);265long double    nearbyintl(long double x);266 267floating_point nextafter (arithmetic x, arithmetic y);268float          nextafterf(float x, float y);269long double    nextafterl(long double x, long double y);270 271floating_point nexttoward (arithmetic x, long double y);272float          nexttowardf(float x, long double y);273long double    nexttowardl(long double x, long double y);274 275floating_point remainder (arithmetic x, arithmetic y);276float          remainderf(float x, float y);277long double    remainderl(long double x, long double y);278 279floating_point remquo (arithmetic x, arithmetic y, int* pquo);280float          remquof(float x, float y, int* pquo);281long double    remquol(long double x, long double y, int* pquo);282 283floating_point rint (arithmetic x);284float          rintf(float x);285long double    rintl(long double x);286 287floating_point round (arithmetic x);288float          roundf(float x);289long double    roundl(long double x);290 291floating_point scalbln (arithmetic x, long ex);292float          scalblnf(float x, long ex);293long double    scalblnl(long double x, long ex);294 295floating_point scalbn (arithmetic x, int ex);296float          scalbnf(float x, int ex);297long double    scalbnl(long double x, int ex);298 299floating_point tgamma (arithmetic x);300float          tgammaf(float x);301long double    tgammal(long double x);302 303floating_point trunc (arithmetic x);304float          truncf(float x);305long double    truncl(long double x);306 307constexpr float       lerp(float a, float b, float t) noexcept;                   // C++20308constexpr double      lerp(double a, double b, double t) noexcept;                // C++20309constexpr long double lerp(long double a, long double b, long double t) noexcept; // C++20310 311}  // std312 313*/314 315#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)316#  include <__cxx03/cmath>317#else318#  include <__config>319#  include <__math/hypot.h>320#  include <__type_traits/enable_if.h>321#  include <__type_traits/is_arithmetic.h>322#  include <__type_traits/is_constant_evaluated.h>323#  include <__type_traits/is_floating_point.h>324#  include <__type_traits/is_same.h>325#  include <__type_traits/promote.h>326#  include <__type_traits/remove_cv.h>327#  include <limits>328#  include <version>329 330#  include <__math/special_functions.h>331#  include <math.h>332 333#  ifndef _LIBCPP_MATH_H334#   error <cmath> tried including <math.h> but didn't find libc++'s <math.h> header. \335          This usually means that your header search paths are not configured properly. \336          The header search paths should contain the C++ Standard Library headers before \337          any C Standard Library, and you are probably using compiler flags that make that \338          not be the case.339#  endif340 341#  if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)342#    pragma GCC system_header343#  endif344 345_LIBCPP_PUSH_MACROS346#  include <__undef_macros>347 348_LIBCPP_BEGIN_NAMESPACE_STD349 350using ::signbit _LIBCPP_USING_IF_EXISTS;351using ::fpclassify _LIBCPP_USING_IF_EXISTS;352using ::isfinite _LIBCPP_USING_IF_EXISTS;353using ::isinf _LIBCPP_USING_IF_EXISTS;354using ::isnan _LIBCPP_USING_IF_EXISTS;355using ::isnormal _LIBCPP_USING_IF_EXISTS;356using ::isgreater _LIBCPP_USING_IF_EXISTS;357using ::isgreaterequal _LIBCPP_USING_IF_EXISTS;358using ::isless _LIBCPP_USING_IF_EXISTS;359using ::islessequal _LIBCPP_USING_IF_EXISTS;360using ::islessgreater _LIBCPP_USING_IF_EXISTS;361using ::isunordered _LIBCPP_USING_IF_EXISTS;362using ::isunordered _LIBCPP_USING_IF_EXISTS;363 364using ::float_t _LIBCPP_USING_IF_EXISTS;365using ::double_t _LIBCPP_USING_IF_EXISTS;366 367using ::abs _LIBCPP_USING_IF_EXISTS;368 369using ::acos _LIBCPP_USING_IF_EXISTS;370using ::acosf _LIBCPP_USING_IF_EXISTS;371using ::asin _LIBCPP_USING_IF_EXISTS;372using ::asinf _LIBCPP_USING_IF_EXISTS;373using ::atan _LIBCPP_USING_IF_EXISTS;374using ::atanf _LIBCPP_USING_IF_EXISTS;375using ::atan2 _LIBCPP_USING_IF_EXISTS;376using ::atan2f _LIBCPP_USING_IF_EXISTS;377using ::ceil _LIBCPP_USING_IF_EXISTS;378using ::ceilf _LIBCPP_USING_IF_EXISTS;379using ::cos _LIBCPP_USING_IF_EXISTS;380using ::cosf _LIBCPP_USING_IF_EXISTS;381using ::cosh _LIBCPP_USING_IF_EXISTS;382using ::coshf _LIBCPP_USING_IF_EXISTS;383 384using ::exp _LIBCPP_USING_IF_EXISTS;385using ::expf _LIBCPP_USING_IF_EXISTS;386 387using ::fabs _LIBCPP_USING_IF_EXISTS;388using ::fabsf _LIBCPP_USING_IF_EXISTS;389using ::floor _LIBCPP_USING_IF_EXISTS;390using ::floorf _LIBCPP_USING_IF_EXISTS;391 392using ::fmod _LIBCPP_USING_IF_EXISTS;393using ::fmodf _LIBCPP_USING_IF_EXISTS;394 395using ::frexp _LIBCPP_USING_IF_EXISTS;396using ::frexpf _LIBCPP_USING_IF_EXISTS;397using ::ldexp _LIBCPP_USING_IF_EXISTS;398using ::ldexpf _LIBCPP_USING_IF_EXISTS;399 400using ::log _LIBCPP_USING_IF_EXISTS;401using ::logf _LIBCPP_USING_IF_EXISTS;402 403using ::log10 _LIBCPP_USING_IF_EXISTS;404using ::log10f _LIBCPP_USING_IF_EXISTS;405using ::modf _LIBCPP_USING_IF_EXISTS;406using ::modff _LIBCPP_USING_IF_EXISTS;407 408using ::pow _LIBCPP_USING_IF_EXISTS;409using ::powf _LIBCPP_USING_IF_EXISTS;410 411using ::sin _LIBCPP_USING_IF_EXISTS;412using ::sinf _LIBCPP_USING_IF_EXISTS;413using ::sinh _LIBCPP_USING_IF_EXISTS;414using ::sinhf _LIBCPP_USING_IF_EXISTS;415 416using ::sqrt _LIBCPP_USING_IF_EXISTS;417using ::sqrtf _LIBCPP_USING_IF_EXISTS;418using ::tan _LIBCPP_USING_IF_EXISTS;419using ::tanf _LIBCPP_USING_IF_EXISTS;420 421using ::tanh _LIBCPP_USING_IF_EXISTS;422using ::tanhf _LIBCPP_USING_IF_EXISTS;423 424using ::acosh _LIBCPP_USING_IF_EXISTS;425using ::acoshf _LIBCPP_USING_IF_EXISTS;426using ::asinh _LIBCPP_USING_IF_EXISTS;427using ::asinhf _LIBCPP_USING_IF_EXISTS;428using ::atanh _LIBCPP_USING_IF_EXISTS;429using ::atanhf _LIBCPP_USING_IF_EXISTS;430using ::cbrt _LIBCPP_USING_IF_EXISTS;431using ::cbrtf _LIBCPP_USING_IF_EXISTS;432 433using ::copysign _LIBCPP_USING_IF_EXISTS;434using ::copysignf _LIBCPP_USING_IF_EXISTS;435 436using ::erf _LIBCPP_USING_IF_EXISTS;437using ::erff _LIBCPP_USING_IF_EXISTS;438using ::erfc _LIBCPP_USING_IF_EXISTS;439using ::erfcf _LIBCPP_USING_IF_EXISTS;440using ::exp2 _LIBCPP_USING_IF_EXISTS;441using ::exp2f _LIBCPP_USING_IF_EXISTS;442using ::expm1 _LIBCPP_USING_IF_EXISTS;443using ::expm1f _LIBCPP_USING_IF_EXISTS;444using ::fdim _LIBCPP_USING_IF_EXISTS;445using ::fdimf _LIBCPP_USING_IF_EXISTS;446using ::fmaf _LIBCPP_USING_IF_EXISTS;447using ::fma _LIBCPP_USING_IF_EXISTS;448using ::fmax _LIBCPP_USING_IF_EXISTS;449using ::fmaxf _LIBCPP_USING_IF_EXISTS;450using ::fmin _LIBCPP_USING_IF_EXISTS;451using ::fminf _LIBCPP_USING_IF_EXISTS;452using ::hypot _LIBCPP_USING_IF_EXISTS;453using ::hypotf _LIBCPP_USING_IF_EXISTS;454using ::ilogb _LIBCPP_USING_IF_EXISTS;455using ::ilogbf _LIBCPP_USING_IF_EXISTS;456using ::lgamma _LIBCPP_USING_IF_EXISTS;457using ::lgammaf _LIBCPP_USING_IF_EXISTS;458using ::llrint _LIBCPP_USING_IF_EXISTS;459using ::llrintf _LIBCPP_USING_IF_EXISTS;460using ::llround _LIBCPP_USING_IF_EXISTS;461using ::llroundf _LIBCPP_USING_IF_EXISTS;462using ::log1p _LIBCPP_USING_IF_EXISTS;463using ::log1pf _LIBCPP_USING_IF_EXISTS;464using ::log2 _LIBCPP_USING_IF_EXISTS;465using ::log2f _LIBCPP_USING_IF_EXISTS;466using ::logb _LIBCPP_USING_IF_EXISTS;467using ::logbf _LIBCPP_USING_IF_EXISTS;468using ::lrint _LIBCPP_USING_IF_EXISTS;469using ::lrintf _LIBCPP_USING_IF_EXISTS;470using ::lround _LIBCPP_USING_IF_EXISTS;471using ::lroundf _LIBCPP_USING_IF_EXISTS;472 473using ::nan _LIBCPP_USING_IF_EXISTS;474using ::nanf _LIBCPP_USING_IF_EXISTS;475 476using ::nearbyint _LIBCPP_USING_IF_EXISTS;477using ::nearbyintf _LIBCPP_USING_IF_EXISTS;478using ::nextafter _LIBCPP_USING_IF_EXISTS;479using ::nextafterf _LIBCPP_USING_IF_EXISTS;480using ::nexttoward _LIBCPP_USING_IF_EXISTS;481using ::nexttowardf _LIBCPP_USING_IF_EXISTS;482using ::remainder _LIBCPP_USING_IF_EXISTS;483using ::remainderf _LIBCPP_USING_IF_EXISTS;484using ::remquo _LIBCPP_USING_IF_EXISTS;485using ::remquof _LIBCPP_USING_IF_EXISTS;486using ::rint _LIBCPP_USING_IF_EXISTS;487using ::rintf _LIBCPP_USING_IF_EXISTS;488using ::round _LIBCPP_USING_IF_EXISTS;489using ::roundf _LIBCPP_USING_IF_EXISTS;490using ::scalbln _LIBCPP_USING_IF_EXISTS;491using ::scalblnf _LIBCPP_USING_IF_EXISTS;492using ::scalbn _LIBCPP_USING_IF_EXISTS;493using ::scalbnf _LIBCPP_USING_IF_EXISTS;494using ::tgamma _LIBCPP_USING_IF_EXISTS;495using ::tgammaf _LIBCPP_USING_IF_EXISTS;496using ::trunc _LIBCPP_USING_IF_EXISTS;497using ::truncf _LIBCPP_USING_IF_EXISTS;498 499using ::acosl _LIBCPP_USING_IF_EXISTS;500using ::asinl _LIBCPP_USING_IF_EXISTS;501using ::atanl _LIBCPP_USING_IF_EXISTS;502using ::atan2l _LIBCPP_USING_IF_EXISTS;503using ::ceill _LIBCPP_USING_IF_EXISTS;504using ::cosl _LIBCPP_USING_IF_EXISTS;505using ::coshl _LIBCPP_USING_IF_EXISTS;506using ::expl _LIBCPP_USING_IF_EXISTS;507using ::fabsl _LIBCPP_USING_IF_EXISTS;508using ::floorl _LIBCPP_USING_IF_EXISTS;509using ::fmodl _LIBCPP_USING_IF_EXISTS;510using ::frexpl _LIBCPP_USING_IF_EXISTS;511using ::ldexpl _LIBCPP_USING_IF_EXISTS;512using ::logl _LIBCPP_USING_IF_EXISTS;513using ::log10l _LIBCPP_USING_IF_EXISTS;514using ::modfl _LIBCPP_USING_IF_EXISTS;515using ::powl _LIBCPP_USING_IF_EXISTS;516using ::sinl _LIBCPP_USING_IF_EXISTS;517using ::sinhl _LIBCPP_USING_IF_EXISTS;518using ::sqrtl _LIBCPP_USING_IF_EXISTS;519using ::tanl _LIBCPP_USING_IF_EXISTS;520 521using ::tanhl _LIBCPP_USING_IF_EXISTS;522using ::acoshl _LIBCPP_USING_IF_EXISTS;523using ::asinhl _LIBCPP_USING_IF_EXISTS;524using ::atanhl _LIBCPP_USING_IF_EXISTS;525using ::cbrtl _LIBCPP_USING_IF_EXISTS;526 527using ::copysignl _LIBCPP_USING_IF_EXISTS;528 529using ::erfl _LIBCPP_USING_IF_EXISTS;530using ::erfcl _LIBCPP_USING_IF_EXISTS;531using ::exp2l _LIBCPP_USING_IF_EXISTS;532using ::expm1l _LIBCPP_USING_IF_EXISTS;533using ::fdiml _LIBCPP_USING_IF_EXISTS;534using ::fmal _LIBCPP_USING_IF_EXISTS;535using ::fmaxl _LIBCPP_USING_IF_EXISTS;536using ::fminl _LIBCPP_USING_IF_EXISTS;537using ::hypotl _LIBCPP_USING_IF_EXISTS;538using ::ilogbl _LIBCPP_USING_IF_EXISTS;539using ::lgammal _LIBCPP_USING_IF_EXISTS;540using ::llrintl _LIBCPP_USING_IF_EXISTS;541using ::llroundl _LIBCPP_USING_IF_EXISTS;542using ::log1pl _LIBCPP_USING_IF_EXISTS;543using ::log2l _LIBCPP_USING_IF_EXISTS;544using ::logbl _LIBCPP_USING_IF_EXISTS;545using ::lrintl _LIBCPP_USING_IF_EXISTS;546using ::lroundl _LIBCPP_USING_IF_EXISTS;547using ::nanl _LIBCPP_USING_IF_EXISTS;548using ::nearbyintl _LIBCPP_USING_IF_EXISTS;549using ::nextafterl _LIBCPP_USING_IF_EXISTS;550using ::nexttowardl _LIBCPP_USING_IF_EXISTS;551using ::remainderl _LIBCPP_USING_IF_EXISTS;552using ::remquol _LIBCPP_USING_IF_EXISTS;553using ::rintl _LIBCPP_USING_IF_EXISTS;554using ::roundl _LIBCPP_USING_IF_EXISTS;555using ::scalblnl _LIBCPP_USING_IF_EXISTS;556using ::scalbnl _LIBCPP_USING_IF_EXISTS;557using ::tgammal _LIBCPP_USING_IF_EXISTS;558using ::truncl _LIBCPP_USING_IF_EXISTS;559 560template <class _A1, __enable_if_t<is_floating_point<_A1>::value, int> = 0>561_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool __constexpr_isinf(_A1 __lcpp_x) _NOEXCEPT {562#  if __has_builtin(__builtin_isinf)563  return __builtin_isinf(__lcpp_x);564#  else565  return isinf(__lcpp_x);566#  endif567}568 569template <class _A1, __enable_if_t<!is_floating_point<_A1>::value, int> = 0>570_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool __constexpr_isinf(_A1 __lcpp_x) _NOEXCEPT {571  return std::isinf(__lcpp_x);572}573 574#  if _LIBCPP_STD_VER >= 20575template <typename _Fp>576_LIBCPP_HIDE_FROM_ABI constexpr _Fp __lerp(_Fp __a, _Fp __b, _Fp __t) noexcept {577  if ((__a <= 0 && __b >= 0) || (__a >= 0 && __b <= 0))578    return __t * __b + (1 - __t) * __a;579 580  if (__t == 1)581    return __b;582  const _Fp __x = __a + __t * (__b - __a);583  if ((__t > 1) == (__b > __a))584    return __b < __x ? __x : __b;585  else586    return __x < __b ? __x : __b;587}588 589_LIBCPP_HIDE_FROM_ABI inline constexpr float lerp(float __a, float __b, float __t) _NOEXCEPT {590  return __lerp(__a, __b, __t);591}592 593_LIBCPP_HIDE_FROM_ABI inline constexpr double lerp(double __a, double __b, double __t) _NOEXCEPT {594  return __lerp(__a, __b, __t);595}596 597_LIBCPP_HIDE_FROM_ABI inline constexpr long double lerp(long double __a, long double __b, long double __t) _NOEXCEPT {598  return __lerp(__a, __b, __t);599}600 601template <class _A1, class _A2, class _A3>602  requires(is_arithmetic_v<_A1> && is_arithmetic_v<_A2> && is_arithmetic_v<_A3>)603_LIBCPP_HIDE_FROM_ABI inline constexpr __promote_t<_A1, _A2, _A3> lerp(_A1 __a, _A2 __b, _A3 __t) noexcept {604  using __result_type = __promote_t<_A1, _A2, _A3>;605  static_assert(!(606      _IsSame<_A1, __result_type>::value && _IsSame<_A2, __result_type>::value && _IsSame<_A3, __result_type>::value));607  return std::__lerp((__result_type)__a, (__result_type)__b, (__result_type)__t);608}609#  endif // _LIBCPP_STD_VER >= 20610 611_LIBCPP_END_NAMESPACE_STD612 613_LIBCPP_POP_MACROS614 615#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20616#    include <type_traits>617#  endif618#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)619 620#endif // _LIBCPP_CMATH621