{
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
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
{
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));
+}