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_ROUNDING_FUNCTIONS_H 106553608aSNikolas Klauser #define _LIBCPP___MATH_ROUNDING_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 // ceil 286553608aSNikolas Klauser 29*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI float ceil(float __x) _NOEXCEPT { return __builtin_ceilf(__x); } 306553608aSNikolas Klauser 316553608aSNikolas Klauser template <class = int> 32*17e0686aSNikolas Klauser [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI double ceil(double __x) _NOEXCEPT { 336553608aSNikolas Klauser return __builtin_ceil(__x); 346553608aSNikolas Klauser } 356553608aSNikolas Klauser 36*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI long double ceil(long double __x) _NOEXCEPT { 370e4d812fSNikolas Klauser return __builtin_ceill(__x); 380e4d812fSNikolas Klauser } 396553608aSNikolas Klauser 40f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0> 41*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI double ceil(_A1 __x) _NOEXCEPT { 420e4d812fSNikolas Klauser return __builtin_ceil((double)__x); 430e4d812fSNikolas Klauser } 446553608aSNikolas Klauser 456553608aSNikolas Klauser // floor 466553608aSNikolas Klauser 47*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI float floor(float __x) _NOEXCEPT { return __builtin_floorf(__x); } 486553608aSNikolas Klauser 496553608aSNikolas Klauser template <class = int> 50*17e0686aSNikolas Klauser [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI double floor(double __x) _NOEXCEPT { 516553608aSNikolas Klauser return __builtin_floor(__x); 526553608aSNikolas Klauser } 536553608aSNikolas Klauser 54*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI long double floor(long double __x) _NOEXCEPT { 550e4d812fSNikolas Klauser return __builtin_floorl(__x); 560e4d812fSNikolas Klauser } 576553608aSNikolas Klauser 58f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0> 59*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI double floor(_A1 __x) _NOEXCEPT { 600e4d812fSNikolas Klauser return __builtin_floor((double)__x); 610e4d812fSNikolas Klauser } 626553608aSNikolas Klauser 636553608aSNikolas Klauser // llrint 646553608aSNikolas Klauser 650e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long long llrint(float __x) _NOEXCEPT { return __builtin_llrintf(__x); } 666553608aSNikolas Klauser 676553608aSNikolas Klauser template <class = int> 686553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI long long llrint(double __x) _NOEXCEPT { 696553608aSNikolas Klauser return __builtin_llrint(__x); 706553608aSNikolas Klauser } 716553608aSNikolas Klauser 720e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long long llrint(long double __x) _NOEXCEPT { return __builtin_llrintl(__x); } 736553608aSNikolas Klauser 74f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0> 75f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long long llrint(_A1 __x) _NOEXCEPT { 766553608aSNikolas Klauser return __builtin_llrint((double)__x); 776553608aSNikolas Klauser } 786553608aSNikolas Klauser 796553608aSNikolas Klauser // llround 806553608aSNikolas Klauser 810e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long long llround(float __x) _NOEXCEPT { return __builtin_llroundf(__x); } 826553608aSNikolas Klauser 836553608aSNikolas Klauser template <class = int> 846553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI long long llround(double __x) _NOEXCEPT { 856553608aSNikolas Klauser return __builtin_llround(__x); 866553608aSNikolas Klauser } 876553608aSNikolas Klauser 880e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long long llround(long double __x) _NOEXCEPT { return __builtin_llroundl(__x); } 896553608aSNikolas Klauser 90f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0> 91f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long long llround(_A1 __x) _NOEXCEPT { 926553608aSNikolas Klauser return __builtin_llround((double)__x); 936553608aSNikolas Klauser } 946553608aSNikolas Klauser 956553608aSNikolas Klauser // lrint 966553608aSNikolas Klauser 970e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long lrint(float __x) _NOEXCEPT { return __builtin_lrintf(__x); } 986553608aSNikolas Klauser 996553608aSNikolas Klauser template <class = int> 1006553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI long lrint(double __x) _NOEXCEPT { 1016553608aSNikolas Klauser return __builtin_lrint(__x); 1026553608aSNikolas Klauser } 1036553608aSNikolas Klauser 1040e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long lrint(long double __x) _NOEXCEPT { return __builtin_lrintl(__x); } 1056553608aSNikolas Klauser 106f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0> 107f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long lrint(_A1 __x) _NOEXCEPT { 1086553608aSNikolas Klauser return __builtin_lrint((double)__x); 1096553608aSNikolas Klauser } 1106553608aSNikolas Klauser 1116553608aSNikolas Klauser // lround 1126553608aSNikolas Klauser 1130e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long lround(float __x) _NOEXCEPT { return __builtin_lroundf(__x); } 1146553608aSNikolas Klauser 1156553608aSNikolas Klauser template <class = int> 1166553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI long lround(double __x) _NOEXCEPT { 1176553608aSNikolas Klauser return __builtin_lround(__x); 1186553608aSNikolas Klauser } 1196553608aSNikolas Klauser 1200e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long lround(long double __x) _NOEXCEPT { return __builtin_lroundl(__x); } 1216553608aSNikolas Klauser 122f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0> 123f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long lround(_A1 __x) _NOEXCEPT { 1246553608aSNikolas Klauser return __builtin_lround((double)__x); 1256553608aSNikolas Klauser } 1266553608aSNikolas Klauser 1276553608aSNikolas Klauser // nearbyint 1286553608aSNikolas Klauser 129*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI float nearbyint(float __x) _NOEXCEPT { 1300e4d812fSNikolas Klauser return __builtin_nearbyintf(__x); 1310e4d812fSNikolas Klauser } 1326553608aSNikolas Klauser 1336553608aSNikolas Klauser template <class = int> 134*17e0686aSNikolas Klauser [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI double nearbyint(double __x) _NOEXCEPT { 1356553608aSNikolas Klauser return __builtin_nearbyint(__x); 1366553608aSNikolas Klauser } 1376553608aSNikolas Klauser 138*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI long double nearbyint(long double __x) _NOEXCEPT { 1390e4d812fSNikolas Klauser return __builtin_nearbyintl(__x); 1400e4d812fSNikolas Klauser } 1416553608aSNikolas Klauser 142f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0> 143*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI double nearbyint(_A1 __x) _NOEXCEPT { 1440e4d812fSNikolas Klauser return __builtin_nearbyint((double)__x); 1450e4d812fSNikolas Klauser } 1466553608aSNikolas Klauser 1476553608aSNikolas Klauser // nextafter 1486553608aSNikolas Klauser 1496553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float nextafter(float __x, float __y) _NOEXCEPT { return __builtin_nextafterf(__x, __y); } 1506553608aSNikolas Klauser 1516553608aSNikolas Klauser template <class = int> 1526553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double nextafter(double __x, double __y) _NOEXCEPT { 1536553608aSNikolas Klauser return __builtin_nextafter(__x, __y); 1546553608aSNikolas Klauser } 1556553608aSNikolas Klauser 1560e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double nextafter(long double __x, long double __y) _NOEXCEPT { 1570e4d812fSNikolas Klauser return __builtin_nextafterl(__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> 161f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI typename __promote<_A1, _A2>::type nextafter(_A1 __x, _A2 __y) _NOEXCEPT { 162dcdcc7c8SNikolas Klauser using __result_type = typename __promote<_A1, _A2>::type; 1636b4b29f8SNikolas Klauser static_assert(!(_IsSame<_A1, __result_type>::value && _IsSame<_A2, __result_type>::value), ""); 1646553608aSNikolas Klauser return __math::nextafter((__result_type)__x, (__result_type)__y); 1656553608aSNikolas Klauser } 1666553608aSNikolas Klauser 1676553608aSNikolas Klauser // nexttoward 1686553608aSNikolas Klauser 1690e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float nexttoward(float __x, long double __y) _NOEXCEPT { 1700e4d812fSNikolas Klauser return __builtin_nexttowardf(__x, __y); 1710e4d812fSNikolas Klauser } 1726553608aSNikolas Klauser 1736553608aSNikolas Klauser template <class = int> 1746553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double nexttoward(double __x, long double __y) _NOEXCEPT { 1756553608aSNikolas Klauser return __builtin_nexttoward(__x, __y); 1766553608aSNikolas Klauser } 1776553608aSNikolas Klauser 1780e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double nexttoward(long double __x, long double __y) _NOEXCEPT { 1790e4d812fSNikolas Klauser return __builtin_nexttowardl(__x, __y); 1800e4d812fSNikolas Klauser } 1816553608aSNikolas Klauser 182f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0> 183f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI double nexttoward(_A1 __x, long double __y) _NOEXCEPT { 1840e4d812fSNikolas Klauser return __builtin_nexttoward((double)__x, __y); 1850e4d812fSNikolas Klauser } 1866553608aSNikolas Klauser 1876553608aSNikolas Klauser // rint 1886553608aSNikolas Klauser 189*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI float rint(float __x) _NOEXCEPT { return __builtin_rintf(__x); } 1906553608aSNikolas Klauser 1916553608aSNikolas Klauser template <class = int> 192*17e0686aSNikolas Klauser [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI double rint(double __x) _NOEXCEPT { 1936553608aSNikolas Klauser return __builtin_rint(__x); 1946553608aSNikolas Klauser } 1956553608aSNikolas Klauser 196*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI long double rint(long double __x) _NOEXCEPT { 1976553608aSNikolas Klauser return __builtin_rintl(__x); 1986553608aSNikolas Klauser } 1996553608aSNikolas Klauser 200f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0> 201*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI double rint(_A1 __x) _NOEXCEPT { 2026553608aSNikolas Klauser return __builtin_rint((double)__x); 2036553608aSNikolas Klauser } 2046553608aSNikolas Klauser 2056553608aSNikolas Klauser // round 2066553608aSNikolas Klauser 207*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI float round(float __x) _NOEXCEPT { return __builtin_round(__x); } 2086553608aSNikolas Klauser 2096553608aSNikolas Klauser template <class = int> 210*17e0686aSNikolas Klauser [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI double round(double __x) _NOEXCEPT { 2116553608aSNikolas Klauser return __builtin_round(__x); 2126553608aSNikolas Klauser } 2136553608aSNikolas Klauser 214*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI long double round(long double __x) _NOEXCEPT { 2156553608aSNikolas Klauser return __builtin_roundl(__x); 2166553608aSNikolas Klauser } 2176553608aSNikolas Klauser 218f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0> 219*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI double round(_A1 __x) _NOEXCEPT { 2206553608aSNikolas Klauser return __builtin_round((double)__x); 2216553608aSNikolas Klauser } 2226553608aSNikolas Klauser 2236553608aSNikolas Klauser // trunc 2246553608aSNikolas Klauser 225*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI float trunc(float __x) _NOEXCEPT { return __builtin_trunc(__x); } 2266553608aSNikolas Klauser 2276553608aSNikolas Klauser template <class = int> 228*17e0686aSNikolas Klauser [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI double trunc(double __x) _NOEXCEPT { 2296553608aSNikolas Klauser return __builtin_trunc(__x); 2306553608aSNikolas Klauser } 2316553608aSNikolas Klauser 232*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI long double trunc(long double __x) _NOEXCEPT { 2336553608aSNikolas Klauser return __builtin_truncl(__x); 2346553608aSNikolas Klauser } 2356553608aSNikolas Klauser 236f3589d25SNikolas Klauser template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0> 237*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI double trunc(_A1 __x) _NOEXCEPT { 2386553608aSNikolas Klauser return __builtin_trunc((double)__x); 2396553608aSNikolas Klauser } 2406553608aSNikolas Klauser 2416553608aSNikolas Klauser } // namespace __math 2426553608aSNikolas Klauser 2436553608aSNikolas Klauser _LIBCPP_END_NAMESPACE_STD 2446553608aSNikolas Klauser 2456553608aSNikolas Klauser #endif // _LIBCPP___MATH_ROUNDING_FUNCTIONS_H 246