qgis.h: proposes a generic templated method from qgsDoubleNear and qgsNumberNear

This commit is contained in:
Loïc Bartoletti 2023-12-14 19:55:36 +01:00
parent 7a1937536a
commit b5c5029e93
3 changed files with 26 additions and 14 deletions

View File

@ -2555,6 +2555,7 @@ Compare two doubles, treating nan values as equal
.. versionadded:: 3.20
%End
bool qgsDoubleNear( double a, double b, double epsilon = 4 * DBL_EPSILON );
%Docstring
Compare two doubles (but allow some difference)

View File

@ -2555,6 +2555,7 @@ Compare two doubles, treating nan values as equal
.. versionadded:: 3.20
%End
bool qgsDoubleNear( double a, double b, double epsilon = 4 * DBL_EPSILON );
%Docstring
Compare two doubles (but allow some difference)

View File

@ -4419,6 +4419,28 @@ inline bool qgsNanCompatibleEquals( double a, double b )
return a == b;
}
#ifndef SIP_RUN
/**
* Compare two numbers of type T (but allow some difference)
* \param a first number
* \param b second number
* \param epsilon maximum difference allowable between numbers
* \since 3.36
*/
template<typename T>
inline bool qgsNumberNear( T a, T b, T epsilon = std::numeric_limits<T>::epsilon() * 4 )
{
const bool aIsNan = std::isnan( a );
const bool bIsNan = std::isnan( b );
if ( aIsNan || bIsNan )
return aIsNan && bIsNan;
const T diff = a - b;
return diff >= -epsilon && diff <= epsilon;
}
#endif
/**
* Compare two doubles (but allow some difference)
* \param a first double
@ -4427,13 +4449,7 @@ inline bool qgsNanCompatibleEquals( double a, double b )
*/
inline bool qgsDoubleNear( double a, double b, double epsilon = 4 * std::numeric_limits<double>::epsilon() )
{
const bool aIsNan = std::isnan( a );
const bool bIsNan = std::isnan( b );
if ( aIsNan || bIsNan )
return aIsNan && bIsNan;
const double diff = a - b;
return diff >= -epsilon && diff <= epsilon;
return qgsNumberNear<double>( a, b, epsilon );
}
/**
@ -4444,13 +4460,7 @@ inline bool qgsDoubleNear( double a, double b, double epsilon = 4 * std::numeric
*/
inline bool qgsFloatNear( float a, float b, float epsilon = 4 * FLT_EPSILON )
{
const bool aIsNan = std::isnan( a );
const bool bIsNan = std::isnan( b );
if ( aIsNan || bIsNan )
return aIsNan && bIsNan;
const float diff = a - b;
return diff >= -epsilon && diff <= epsilon;
return qgsNumberNear<float>( a, b, epsilon );
}
//! Compare two doubles using specified number of significant digits