[nncc.foundation] Add 'absolute_epsilon_equal' (#235)
author박종현/동작제어Lab(SR)/Senior Engineer/삼성전자 <jh1302.park@samsung.com>
Fri, 18 May 2018 08:23:33 +0000 (17:23 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Fri, 18 May 2018 08:23:33 +0000 (17:23 +0900)
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 <jh1302.park@samsung.com>
libs/foundation/include/nncc/foundation/math/Float.h
libs/foundation/src/math/Float.cpp
libs/foundation/src/math/Float.test.cpp

index 41626c2..5d05693 100644 (file)
@@ -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
index d51b197..8d60eab 100644 (file)
@@ -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
index 19117af..cb6a308 100644 (file)
@@ -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));
+}