16553608aSNikolas Klauser //===----------------------------------------------------------------------===//
26553608aSNikolas Klauser //
36553608aSNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46553608aSNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
56553608aSNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66553608aSNikolas Klauser //
76553608aSNikolas Klauser //===----------------------------------------------------------------------===//
86553608aSNikolas Klauser
96553608aSNikolas Klauser #ifndef _LIBCPP___MATH_EXPONENTIAL_FUNCTIONS_H
106553608aSNikolas Klauser #define _LIBCPP___MATH_EXPONENTIAL_FUNCTIONS_H
116553608aSNikolas Klauser
126553608aSNikolas Klauser #include <__config>
136553608aSNikolas Klauser #include <__type_traits/enable_if.h>
146553608aSNikolas Klauser #include <__type_traits/is_arithmetic.h>
156553608aSNikolas Klauser #include <__type_traits/is_integral.h>
166553608aSNikolas Klauser #include <__type_traits/is_same.h>
176553608aSNikolas Klauser #include <__type_traits/promote.h>
186553608aSNikolas Klauser
196553608aSNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
206553608aSNikolas Klauser # pragma GCC system_header
216553608aSNikolas Klauser #endif
226553608aSNikolas Klauser
236553608aSNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
246553608aSNikolas Klauser
256553608aSNikolas Klauser namespace __math {
266553608aSNikolas Klauser
276553608aSNikolas Klauser // exp
286553608aSNikolas Klauser
exp(float __x)296553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float exp(float __x) _NOEXCEPT { return __builtin_expf(__x); }
306553608aSNikolas Klauser
316553608aSNikolas Klauser template <class = int>
exp(double __x)326553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double exp(double __x) _NOEXCEPT {
336553608aSNikolas Klauser return __builtin_exp(__x);
346553608aSNikolas Klauser }
356553608aSNikolas Klauser
exp(long double __x)366553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double exp(long double __x) _NOEXCEPT { return __builtin_expl(__x); }
376553608aSNikolas Klauser
38f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
exp(_A1 __x)39f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI double exp(_A1 __x) _NOEXCEPT {
400e4d812fSNikolas Klauser return __builtin_exp((double)__x);
410e4d812fSNikolas Klauser }
426553608aSNikolas Klauser
436553608aSNikolas Klauser // frexp
446553608aSNikolas Klauser
frexp(float __x,int * __e)456553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float frexp(float __x, int* __e) _NOEXCEPT { return __builtin_frexpf(__x, __e); }
466553608aSNikolas Klauser
476553608aSNikolas Klauser template <class = int>
frexp(double __x,int * __e)486553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double frexp(double __x, int* __e) _NOEXCEPT {
496553608aSNikolas Klauser return __builtin_frexp(__x, __e);
506553608aSNikolas Klauser }
516553608aSNikolas Klauser
frexp(long double __x,int * __e)520e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double frexp(long double __x, int* __e) _NOEXCEPT {
530e4d812fSNikolas Klauser return __builtin_frexpl(__x, __e);
540e4d812fSNikolas Klauser }
556553608aSNikolas Klauser
56f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
frexp(_A1 __x,int * __e)57f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI double frexp(_A1 __x, int* __e) _NOEXCEPT {
580e4d812fSNikolas Klauser return __builtin_frexp((double)__x, __e);
590e4d812fSNikolas Klauser }
606553608aSNikolas Klauser
616553608aSNikolas Klauser // ldexp
626553608aSNikolas Klauser
ldexp(float __x,int __e)636553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float ldexp(float __x, int __e) _NOEXCEPT { return __builtin_ldexpf(__x, __e); }
646553608aSNikolas Klauser
656553608aSNikolas Klauser template <class = int>
ldexp(double __x,int __e)666553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double ldexp(double __x, int __e) _NOEXCEPT {
676553608aSNikolas Klauser return __builtin_ldexp(__x, __e);
686553608aSNikolas Klauser }
696553608aSNikolas Klauser
ldexp(long double __x,int __e)700e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double ldexp(long double __x, int __e) _NOEXCEPT {
710e4d812fSNikolas Klauser return __builtin_ldexpl(__x, __e);
720e4d812fSNikolas Klauser }
736553608aSNikolas Klauser
74f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
ldexp(_A1 __x,int __e)75f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI double ldexp(_A1 __x, int __e) _NOEXCEPT {
760e4d812fSNikolas Klauser return __builtin_ldexp((double)__x, __e);
770e4d812fSNikolas Klauser }
786553608aSNikolas Klauser
796553608aSNikolas Klauser // exp2
806553608aSNikolas Klauser
exp2(float __x)816553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float exp2(float __x) _NOEXCEPT { return __builtin_exp2f(__x); }
826553608aSNikolas Klauser
836553608aSNikolas Klauser template <class = int>
exp2(double __x)846553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double exp2(double __x) _NOEXCEPT {
856553608aSNikolas Klauser return __builtin_exp2(__x);
866553608aSNikolas Klauser }
876553608aSNikolas Klauser
exp2(long double __x)886553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double exp2(long double __x) _NOEXCEPT { return __builtin_exp2l(__x); }
896553608aSNikolas Klauser
90f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
exp2(_A1 __x)91f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI double exp2(_A1 __x) _NOEXCEPT {
920e4d812fSNikolas Klauser return __builtin_exp2((double)__x);
930e4d812fSNikolas Klauser }
946553608aSNikolas Klauser
956553608aSNikolas Klauser // expm1
966553608aSNikolas Klauser
expm1(float __x)976553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float expm1(float __x) _NOEXCEPT { return __builtin_expm1f(__x); }
986553608aSNikolas Klauser
996553608aSNikolas Klauser template <class = int>
expm1(double __x)1006553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double expm1(double __x) _NOEXCEPT {
1016553608aSNikolas Klauser return __builtin_expm1(__x);
1026553608aSNikolas Klauser }
1036553608aSNikolas Klauser
expm1(long double __x)1046553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double expm1(long double __x) _NOEXCEPT { return __builtin_expm1l(__x); }
1056553608aSNikolas Klauser
106f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
expm1(_A1 __x)107f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI double expm1(_A1 __x) _NOEXCEPT {
1080e4d812fSNikolas Klauser return __builtin_expm1((double)__x);
1090e4d812fSNikolas Klauser }
1106553608aSNikolas Klauser
1116553608aSNikolas Klauser // scalbln
1126553608aSNikolas Klauser
scalbln(float __x,long __y)1136553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float scalbln(float __x, long __y) _NOEXCEPT { return __builtin_scalblnf(__x, __y); }
1146553608aSNikolas Klauser
1156553608aSNikolas Klauser template <class = int>
scalbln(double __x,long __y)1166553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double scalbln(double __x, long __y) _NOEXCEPT {
1176553608aSNikolas Klauser return __builtin_scalbln(__x, __y);
1186553608aSNikolas Klauser }
1196553608aSNikolas Klauser
scalbln(long double __x,long __y)1200e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double scalbln(long double __x, long __y) _NOEXCEPT {
1210e4d812fSNikolas Klauser return __builtin_scalblnl(__x, __y);
1220e4d812fSNikolas Klauser }
1236553608aSNikolas Klauser
124f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
scalbln(_A1 __x,long __y)125f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI double scalbln(_A1 __x, long __y) _NOEXCEPT {
1260e4d812fSNikolas Klauser return __builtin_scalbln((double)__x, __y);
1270e4d812fSNikolas Klauser }
1286553608aSNikolas Klauser
1296553608aSNikolas Klauser // scalbn
1306553608aSNikolas Klauser
scalbn(float __x,int __y)1316553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float scalbn(float __x, int __y) _NOEXCEPT { return __builtin_scalbnf(__x, __y); }
1326553608aSNikolas Klauser
1336553608aSNikolas Klauser template <class = int>
scalbn(double __x,int __y)1346553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double scalbn(double __x, int __y) _NOEXCEPT {
1356553608aSNikolas Klauser return __builtin_scalbn(__x, __y);
1366553608aSNikolas Klauser }
1376553608aSNikolas Klauser
scalbn(long double __x,int __y)1380e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double scalbn(long double __x, int __y) _NOEXCEPT {
1390e4d812fSNikolas Klauser return __builtin_scalbnl(__x, __y);
1400e4d812fSNikolas Klauser }
1416553608aSNikolas Klauser
142f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
scalbn(_A1 __x,int __y)143f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI double scalbn(_A1 __x, int __y) _NOEXCEPT {
1440e4d812fSNikolas Klauser return __builtin_scalbn((double)__x, __y);
1450e4d812fSNikolas Klauser }
1466553608aSNikolas Klauser
1476553608aSNikolas Klauser // pow
1486553608aSNikolas Klauser
pow(float __x,float __y)1496553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float pow(float __x, float __y) _NOEXCEPT { return __builtin_powf(__x, __y); }
1506553608aSNikolas Klauser
1516553608aSNikolas Klauser template <class = int>
pow(double __x,double __y)1526553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double pow(double __x, double __y) _NOEXCEPT {
1536553608aSNikolas Klauser return __builtin_pow(__x, __y);
1546553608aSNikolas Klauser }
1556553608aSNikolas Klauser
pow(long double __x,long double __y)1560e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double pow(long double __x, long double __y) _NOEXCEPT {
1570e4d812fSNikolas Klauser return __builtin_powl(__x, __y);
1580e4d812fSNikolas Klauser }
1596553608aSNikolas Klauser
160f3589d25SNikolas Klauser template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>
pow(_A1 __x,_A2 __y)161f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI typename __promote<_A1, _A2>::type pow(_A1 __x, _A2 __y) _NOEXCEPT {
162dcdcc7c8SNikolas Klauser using __result_type = typename __promote<_A1, _A2>::type;
163*6b4b29f8SNikolas Klauser static_assert(!(_IsSame<_A1, __result_type>::value && _IsSame<_A2, __result_type>::value), "");
1646553608aSNikolas Klauser return __math::pow((__result_type)__x, (__result_type)__y);
1656553608aSNikolas Klauser }
1666553608aSNikolas Klauser
1676553608aSNikolas Klauser } // namespace __math
1686553608aSNikolas Klauser
1696553608aSNikolas Klauser _LIBCPP_END_NAMESPACE_STD
1706553608aSNikolas Klauser
1716553608aSNikolas Klauser #endif // _LIBCPP___MATH_EXPONENTIAL_FUNCTIONS_H
172