66 lines
1.4 KiB
C++
66 lines
1.4 KiB
C++
#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 <myx/math/almost_equal_relative_and_abs.hpp>
|
|
#endif
|
|
|
|
#include <cmath>
|
|
|
|
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_
|