xref: /llvm-project/libcxx/include/__math/rounding_functions.h (revision 17e0686ab1107a1a675d8783383dedf70fa24033)
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