From: 박종현/동작제어Lab(SR)/Senior Engineer/삼성전자 Date: Fri, 18 May 2018 08:23:33 +0000 (+0900) Subject: [nncc.foundation] Add 'absolute_epsilon_equal' (#235) X-Git-Tag: nncc_backup~2682 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=72dc148904c2cfc8e6fa346dd30709a9b7d71f55;p=platform%2Fcore%2Fml%2Fnnfw.git [nncc.foundation] Add 'absolute_epsilon_equal' (#235) This commit introduces nncc::foundation::math::absolute_epsilon_equal, which compares two float values and returns true if their absolute diff is less than a specified threshold expressed as a multiple of machine epsilon. Signed-off-by: Jonghyun Park --- diff --git a/libs/foundation/include/nncc/foundation/math/Float.h b/libs/foundation/include/nncc/foundation/math/Float.h index 41626c2..5d05693 100644 --- a/libs/foundation/include/nncc/foundation/math/Float.h +++ b/libs/foundation/include/nncc/foundation/math/Float.h @@ -9,6 +9,7 @@ namespace math { bool relative_epsilon_equal(float lhs, float rhs, unsigned tolerance = 1); +bool absolute_epsilon_equal(float lhs, float rhs, float tolerance = 0.001); } // namespace math } // namespace foundation diff --git a/libs/foundation/src/math/Float.cpp b/libs/foundation/src/math/Float.cpp index d51b197..8d60eab 100644 --- a/libs/foundation/src/math/Float.cpp +++ b/libs/foundation/src/math/Float.cpp @@ -24,6 +24,18 @@ bool relative_epsilon_equal(float lhs, float rhs, unsigned tolerance) return delta <= (max * FLT_EPSILON * tolerance); } +bool absolute_epsilon_equal(float lhs, float rhs, float tolerance) +{ + if (std::isnan(lhs) && std::isnan(rhs)) + { + return true; + } + + const auto diff = std::fabs(lhs - rhs); + + return diff <= tolerance; +} + } // namespace math } // namespace foundation } // namespace nncc diff --git a/libs/foundation/src/math/Float.test.cpp b/libs/foundation/src/math/Float.test.cpp index 19117af..cb6a308 100644 --- a/libs/foundation/src/math/Float.test.cpp +++ b/libs/foundation/src/math/Float.test.cpp @@ -28,3 +28,28 @@ TEST(FOUNDATION_MATH_FLOAT, relative_epsilon_equal_tolerance_neg) { ASSERT_FALSE(nncc::foundation::math::relative_epsilon_equal(1.0f, 1.0f + 3 * FLT_EPSILON, 2)); } + +TEST(FOUNDATION_MATH_FLOAT, absolute_epsilon_equal_nan_nan) +{ + ASSERT_TRUE(nncc::foundation::math::absolute_epsilon_equal(NAN, NAN)); +} + +TEST(FOUNDATION_MATH_FLOAT, absolute_epsilon_equal_num_pos) +{ + ASSERT_TRUE(nncc::foundation::math::absolute_epsilon_equal(1.0f, 1.0f)); +} + +TEST(FOUNDATION_MATH_FLOAT, absolute_epsilon_equal_num_neg) +{ + ASSERT_FALSE(nncc::foundation::math::absolute_epsilon_equal(1.0f, 2.0f, 0.001f)); +} + +TEST(FOUNDATION_MATH_FLOAT, absolute_epsilon_equal_tolerance_pos) +{ + ASSERT_TRUE(nncc::foundation::math::absolute_epsilon_equal(1.0f, 1.0f + 0.0001f, 0.001f)); +} + +TEST(FOUNDATION_MATH_FLOAT, absolute_epsilon_equal_tolerance_neg) +{ + ASSERT_FALSE(nncc::foundation::math::absolute_epsilon_equal(1.0f, 1.0f + 0.01f, 0.001f)); +}