23 #ifndef GUL14_NUM_UTIL_H_
24 #define GUL14_NUM_UTIL_H_
29 #include <type_traits>
46 template<
typename ValueT>
47 constexpr
auto abs(ValueT n) noexcept -> std::enable_if_t<std::is_unsigned<ValueT>::value, ValueT>
55 template<
typename ValueT>
56 constexpr
auto abs(ValueT n) noexcept -> std::enable_if_t<not std::is_unsigned<ValueT>::value, ValueT>
86 template<
typename NumT,
typename OrderT,
87 typename = std::enable_if_t<
88 std::is_arithmetic<NumT>::value
89 and std::is_arithmetic<OrderT>::value
91 bool within_orders(
const NumT a,
const NumT b,
const OrderT orders) noexcept(
false) {
94 if (difference == NumT{ 0 })
97 auto limit =
maximum / std::pow(
static_cast<std::decay_t<NumT>
>(10.0), orders);
98 return difference < limit;
112 template<
typename NumT>
117 if (std::is_floating_point<NumT>::value)
122 if (std::is_floating_point<NumT>::value)
146 template<
typename NumT,
147 typename = std::enable_if_t<std::is_floating_point<NumT>::value>>
156 if (std::isnormal(maxval))
158 return diff <= std::numeric_limits<NumT>::epsilon()
159 *
static_cast<NumT
>(ulp) * maxval;
163 if (std::isfinite(maxval))
164 return diff <= std::numeric_limits<NumT>::denorm_min() *
static_cast<NumT
>(ulp);
202 constexpr
const NumT&
clamp(
const NumT& v,
const NumT& lo,
const NumT& hi) {
203 return std::max(lo, std::min(v, hi));
228 template<
class NumT,
class Compare>
229 constexpr
const NumT&
clamp(
const NumT& v,
const NumT& lo,
const NumT& hi, Compare comp) {
Definition of macros used internally by GUL.
Namespace gul14 contains all functions and classes of the General Utility Library.
Definition: doxygen.h:26
constexpr auto abs(ValueT n) noexcept -> std::enable_if_t< std::is_unsigned< ValueT >::value, ValueT >
Compute the absolute value of a number.
Definition: num_util.h:47
bool within_abs(NumT a, NumT b, NumT tol) noexcept
Determine if two numbers are almost equal, allowing for an absolute difference.
Definition: num_util.h:113
bool within_ulp(NumT a, NumT b, unsigned int ulp)
Determine if two numbers are almost equal, allowing for a difference of a given number of units-in-th...
Definition: num_util.h:148
auto maximum(ContainerT const &container, Accessor accessor=ElementAccessor< ElementT >()) -> DataT
Return the maximum element value in a container.
Definition: statistics.h:308
bool within_orders(const NumT a, const NumT b, const OrderT orders) noexcept(false)
Determine if two numbers are almost equal, comparing only some significant digits.
Definition: num_util.h:91
constexpr const NumT & clamp(const NumT &v, const NumT &lo, const NumT &hi)
Coerce a value to be within a given range.
Definition: num_util.h:202