13 #ifndef INCLUDE_MOLASSEMBLER_TEMPLTE_CONSTEXPR_FP_COMPARISON_H
14 #define INCLUDE_MOLASSEMBLER_TEMPLTE_CONSTEXPR_FP_COMPARISON_H
22 namespace Molassembler {
30 constexpr std::enable_if_t<
31 std::is_floating_point<T>::value,
40 constexpr std::enable_if_t<
41 std::is_floating_point<T>::value,
54 constexpr std::enable_if_t<
55 std::is_floating_point<T>::value,
57 > isCloseRelativeOrAbsolute(
66 std::is_floating_point<T>::value,
68 > isCloseRelativeOrAbsolute(
71 const T relativeTolerance,
72 const T absoluteTolerance
75 a != std::numeric_limits<T>::infinity()
76 && a != - std::numeric_limits<T>::infinity()
77 && b != std::numeric_limits<T>::infinity()
78 && b != - std::numeric_limits<T>::infinity()
79 && a != std::numeric_limits<T>::quiet_NaN()
80 && b != std::numeric_limits<T>::quiet_NaN()
81 && a != std::numeric_limits<T>::signaling_NaN()
82 && b != std::numeric_limits<T>::signaling_NaN()
84 throw "isCloseRelativeOrAbsolute cannot handle infinities or NaNs!";
87 if(!(relativeTolerance >= 0 && absoluteTolerance >= 0)) {
88 throw "isCloseRelativeOrAbsolute: One of either tolerances "
89 "needs to be above zero!";
95 relativeTolerance * Math::max(
108 std::is_floating_point<T>::value,
113 const T relativeTolerance
115 return Detail::isCloseRelativeOrAbsolute(
125 std::is_floating_point<T>::value,
130 const T absoluteTolerance
132 return Detail::isCloseRelativeOrAbsolute(
145 const T absoluteTolerance_;
149 : absoluteTolerance_(absoluteTolerance)
152 absoluteTolerance > 0
153 && absoluteTolerance != std::numeric_limits<T>::infinity()
154 && absoluteTolerance != std::numeric_limits<T>::quiet_NaN()
155 && absoluteTolerance != std::numeric_limits<T>::signaling_NaN()
159 constexpr
bool isLessThan(
const T a,
const T b)
const noexcept {
160 return a < (b - absoluteTolerance_);
163 constexpr
bool isMoreThan(
const T a,
const T b)
const noexcept {
164 return a > (b + absoluteTolerance_);
167 constexpr
bool isLessOrEqual(
const T a,
const T b)
const noexcept {
168 return a < (b + absoluteTolerance_);
171 constexpr
bool isMoreOrEqual(
const T a,
const T b)
const noexcept {
172 return a > (b - absoluteTolerance_);
175 constexpr
bool isEqual(
const T a,
const T b)
const noexcept {
176 return Math::abs(a - b) <= absoluteTolerance_;
179 constexpr
bool isUnequal(
const T a,
const T b)
const noexcept {
180 return !isEqual(a, b);
184 constexpr
bool operator () (
const T a,
const T b)
const noexcept {
185 return isEqual(a, b);
192 const T relativeTolerance_;
196 : relativeTolerance_(relativeTolerance)
198 assert(relativeTolerance > 0);
201 constexpr
bool isLessThan(
const T a,
const T b)
const {
203 (a < b) && !Detail::isCloseRelativeOrAbsolute(
212 constexpr
bool isMoreThan(
const T a,
const T b)
const {
214 (a > b) && !Detail::isCloseRelativeOrAbsolute(
223 constexpr
bool isLessOrEqual(
const T a,
const T b)
const {
225 (a < b) || Detail::isCloseRelativeOrAbsolute(
234 constexpr
bool isMoreOrEqual(
const T a,
const T b)
const {
236 (a > b) || Detail::isCloseRelativeOrAbsolute(
245 constexpr
bool isEqual(
const T a,
const T b)
const {
246 return Detail::isCloseRelativeOrAbsolute(
254 constexpr
bool isUnequal(
const T a,
const T b)
const {
255 return !Detail::isCloseRelativeOrAbsolute(
264 constexpr
bool operator () (
const T a,
const T b)
const noexcept {
265 return isEqual(a, b);
constexpr math implementations
constexpr bool operator()(const T a, const T b) const noexcept
Function call operator compares equality.
Definition: FloatingPointComparison.h:184
Definition: FloatingPointComparison.h:190
Definition: FloatingPointComparison.h:143
#define PURITY_STRONG
Definition: Preprocessor.h:65
constexpr bool operator()(const T a, const T b) const noexcept
Function call operator compares equality.
Definition: FloatingPointComparison.h:264