Boost logo

Boost :

From: Fernando Cacciola (fernando_cacciola_at_[hidden])
Date: 2003-07-07 15:54:50


Beman Dawes <bdawes_at_[hidden]> wrote in message
news:4.3.2.7.2.20030707155354.01d30998_at_mailhost.esva.net...
> At 02:22 PM 7/7/2003, Rozental, Gennadiy wrote:
>
> >I could probably prohibit usage of CHECK_CLOSE with number of rounding
> >errors provided.
> >Is there any other general recommendations how to choose the tolerance
to
>
> >FP computation correctness checking?
>
> There has been some recent discussion on comp.lang.c++.moderated, subject
> "equality of two doubles". The last post was from Andrei Alexandrescu:
>
> >What's most of the time needed is relative precision.
> >
> >So, numerical gurus: how can one express "a equals b within 0.1%" over
> >the whole range of floating point numbers? If that can be done, it would
> >be a nice useful routine.
> >
> >bool approximately_equal(double lhs, double rhs, double relative_prec)
> >{
> > // fill in here please :o)
> >}
>
> But it really doesn't seem that a test library is the right home for such
> functions. I think all the fp stuff should be removed from Boost.Test, and
> passed on as a challenge to the numerics experts.
>
> After all, the user can always write:
>
> BOOST_CHECK( approximately_equal(...) );
>
> --Beman
>
A half-way solution is to have something like:

BOOST_CHECK_EQUAL_NUMBERS(x,y,IsEqual)

and let users specify their own Preciates.

By default, the Test library could provide
a straight-forward ABSOLUTE-ERROR comparator:

template<class N>
struct IsNearlyEqual
{
  IsNearlyEqual ( N a_tol = N(1e-6) ) : m_tol(a_tol) {}

  bool operator() ( N x, N y ) const
    {
      return x >= y ? ( x - y ) <= m_tol
                    : ( y - x ) <= m_tol ;
    }

  N m_tol ;
} ;

Which would be used as follows:

double n = ..., m = ... ;
BOOST_CHECK_EQUAL_NUMBERS(n,m,IsNearlyEqual<double>());

Fernando Cacciola


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk