Program Listing for File math.hpp
↰ Return to documentation for file (rcppsw/math/math.hpp)
#pragma once
/*******************************************************************************
 * Includes
 ******************************************************************************/
#include <cmath>
#include <utility>
#include "rcppsw/rcppsw.hpp"
/*******************************************************************************
 * Namespaces/Decls
 ******************************************************************************/
namespace rcppsw::math {
/*******************************************************************************
 * Constant Definitions
 ******************************************************************************/
static constexpr double kDOUBLE_EPSILON = RCSW_DOUBLE_EPSILON;
/*******************************************************************************
 * Free-Functions
 ******************************************************************************/
static inline bool is_equal(double lhs,
                            double rhs,
                            double tol = kDOUBLE_EPSILON) {
  return std::fabs(lhs - rhs) < tol;
}
static inline bool is_multiple_of(double x,
                                  double y,
                                  double tol = kDOUBLE_EPSILON) {
  return std::fabs(std::remainder(x, y)) < tol;
}
namespace detail {
template <class T>
using length_func_decltype = decltype(std::declval<T>().length());
} /* namespace detail */
template<typename T,
         RCPPSW_SFINAE_DECLDEF(rmpl::is_detected<detail::length_func_decltype, T>::value)>
static inline double l2norm(const T& lhs, const T& rhs) {
  return (lhs - rhs).length();
}
template<typename T,
         RCPPSW_SFINAE_DECLDEF(rmpl::is_detected<detail::length_func_decltype, T>::value)>
static inline double l2norm_squared(const T& lhs, const T& rhs) {
  return (lhs - rhs).squared_length();
}
} /* namespace rcppsw::math */