55 #ifndef _GLIBCXX_NUMERIC
56 #define _GLIBCXX_NUMERIC 1
58 #pragma GCC system_header
64 #ifdef _GLIBCXX_PARALLEL
77 #if __cplusplus >= 201402L
80 namespace std _GLIBCXX_VISIBILITY(default)
82 _GLIBCXX_BEGIN_NAMESPACE_VERSION
87 template<
typename _Tp>
89 enable_if_t<__and_<is_integral<_Tp>, is_signed<_Tp>>::value, _Tp>
90 __abs_integral(_Tp __val)
91 {
return __val < 0 ? -__val : __val; }
93 template<
typename _Tp>
95 enable_if_t<__and_<is_integral<_Tp>, is_unsigned<_Tp>>::value, _Tp>
96 __abs_integral(_Tp __val)
99 void __abs_integral(
bool) =
delete;
101 template<
typename _Mn,
typename _Nn>
102 constexpr common_type_t<_Mn, _Nn>
103 __gcd(_Mn __m, _Nn __n)
105 return __m == 0 ? __detail::__abs_integral(__n)
106 : __n == 0 ? __detail::__abs_integral(__m)
107 : __detail::__gcd(__n, __m % __n);
111 template<
typename _Mn,
typename _Nn>
112 constexpr common_type_t<_Mn, _Nn>
115 return (__m != 0 && __n != 0)
116 ? (__detail::__abs_integral(__m) / __detail::__gcd(__m, __n))
117 * __detail::__abs_integral(__n)
122 #if __cplusplus >= 201703L
124 #define __cpp_lib_gcd_lcm 201606
126 #define __cpp_lib_gcd 201606
127 #define __cpp_lib_lcm 201606
130 template<
typename _Mn,
typename _Nn>
131 constexpr common_type_t<_Mn, _Nn>
132 gcd(_Mn __m, _Nn __n)
134 static_assert(is_integral_v<_Mn>,
"gcd arguments are integers");
135 static_assert(is_integral_v<_Nn>,
"gcd arguments are integers");
136 static_assert(!is_same_v<remove_cv_t<_Mn>,
bool>,
137 "gcd arguments are not bools");
138 static_assert(!is_same_v<remove_cv_t<_Nn>,
bool>,
139 "gcd arguments are not bools");
140 return __detail::__gcd(__m, __n);
144 template<
typename _Mn,
typename _Nn>
145 constexpr common_type_t<_Mn, _Nn>
146 lcm(_Mn __m, _Nn __n)
148 static_assert(is_integral_v<_Mn>,
"lcm arguments are integers");
149 static_assert(is_integral_v<_Nn>,
"lcm arguments are integers");
150 static_assert(!is_same_v<remove_cv_t<_Mn>,
bool>,
151 "lcm arguments are not bools");
152 static_assert(!is_same_v<remove_cv_t<_Nn>,
bool>,
153 "lcm arguments are not bools");
159 #if __cplusplus > 201703L
161 # define __cpp_lib_interpolate 201902L
163 template<
typename _Tp>
165 enable_if_t<__and_v<is_arithmetic<_Tp>, is_same<remove_cv_t<_Tp>, _Tp>,
166 __not_<is_same<_Tp, bool>>>,
170 if constexpr (is_integral_v<_Tp>)
172 using _Up = make_unsigned_t<_Tp>;
183 return __a + __k * _Tp(_Up(__M - __m) / 2);
187 return __builtin_isnormal(__a) && __builtin_isnormal(__b)
193 template<
typename _Tp>
195 enable_if_t<__and_v<is_object<_Tp>, bool_constant<sizeof(_Tp) != 0>>, _Tp*>
196 midpoint(_Tp* __a, _Tp* __b)
noexcept
198 return __a + (__b - __a) / 2;
202 _GLIBCXX_END_NAMESPACE_VERSION
207 #if __cplusplus > 201402L
209 # if __PSTL_EXECUTION_POLICIES_DEFINED
211 # include <pstl/glue_numeric_impl.h>
214 # include <pstl/glue_numeric_defs.h>
215 # define __PSTL_NUMERIC_FORWARD_DECLARED 1
219 # define __cpp_lib_parallel_algorithm 201703L
enable_if< ::__array_traits< _Tp, _Nm >::_Is_swappable::value >::type noexcept(noexcept(__one.swap(__two)))
swap
Parallel STL function calls corresponding to stl_numeric.h. The functions defined here mainly do case...
constexpr common_type_t< _Mn, _Nn > __lcm(_Mn __m, _Nn __n)
Least common multiple.