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_LOGARITHMS_H
106553608aSNikolas Klauser #define _LIBCPP___MATH_LOGARITHMS_H
116553608aSNikolas Klauser
126553608aSNikolas Klauser #include <__config>
136553608aSNikolas Klauser #include <__type_traits/enable_if.h>
146553608aSNikolas Klauser #include <__type_traits/is_integral.h>
156553608aSNikolas Klauser
166553608aSNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
176553608aSNikolas Klauser # pragma GCC system_header
186553608aSNikolas Klauser #endif
196553608aSNikolas Klauser
206553608aSNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
216553608aSNikolas Klauser
226553608aSNikolas Klauser namespace __math {
236553608aSNikolas Klauser
246553608aSNikolas Klauser // log
256553608aSNikolas Klauser
log(float __x)266553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float log(float __x) _NOEXCEPT { return __builtin_logf(__x); }
276553608aSNikolas Klauser
286553608aSNikolas Klauser template <class = int>
log(double __x)296553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double log(double __x) _NOEXCEPT {
306553608aSNikolas Klauser return __builtin_log(__x);
316553608aSNikolas Klauser }
326553608aSNikolas Klauser
log(long double __x)336553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double log(long double __x) _NOEXCEPT { return __builtin_logl(__x); }
346553608aSNikolas Klauser
35*f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
log(_A1 __x)36*f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI double log(_A1 __x) _NOEXCEPT {
370e4d812fSNikolas Klauser return __builtin_log((double)__x);
380e4d812fSNikolas Klauser }
396553608aSNikolas Klauser
406553608aSNikolas Klauser // log10
416553608aSNikolas Klauser
log10(float __x)426553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float log10(float __x) _NOEXCEPT { return __builtin_log10f(__x); }
436553608aSNikolas Klauser
446553608aSNikolas Klauser template <class = int>
log10(double __x)456553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double log10(double __x) _NOEXCEPT {
466553608aSNikolas Klauser return __builtin_log10(__x);
476553608aSNikolas Klauser }
486553608aSNikolas Klauser
log10(long double __x)496553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double log10(long double __x) _NOEXCEPT { return __builtin_log10l(__x); }
506553608aSNikolas Klauser
51*f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
log10(_A1 __x)52*f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI double log10(_A1 __x) _NOEXCEPT {
530e4d812fSNikolas Klauser return __builtin_log10((double)__x);
540e4d812fSNikolas Klauser }
556553608aSNikolas Klauser
566553608aSNikolas Klauser // ilogb
576553608aSNikolas Klauser
ilogb(float __x)586553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI int ilogb(float __x) _NOEXCEPT { return __builtin_ilogbf(__x); }
596553608aSNikolas Klauser
606553608aSNikolas Klauser template <class = int>
ilogb(double __x)616553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double ilogb(double __x) _NOEXCEPT {
626553608aSNikolas Klauser return __builtin_ilogb(__x);
636553608aSNikolas Klauser }
646553608aSNikolas Klauser
ilogb(long double __x)656553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI int ilogb(long double __x) _NOEXCEPT { return __builtin_ilogbl(__x); }
666553608aSNikolas Klauser
67*f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
ilogb(_A1 __x)68*f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI int ilogb(_A1 __x) _NOEXCEPT {
690e4d812fSNikolas Klauser return __builtin_ilogb((double)__x);
700e4d812fSNikolas Klauser }
716553608aSNikolas Klauser
726553608aSNikolas Klauser // log1p
736553608aSNikolas Klauser
log1p(float __x)746553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float log1p(float __x) _NOEXCEPT { return __builtin_log1pf(__x); }
756553608aSNikolas Klauser
766553608aSNikolas Klauser template <class = int>
log1p(double __x)776553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double log1p(double __x) _NOEXCEPT {
786553608aSNikolas Klauser return __builtin_log1p(__x);
796553608aSNikolas Klauser }
806553608aSNikolas Klauser
log1p(long double __x)816553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double log1p(long double __x) _NOEXCEPT { return __builtin_log1pl(__x); }
826553608aSNikolas Klauser
83*f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
log1p(_A1 __x)84*f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI double log1p(_A1 __x) _NOEXCEPT {
850e4d812fSNikolas Klauser return __builtin_log1p((double)__x);
860e4d812fSNikolas Klauser }
876553608aSNikolas Klauser
886553608aSNikolas Klauser // log2
896553608aSNikolas Klauser
log2(float __x)906553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float log2(float __x) _NOEXCEPT { return __builtin_log2f(__x); }
916553608aSNikolas Klauser
926553608aSNikolas Klauser template <class = int>
log2(double __x)936553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double log2(double __x) _NOEXCEPT {
946553608aSNikolas Klauser return __builtin_log2(__x);
956553608aSNikolas Klauser }
966553608aSNikolas Klauser
log2(long double __x)976553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double log2(long double __x) _NOEXCEPT { return __builtin_log2l(__x); }
986553608aSNikolas Klauser
99*f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
log2(_A1 __x)100*f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI double log2(_A1 __x) _NOEXCEPT {
1010e4d812fSNikolas Klauser return __builtin_log2((double)__x);
1020e4d812fSNikolas Klauser }
1036553608aSNikolas Klauser
1046553608aSNikolas Klauser // logb
1056553608aSNikolas Klauser
logb(float __x)1066553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float logb(float __x) _NOEXCEPT { return __builtin_logbf(__x); }
1076553608aSNikolas Klauser
1086553608aSNikolas Klauser template <class = int>
logb(double __x)1096553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double logb(double __x) _NOEXCEPT {
1106553608aSNikolas Klauser return __builtin_logb(__x);
1116553608aSNikolas Klauser }
1126553608aSNikolas Klauser
logb(long double __x)1136553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double logb(long double __x) _NOEXCEPT { return __builtin_logbl(__x); }
1146553608aSNikolas Klauser
115*f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
logb(_A1 __x)116*f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI double logb(_A1 __x) _NOEXCEPT {
1170e4d812fSNikolas Klauser return __builtin_logb((double)__x);
1180e4d812fSNikolas Klauser }
1196553608aSNikolas Klauser
1206553608aSNikolas Klauser } // namespace __math
1216553608aSNikolas Klauser
1226553608aSNikolas Klauser _LIBCPP_END_NAMESPACE_STD
1236553608aSNikolas Klauser
1246553608aSNikolas Klauser #endif // _LIBCPP___MATH_LOGARITHMS_H
125