compare.hpp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #pragma once
  2. #include <algorithm>
  3. #include <cmath>
  4. namespace math {
  5. template <typename T> T safe_div(T num, T denom) {
  6. return (num == denom && denom == 0) ? 0 : num / denom;
  7. }
  8. template <typename T> bool between_exclusive(T val, T min, T max) {
  9. return val >= min && val < max;
  10. }
  11. template <typename T> bool between(T val, T min, T max) {
  12. return val >= min && val <= max;
  13. }
  14. template <typename T> bool approx_equal(T lhs, T rhs, T eps) {
  15. T const a = std::abs(lhs);
  16. T const b = std::abs(rhs);
  17. return std::abs(lhs - rhs) <= (std::max(a, b) * eps);
  18. }
  19. template <typename T> bool essentially_equal(T lhs, T rhs, T eps) {
  20. T const a = std::abs(lhs);
  21. T const b = std::abs(rhs);
  22. return std::abs(lhs - rhs) <= (std::min(a, b) * eps);
  23. }
  24. template <typename T> bool definitely_greater(T lhs, T rhs, T eps) {
  25. T const a = std::abs(lhs);
  26. T const b = std::abs(rhs);
  27. return (lhs - rhs) > (std::max(a, b) * eps);
  28. }
  29. template <typename T> bool definitely_less(T lhs, T rhs, T eps) {
  30. T const a = std::abs(lhs);
  31. T const b = std::abs(rhs);
  32. return (rhs - lhs) > (std::max(a, b) * eps);
  33. }
  34. }