halcheck 1.0
Loading...
Searching...
No Matches
numeric.hpp
1#ifndef HALCHECK_LIB_NUMERIC_HPP
2#define HALCHECK_LIB_NUMERIC_HPP
3
11#include <halcheck/lib/type_traits.hpp>
12
13#include <cmath>
14#include <limits>
15
16namespace halcheck { namespace lib {
17
23template<typename T, HALCHECK_REQUIRE(std::is_integral<T>())>
24constexpr T midpoint(T min, T max) noexcept {
26 return min <= max ? min + T(U(max - min) >> 1) : min - T(U(min - max) >> 1);
27}
28
34template<typename T, HALCHECK_REQUIRE(std::is_floating_point<T>())>
35T midpoint(T min, T max) noexcept {
36 static const T lo = std::numeric_limits<T>::min() * 2;
37 static const T hi = std::numeric_limits<T>::max() / 2;
38 auto amin = std::fabs(min);
39 auto amax = std::fabs(max);
40 return amin < hi && amax < hi ? (min + max) / 2
41 : amin < lo ? min + max / 2
42 : amax < lo ? min / 2 + max
43 : min / 2 + max / 2;
44}
45
54template<typename T, HALCHECK_REQUIRE(std::is_integral<T>())>
58
59}} // namespace halcheck::lib
60
61#endif
T fabs(T... args)
lib::make_unsigned_t< T > to_unsigned(T value)
Converts an integral value into its equivalent unsigned version.
Definition numeric.hpp:55
constexpr T midpoint(T min, T max) noexcept
An implementation of std::midpoint.
Definition numeric.hpp:24
typename std::make_unsigned< T >::type make_unsigned_t
An implementation of std::make_unsigned_t.
Definition type_traits.hpp:125
T max(T... args)
T min(T... args)