diff options
Diffstat (limited to 'src/common/include/gudhi/Unitary_tests_utils.h')
-rw-r--r-- | src/common/include/gudhi/Unitary_tests_utils.h | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/common/include/gudhi/Unitary_tests_utils.h b/src/common/include/gudhi/Unitary_tests_utils.h index 4ad4dae8..9f995d01 100644 --- a/src/common/include/gudhi/Unitary_tests_utils.h +++ b/src/common/include/gudhi/Unitary_tests_utils.h @@ -14,15 +14,27 @@ #include <iostream> #include <limits> // for std::numeric_limits<> +#include <cmath> // for std::fabs template<typename FloatingType > void GUDHI_TEST_FLOAT_EQUALITY_CHECK(FloatingType a, FloatingType b, FloatingType epsilon = std::numeric_limits<FloatingType>::epsilon()) { #ifdef DEBUG_TRACES - std::cout << "GUDHI_TEST_FLOAT_EQUALITY_CHECK - " << a << " versus " << b + std::clog << "GUDHI_TEST_FLOAT_EQUALITY_CHECK - " << a << " versus " << b << " | diff = " << std::fabs(a - b) << " - epsilon = " << epsilon << std::endl; #endif BOOST_CHECK(std::fabs(a - b) <= epsilon); } +// That's the usual x86 issue where a+b==a+b can return false (without any NaN) because one of them was stored in +// memory (and thus rounded to 64 bits) while the other is still in a register (80 bits). +template<typename FloatingType > +FloatingType GUDHI_PROTECT_FLOAT(FloatingType value) { + volatile FloatingType protected_value = value; +#ifdef DEBUG_TRACES + std::clog << "GUDHI_PROTECT_FLOAT - " << protected_value << std::endl; +#endif + return protected_value; +} + #endif // UNITARY_TESTS_UTILS_H_ |