Path: blob/main/contrib/llvm-project/libcxx/include/__math/rounding_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_ROUNDING_FUNCTIONS_H9#define _LIBCPP___MATH_ROUNDING_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// ceil2728_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI float ceil(float __x) _NOEXCEPT { return __builtin_ceilf(__x); }2930template <class = int>31_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI double ceil(double __x) _NOEXCEPT {32return __builtin_ceil(__x);33}3435_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI long double ceil(long double __x) _NOEXCEPT {36return __builtin_ceill(__x);37}3839template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>40_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI double ceil(_A1 __x) _NOEXCEPT {41return __builtin_ceil((double)__x);42}4344// floor4546_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI float floor(float __x) _NOEXCEPT { return __builtin_floorf(__x); }4748template <class = int>49_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI double floor(double __x) _NOEXCEPT {50return __builtin_floor(__x);51}5253_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI long double floor(long double __x) _NOEXCEPT {54return __builtin_floorl(__x);55}5657template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>58_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI double floor(_A1 __x) _NOEXCEPT {59return __builtin_floor((double)__x);60}6162// llrint6364inline _LIBCPP_HIDE_FROM_ABI long long llrint(float __x) _NOEXCEPT { return __builtin_llrintf(__x); }6566template <class = int>67_LIBCPP_HIDE_FROM_ABI long long llrint(double __x) _NOEXCEPT {68return __builtin_llrint(__x);69}7071inline _LIBCPP_HIDE_FROM_ABI long long llrint(long double __x) _NOEXCEPT { return __builtin_llrintl(__x); }7273template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>74inline _LIBCPP_HIDE_FROM_ABI long long llrint(_A1 __x) _NOEXCEPT {75return __builtin_llrint((double)__x);76}7778// llround7980inline _LIBCPP_HIDE_FROM_ABI long long llround(float __x) _NOEXCEPT { return __builtin_llroundf(__x); }8182template <class = int>83_LIBCPP_HIDE_FROM_ABI long long llround(double __x) _NOEXCEPT {84return __builtin_llround(__x);85}8687inline _LIBCPP_HIDE_FROM_ABI long long llround(long double __x) _NOEXCEPT { return __builtin_llroundl(__x); }8889template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>90inline _LIBCPP_HIDE_FROM_ABI long long llround(_A1 __x) _NOEXCEPT {91return __builtin_llround((double)__x);92}9394// lrint9596inline _LIBCPP_HIDE_FROM_ABI long lrint(float __x) _NOEXCEPT { return __builtin_lrintf(__x); }9798template <class = int>99_LIBCPP_HIDE_FROM_ABI long lrint(double __x) _NOEXCEPT {100return __builtin_lrint(__x);101}102103inline _LIBCPP_HIDE_FROM_ABI long lrint(long double __x) _NOEXCEPT { return __builtin_lrintl(__x); }104105template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>106inline _LIBCPP_HIDE_FROM_ABI long lrint(_A1 __x) _NOEXCEPT {107return __builtin_lrint((double)__x);108}109110// lround111112inline _LIBCPP_HIDE_FROM_ABI long lround(float __x) _NOEXCEPT { return __builtin_lroundf(__x); }113114template <class = int>115_LIBCPP_HIDE_FROM_ABI long lround(double __x) _NOEXCEPT {116return __builtin_lround(__x);117}118119inline _LIBCPP_HIDE_FROM_ABI long lround(long double __x) _NOEXCEPT { return __builtin_lroundl(__x); }120121template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>122inline _LIBCPP_HIDE_FROM_ABI long lround(_A1 __x) _NOEXCEPT {123return __builtin_lround((double)__x);124}125126// nearbyint127128_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI float nearbyint(float __x) _NOEXCEPT {129return __builtin_nearbyintf(__x);130}131132template <class = int>133_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI double nearbyint(double __x) _NOEXCEPT {134return __builtin_nearbyint(__x);135}136137_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI long double nearbyint(long double __x) _NOEXCEPT {138return __builtin_nearbyintl(__x);139}140141template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>142_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI double nearbyint(_A1 __x) _NOEXCEPT {143return __builtin_nearbyint((double)__x);144}145146// nextafter147148inline _LIBCPP_HIDE_FROM_ABI float nextafter(float __x, float __y) _NOEXCEPT { return __builtin_nextafterf(__x, __y); }149150template <class = int>151_LIBCPP_HIDE_FROM_ABI double nextafter(double __x, double __y) _NOEXCEPT {152return __builtin_nextafter(__x, __y);153}154155inline _LIBCPP_HIDE_FROM_ABI long double nextafter(long double __x, long double __y) _NOEXCEPT {156return __builtin_nextafterl(__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 nextafter(_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::nextafter((__result_type)__x, (__result_type)__y);164}165166// nexttoward167168inline _LIBCPP_HIDE_FROM_ABI float nexttoward(float __x, long double __y) _NOEXCEPT {169return __builtin_nexttowardf(__x, __y);170}171172template <class = int>173_LIBCPP_HIDE_FROM_ABI double nexttoward(double __x, long double __y) _NOEXCEPT {174return __builtin_nexttoward(__x, __y);175}176177inline _LIBCPP_HIDE_FROM_ABI long double nexttoward(long double __x, long double __y) _NOEXCEPT {178return __builtin_nexttowardl(__x, __y);179}180181template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>182inline _LIBCPP_HIDE_FROM_ABI double nexttoward(_A1 __x, long double __y) _NOEXCEPT {183return __builtin_nexttoward((double)__x, __y);184}185186// rint187188_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI float rint(float __x) _NOEXCEPT { return __builtin_rintf(__x); }189190template <class = int>191_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI double rint(double __x) _NOEXCEPT {192return __builtin_rint(__x);193}194195_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI long double rint(long double __x) _NOEXCEPT {196return __builtin_rintl(__x);197}198199template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>200_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI double rint(_A1 __x) _NOEXCEPT {201return __builtin_rint((double)__x);202}203204// round205206_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI float round(float __x) _NOEXCEPT { return __builtin_round(__x); }207208template <class = int>209_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI double round(double __x) _NOEXCEPT {210return __builtin_round(__x);211}212213_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI long double round(long double __x) _NOEXCEPT {214return __builtin_roundl(__x);215}216217template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>218_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI double round(_A1 __x) _NOEXCEPT {219return __builtin_round((double)__x);220}221222// trunc223224_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI float trunc(float __x) _NOEXCEPT { return __builtin_trunc(__x); }225226template <class = int>227_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI double trunc(double __x) _NOEXCEPT {228return __builtin_trunc(__x);229}230231_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI long double trunc(long double __x) _NOEXCEPT {232return __builtin_truncl(__x);233}234235template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>236_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI double trunc(_A1 __x) _NOEXCEPT {237return __builtin_trunc((double)__x);238}239240} // namespace __math241242_LIBCPP_END_NAMESPACE_STD243244#endif // _LIBCPP___MATH_ROUNDING_FUNCTIONS_H245246247