diff --git a/headers/vmath.hpp/vmath_fun.hpp b/headers/vmath.hpp/vmath_fun.hpp index 88b9b61..65350fa 100644 --- a/headers/vmath.hpp/vmath_fun.hpp +++ b/headers/vmath.hpp/vmath_fun.hpp @@ -396,7 +396,11 @@ namespace vmath_hpp template < typename T > [[nodiscard]] std::enable_if_t, bool> constexpr approx(T x, T y, T epsilon) noexcept { - return abs(x - y) <= epsilon; + if constexpr ( std::is_unsigned_v ) { + return (x < y ? (y - x) : (x - y)) <= epsilon; + } else { + return abs(x - y) <= epsilon; + } } template < typename T > diff --git a/untests/vmath_fun_tests.cpp b/untests/vmath_fun_tests.cpp index 609e966..d020eb1 100644 --- a/untests/vmath_fun_tests.cpp +++ b/untests/vmath_fun_tests.cpp @@ -154,6 +154,13 @@ TEST_CASE("vmath/fun") { STATIC_CHECK_FALSE(approx(1, 3, 1)); STATIC_CHECK(approx(1, 3, 2)); + STATIC_CHECK(approx(1u, 1u)); + STATIC_CHECK_FALSE(approx(0u, 1u)); + STATIC_CHECK_FALSE(approx(0u, 1u, 0u)); + STATIC_CHECK(approx(0u, 1u, 1u)); + STATIC_CHECK_FALSE(approx(1u, 3u, 1u)); + STATIC_CHECK(approx(1u, 3u, 2u)); + STATIC_CHECK(approx(1.f, 1.f)); STATIC_CHECK_FALSE(approx(0.f, 1.f)); STATIC_CHECK_FALSE(approx(0.f, 1.f, 0.f));