mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Added an optional absolute margin to the approximation checks
This commit is contained in:
		| @@ -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; | ||||||
|     }; |     }; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 cnugteren
					cnugteren