#include "vector2.h" #include #include #include #include constexpr float abs_(float x) noexcept { return (x >= 0) ? x : -x; } constexpr bool fuzzy_equal(float a, float b) noexcept { auto max = std::max(abs_(a), abs_(b)); auto min = std::min(abs_(a), abs_(b)); if (min == 0) { return abs_(max) < 1e-12f; } return ((max / min) - 1) < 1e-12f; } static_assert(fuzzy_equal(1.f, 1.f)); static_assert(!fuzzy_equal(1.f, 1.1f)); static_assert(!fuzzy_equal(0.f, 1.f)); static_assert(!fuzzy_equal(1.f, 0.f)); static_assert(fuzzy_equal(0.1f + 0.2f, 0.3f)); int vector2_main(int, char**) { Vector2 vec; auto print = [](const auto& v) { std::cout << "{x: " << v.x << ", y: " << v.y << ", len: " << std::setprecision(14) << v.len << ", dir: " << std::setprecision(14) << v.dir << "}\n"; }; print(vec); vec.x = 1; print(vec); assert(fuzzy_equal(vec.dir, 0)); vec.y += 1; print(vec); assert(fuzzy_equal(vec.len, std::sqrt(2))); vec.len *= 4; print(vec); assert(fuzzy_equal(vec.x, vec.y)); vec.x = vec.x + 1; print(vec); ++vec.y; print(vec); assert(fuzzy_equal(vec.x, vec.y)); return 0; }