$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: John Maddock (john_at_[hidden])
Date: 2005-10-19 07:49:19
> BUT I _HAVE_ been working on some of the missing math functions by a
> 'wrap' of Stephen Moshier's Cephes C library.
>
> I have posted a 'work in progress' for those interested in math
> functions, specially for comment, at
>
> http://www.hetp.u-net.com/public/unitTestFunc1.cpp
Hi, Paul, going over the TR1 review comments I've only just looked at this
(sorry), I noticed you're using:
BOOST_CHECK((std::tr1::beta(3., 4.) -
1.6666666666666666666666666666666666666667E-2) <
numeric_limits<double>::epsilon());
There are probably a couple of issues: firstly you should feed the
(found_value-expected_value) part into std::fabs, otherwise any arbitrarily
small (or negative!) result will pass the test.
Next the < comparison should be a <= since the only way that
std::fabs(found_value-expected_value) < numeric_limits<double>::epsilon()
can be true is if
found_value == expected_value
when you think about it :-)
The way I handled this in the complex number additions in the TR1 submission
was to:
Define an acceptable fudge factor as a multiple of
numeric_limits<T>::epsilon(), I'd be very surprised if all the special
functions are actually accurate to one epsilon ?
Then convert the fudge factor to a percentage (multiply by 100) and use
BOOST_CHECK_CLOSE (that way you get both expected and found values printed
out if there is an error), see libs/math/test/log1p_expm1_test.cpp for some
examples.
I haven't looked into it yet, but I believe there are some platforms where
epsilon is artificially small (for long double on MacOS X), so using
numeric_limits<T>::digits() to create your own epsilon may actually be the
way to go for testing.
HTH,
John.