mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-04 05:09:53 +01:00
Added an optional absolute margin to the approximation checks
This commit is contained in:
parent
92356769f1
commit
2585d280d1
@ -20,12 +20,14 @@ namespace Detail {
|
|||||||
public:
|
public:
|
||||||
explicit Approx ( double value )
|
explicit Approx ( double value )
|
||||||
: m_epsilon( std::numeric_limits<float>::epsilon()*100 ),
|
: m_epsilon( std::numeric_limits<float>::epsilon()*100 ),
|
||||||
|
m_margin( 0.0 ),
|
||||||
m_scale( 1.0 ),
|
m_scale( 1.0 ),
|
||||||
m_value( value )
|
m_value( value )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Approx( Approx const& other )
|
Approx( Approx const& other )
|
||||||
: m_epsilon( other.m_epsilon ),
|
: m_epsilon( other.m_epsilon ),
|
||||||
|
m_margin( other.m_margin ),
|
||||||
m_scale( other.m_scale ),
|
m_scale( other.m_scale ),
|
||||||
m_value( other.m_value )
|
m_value( other.m_value )
|
||||||
{}
|
{}
|
||||||
@ -37,13 +39,19 @@ namespace Detail {
|
|||||||
Approx operator()( double value ) {
|
Approx operator()( double value ) {
|
||||||
Approx approx( value );
|
Approx approx( value );
|
||||||
approx.epsilon( m_epsilon );
|
approx.epsilon( m_epsilon );
|
||||||
|
approx.margin( m_margin );
|
||||||
approx.scale( m_scale );
|
approx.scale( m_scale );
|
||||||
return approx;
|
return approx;
|
||||||
}
|
}
|
||||||
|
|
||||||
friend bool operator == ( double lhs, Approx const& rhs ) {
|
friend bool operator == ( double lhs, Approx const& rhs ) {
|
||||||
// Thanks to Richard Harris for his help refining this formula
|
// Thanks to Richard Harris for his help refining this formula
|
||||||
return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) );
|
auto relativeOK = fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) );
|
||||||
|
if ( relativeOK ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
auto absoluteOK = fabs( lhs - rhs.m_value ) < rhs.m_margin;
|
||||||
|
return absoluteOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
friend bool operator == ( Approx const& lhs, double rhs ) {
|
friend bool operator == ( Approx const& lhs, double rhs ) {
|
||||||
@ -63,6 +71,11 @@ namespace Detail {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Approx& margin( double newMargin ) {
|
||||||
|
m_margin = newMargin;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
Approx& scale( double newScale ) {
|
Approx& scale( double newScale ) {
|
||||||
m_scale = newScale;
|
m_scale = newScale;
|
||||||
return *this;
|
return *this;
|
||||||
@ -76,6 +89,7 @@ namespace Detail {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
double m_epsilon;
|
double m_epsilon;
|
||||||
|
double m_margin;
|
||||||
double m_scale;
|
double m_scale;
|
||||||
double m_value;
|
double m_value;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user