#ifndef MYX_MATH_ALMOST_EQUAL_RELATIVE_AND_ABS_INL_HPP_ #define MYX_MATH_ALMOST_EQUAL_RELATIVE_AND_ABS_INL_HPP_ #pragma once #ifndef MYXLIB_HEADER_ONLY #include #endif #include namespace myx { namespace math { MYXLIB_INLINE bool almost_equal_relative_and_abs( const float a, const float b, const float maxAbsDiff, const float maxRelDiff ) { // Check if the numbers are really close -- needed // when comparing numbers near zero. float diff = fabsf( a - b ); if ( diff <= maxAbsDiff ) { return( true ); } float aN = fabsf( a ); float bN = fabsf( b ); float largest = ( bN > aN ) ? bN : aN; if ( diff <= largest * maxRelDiff ) { return( true ); } return( false ); } MYXLIB_INLINE bool almost_equal_relative_and_abs( const double a, const double b, const double maxAbsDiff, const double maxRelDiff ) { // Check if the numbers are really close -- needed // when comparing numbers near zero. double diff = fabs( a - b ); if ( diff <= maxAbsDiff ) { return( true ); } double aN = fabs( a ); double bN = fabs( b ); double largest = ( bN > aN ) ? bN : aN; if ( diff <= largest * maxRelDiff ) { return( true ); } return( false ); } } // namespace math } // namespace myx #endif // ifndef MYX_MATH_ALMOST_EQUAL_RELATIVE_AND_ABS_INL_HPP_