Numeric.h
26 lines
| 720 B
| text/x-c
|
CLexer
r6 | #ifndef NUMERIC_H | |||
#define NUMERIC_H | ||||
r0 | #include <cmath> | |||
#include <limits> | ||||
#include <type_traits> | ||||
#include <algorithm> | ||||
r6 | namespace SciQLop::numeric { | |||
r0 | /* | |||
taken from here https://en.cppreference.com/w/cpp/types/numeric_limits/epsilon | ||||
*/ | ||||
template<class T> | ||||
typename std::enable_if<!std::numeric_limits<T>::is_integer, bool>::type | ||||
r9 | almost_equal(T x, T y, int ulp=1) | |||
r0 | { | |||
// the machine epsilon has to be scaled to the magnitude of the values used | ||||
// and multiplied by the desired precision in ULPs (units in the last place) | ||||
return std::abs(x-y) <= std::numeric_limits<T>::epsilon() * std::abs(x+y) * ulp | ||||
// unless the result is subnormal | ||||
|| std::abs(x-y) < std::numeric_limits<T>::min(); | ||||
} | ||||
r6 | ||||
} | ||||
#endif | ||||