#include "../vector_relational.hpp" #include "../common.hpp" #include "../detail/qualifier.hpp" #include "../detail/type_float.hpp" namespace glm { template GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y, T Epsilon) { return equal(x, y, vec(Epsilon)); } template GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y, vec const& Epsilon) { return lessThanEqual(abs(x - y), Epsilon); } template GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, T Epsilon) { return notEqual(x, y, vec(Epsilon)); } template GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, vec const& Epsilon) { return greaterThan(abs(x - y), Epsilon); } template GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y, int MaxULPs) { return equal(x, y, vec(MaxULPs)); } template GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y, vec const& MaxULPs) { vec Result(false); for(length_t i = 0; i < L; ++i) { detail::float_t const a(x[i]); detail::float_t const b(y[i]); // Different signs means they do not match. if(a.negative() != b.negative()) { // Check for equality to make sure +0==-0 Result[i] = a.mantissa() == b.mantissa() && a.exponent() == b.exponent(); } else { // Find the difference in ULPs. typename detail::float_t::int_type const DiffULPs = abs(a.i - b.i); Result[i] = DiffULPs <= MaxULPs[i]; } } return Result; } template GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, int MaxULPs) { return notEqual(x, y, vec(MaxULPs)); } template GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, vec const& MaxULPs) { return not_(equal(x, y, MaxULPs)); } }//namespace glm