20#ifndef COMMON_UTIL_NUMERIC_CMP
21#define COMMON_UTIL_NUMERIC_CMP
65 const double default_abs_epsilon = 1e-8;
66 const double default_rel_epsilon = 1e-5;
69 bool scalar_equal(T value1, T value2, T abs_eps , T rel_eps) {
70 static_assert(std::is_floating_point<T>::value,
"Function scalar_equal() A can only be instantiated with floating point types");
73 T diff = std::fabs(value1 - value2);
75 T scale = std::max(std::fabs(value1), std::fabs(value2));
77 if (diff > scale * rel_eps) {
86 bool scalar_equal(T value1, T value2) {
87 return scalar_equal<T>( value1 , value2 , default_abs_epsilon , default_rel_epsilon );
91 bool vector_equal(
const std::vector<T>& v1,
const std::vector<T>& v2, T abs_eps, T rel_eps) {
92 if (v1.size() != v2.size()) {
96 for (
size_t i = 0; i < v1.size(); i++) {
97 if (!scalar_equal<T>( v1[i], v2[i], abs_eps, rel_eps ))
105 bool vector_equal(
const std::vector<T>& v1,
const std::vector<T>& v2) {
106 return vector_equal<T>(v1, v2, default_abs_epsilon, default_rel_epsilon);
111 bool array_equal(
const T* p1,
const T* p2,
size_t num_elements, T abs_eps, T rel_eps) {
112 if (memcmp(p1 , p2 , num_elements *
sizeof * p1) == 0)
116 for (index = 0; index < num_elements; index++) {
117 if (!scalar_equal<T>( p1[index] , p2[index] , abs_eps , rel_eps)) {
127 bool array_equal(
const T* p1,
const T* p2,
size_t num_elements) {
128 return array_equal<T>(p1, p2, num_elements , default_abs_epsilon, default_rel_epsilon);
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30