Path: blob/main/contrib/llvm-project/libcxx/include/__math/exponential_functions.h
35233 views
//===----------------------------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef _LIBCPP___MATH_EXPONENTIAL_FUNCTIONS_H9#define _LIBCPP___MATH_EXPONENTIAL_FUNCTIONS_H1011#include <__config>12#include <__type_traits/enable_if.h>13#include <__type_traits/is_arithmetic.h>14#include <__type_traits/is_integral.h>15#include <__type_traits/is_same.h>16#include <__type_traits/promote.h>1718#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)19# pragma GCC system_header20#endif2122_LIBCPP_BEGIN_NAMESPACE_STD2324namespace __math {2526// exp2728inline _LIBCPP_HIDE_FROM_ABI float exp(float __x) _NOEXCEPT { return __builtin_expf(__x); }2930template <class = int>31_LIBCPP_HIDE_FROM_ABI double exp(double __x) _NOEXCEPT {32return __builtin_exp(__x);33}3435inline _LIBCPP_HIDE_FROM_ABI long double exp(long double __x) _NOEXCEPT { return __builtin_expl(__x); }3637template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>38inline _LIBCPP_HIDE_FROM_ABI double exp(_A1 __x) _NOEXCEPT {39return __builtin_exp((double)__x);40}4142// frexp4344inline _LIBCPP_HIDE_FROM_ABI float frexp(float __x, int* __e) _NOEXCEPT { return __builtin_frexpf(__x, __e); }4546template <class = int>47_LIBCPP_HIDE_FROM_ABI double frexp(double __x, int* __e) _NOEXCEPT {48return __builtin_frexp(__x, __e);49}5051inline _LIBCPP_HIDE_FROM_ABI long double frexp(long double __x, int* __e) _NOEXCEPT {52return __builtin_frexpl(__x, __e);53}5455template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>56inline _LIBCPP_HIDE_FROM_ABI double frexp(_A1 __x, int* __e) _NOEXCEPT {57return __builtin_frexp((double)__x, __e);58}5960// ldexp6162inline _LIBCPP_HIDE_FROM_ABI float ldexp(float __x, int __e) _NOEXCEPT { return __builtin_ldexpf(__x, __e); }6364template <class = int>65_LIBCPP_HIDE_FROM_ABI double ldexp(double __x, int __e) _NOEXCEPT {66return __builtin_ldexp(__x, __e);67}6869inline _LIBCPP_HIDE_FROM_ABI long double ldexp(long double __x, int __e) _NOEXCEPT {70return __builtin_ldexpl(__x, __e);71}7273template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>74inline _LIBCPP_HIDE_FROM_ABI double ldexp(_A1 __x, int __e) _NOEXCEPT {75return __builtin_ldexp((double)__x, __e);76}7778// exp27980inline _LIBCPP_HIDE_FROM_ABI float exp2(float __x) _NOEXCEPT { return __builtin_exp2f(__x); }8182template <class = int>83_LIBCPP_HIDE_FROM_ABI double exp2(double __x) _NOEXCEPT {84return __builtin_exp2(__x);85}8687inline _LIBCPP_HIDE_FROM_ABI long double exp2(long double __x) _NOEXCEPT { return __builtin_exp2l(__x); }8889template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>90inline _LIBCPP_HIDE_FROM_ABI double exp2(_A1 __x) _NOEXCEPT {91return __builtin_exp2((double)__x);92}9394// expm19596inline _LIBCPP_HIDE_FROM_ABI float expm1(float __x) _NOEXCEPT { return __builtin_expm1f(__x); }9798template <class = int>99_LIBCPP_HIDE_FROM_ABI double expm1(double __x) _NOEXCEPT {100return __builtin_expm1(__x);101}102103inline _LIBCPP_HIDE_FROM_ABI long double expm1(long double __x) _NOEXCEPT { return __builtin_expm1l(__x); }104105template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>106inline _LIBCPP_HIDE_FROM_ABI double expm1(_A1 __x) _NOEXCEPT {107return __builtin_expm1((double)__x);108}109110// scalbln111112inline _LIBCPP_HIDE_FROM_ABI float scalbln(float __x, long __y) _NOEXCEPT { return __builtin_scalblnf(__x, __y); }113114template <class = int>115_LIBCPP_HIDE_FROM_ABI double scalbln(double __x, long __y) _NOEXCEPT {116return __builtin_scalbln(__x, __y);117}118119inline _LIBCPP_HIDE_FROM_ABI long double scalbln(long double __x, long __y) _NOEXCEPT {120return __builtin_scalblnl(__x, __y);121}122123template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>124inline _LIBCPP_HIDE_FROM_ABI double scalbln(_A1 __x, long __y) _NOEXCEPT {125return __builtin_scalbln((double)__x, __y);126}127128// scalbn129130inline _LIBCPP_HIDE_FROM_ABI float scalbn(float __x, int __y) _NOEXCEPT { return __builtin_scalbnf(__x, __y); }131132template <class = int>133_LIBCPP_HIDE_FROM_ABI double scalbn(double __x, int __y) _NOEXCEPT {134return __builtin_scalbn(__x, __y);135}136137inline _LIBCPP_HIDE_FROM_ABI long double scalbn(long double __x, int __y) _NOEXCEPT {138return __builtin_scalbnl(__x, __y);139}140141template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>142inline _LIBCPP_HIDE_FROM_ABI double scalbn(_A1 __x, int __y) _NOEXCEPT {143return __builtin_scalbn((double)__x, __y);144}145146// pow147148inline _LIBCPP_HIDE_FROM_ABI float pow(float __x, float __y) _NOEXCEPT { return __builtin_powf(__x, __y); }149150template <class = int>151_LIBCPP_HIDE_FROM_ABI double pow(double __x, double __y) _NOEXCEPT {152return __builtin_pow(__x, __y);153}154155inline _LIBCPP_HIDE_FROM_ABI long double pow(long double __x, long double __y) _NOEXCEPT {156return __builtin_powl(__x, __y);157}158159template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>160inline _LIBCPP_HIDE_FROM_ABI typename __promote<_A1, _A2>::type pow(_A1 __x, _A2 __y) _NOEXCEPT {161using __result_type = typename __promote<_A1, _A2>::type;162static_assert(!(_IsSame<_A1, __result_type>::value && _IsSame<_A2, __result_type>::value), "");163return __math::pow((__result_type)__x, (__result_type)__y);164}165166} // namespace __math167168_LIBCPP_END_NAMESPACE_STD169170#endif // _LIBCPP___MATH_EXPONENTIAL_FUNCTIONS_H171172173