| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include "catch_approx.h" |
| | #include "catch_enforce.h" |
| |
|
| | #include <cmath> |
| | #include <limits> |
| |
|
| | namespace { |
| |
|
| | |
| | |
| | bool marginComparison(double lhs, double rhs, double margin) { |
| | return (lhs + margin >= rhs) && (rhs + margin >= lhs); |
| | } |
| |
|
| | } |
| |
|
| | namespace Catch { |
| | namespace Detail { |
| |
|
| | Approx::Approx ( double value ) |
| | : m_epsilon( std::numeric_limits<float>::epsilon()*100 ), |
| | m_margin( 0.0 ), |
| | m_scale( 0.0 ), |
| | m_value( value ) |
| | {} |
| |
|
| | Approx Approx::custom() { |
| | return Approx( 0 ); |
| | } |
| |
|
| | Approx Approx::operator-() const { |
| | auto temp(*this); |
| | temp.m_value = -temp.m_value; |
| | return temp; |
| | } |
| |
|
| |
|
| | std::string Approx::toString() const { |
| | ReusableStringStream rss; |
| | rss << "Approx( " << ::Catch::Detail::stringify( m_value ) << " )"; |
| | return rss.str(); |
| | } |
| |
|
| | bool Approx::equalityComparisonImpl(const double other) const { |
| | |
| | |
| | return marginComparison(m_value, other, m_margin) |
| | || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(std::isinf(m_value)? 0 : m_value))); |
| | } |
| |
|
| | void Approx::setMargin(double newMargin) { |
| | CATCH_ENFORCE(newMargin >= 0, |
| | "Invalid Approx::margin: " << newMargin << '.' |
| | << " Approx::Margin has to be non-negative."); |
| | m_margin = newMargin; |
| | } |
| |
|
| | void Approx::setEpsilon(double newEpsilon) { |
| | CATCH_ENFORCE(newEpsilon >= 0 && newEpsilon <= 1.0, |
| | "Invalid Approx::epsilon: " << newEpsilon << '.' |
| | << " Approx::epsilon has to be in [0, 1]"); |
| | m_epsilon = newEpsilon; |
| | } |
| |
|
| | } |
| |
|
| | namespace literals { |
| | Detail::Approx operator "" _a(long double val) { |
| | return Detail::Approx(val); |
| | } |
| | Detail::Approx operator "" _a(unsigned long long val) { |
| | return Detail::Approx(val); |
| | } |
| | } |
| |
|
| | std::string StringMaker<Catch::Detail::Approx>::convert(Catch::Detail::Approx const& value) { |
| | return value.toString(); |
| | } |
| |
|
| | } |
| |
|