13 #include <type_traits> 20 constexpr T dabs(T
a) noexcept
22 return a >= T{0} ?
a : -
a;
27 constexpr
typename std::enable_if<!std::is_unsigned<T>::value,
bool>::type
28 is_zero(T
a, T prec = std::numeric_limits<T>::epsilon()) noexcept
30 return dabs(a) <= prec;
35 constexpr
bool is_equal(T a, T b, T prec = std::numeric_limits<T>::epsilon()) noexcept
37 return is_zero(a - b, prec);
43 constexpr
bool is_equal_rel(T a, T b, T prec = std::numeric_limits<T>::epsilon()) noexcept
45 if (is_equal(a, b, std::numeric_limits<T>::epsilon()))
48 const T min = std::min(dabs(a), dabs(b));
50 if (min < std::numeric_limits<T>::epsilon()) {
51 return is_equal(a, b, prec);
54 const T max = std::max(dabs(a), dabs(b));
56 return is_equal(a, b, prec*max);
61 constexpr
bool is_close(T a, T b, T prec = std::numeric_limits<T>::epsilon()) noexcept
63 const T max = std::max(dabs(a), dabs(b));
64 return is_zero(a - b, prec*(1 + max));