1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
// test file for special functions.
// (C) Copyright Hubert Holin 2003.
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <iomanip>
#include <boost/mpl/list.hpp>
#include <boost/test/unit_test.hpp>
#include <boost/test/unit_test_log.hpp>
#include <boost/math/tools/config.hpp>
#include <boost/math/tools/test.hpp>
template<typename T>
struct string_type_name;
#define DEFINE_TYPE_NAME(Type) \
template<> struct string_type_name<Type> \
{ \
static char const * _() \
{ \
return #Type; \
} \
}
#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
DEFINE_TYPE_NAME(float);
DEFINE_TYPE_NAME(double);
DEFINE_TYPE_NAME(long double);
typedef boost::mpl::list<float,double,long double> test_types;
#else
DEFINE_TYPE_NAME(float);
DEFINE_TYPE_NAME(double);
typedef boost::mpl::list<float,double> test_types;
#endif
// Apple GCC 4.0 uses the "double double" format for its long double,
// which means that epsilon is VERY small but useless for
// comparisons. So, don't do those comparisons.
#if (defined(__APPLE_CC__) && defined(__GNUC__) && __GNUC__ == 4) || defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS)
typedef boost::mpl::list<float,double> near_eps_test_types;
#else
typedef boost::mpl::list<float,double,long double> near_eps_test_types;
#endif
#include "sinc_test.hpp"
#include "sinhc_test.hpp"
#include "atanh_test.hpp"
#include "asinh_test.hpp"
#include "acosh_test.hpp"
boost::unit_test::test_suite * init_unit_test_suite(int, char *[])
{
::boost::unit_test::unit_test_log.
set_threshold_level(::boost::unit_test::log_messages);
boost::unit_test::test_suite * test =
BOOST_TEST_SUITE("special_functions_test");
BOOST_TEST_MESSAGE("Results of special functions test.");
BOOST_TEST_MESSAGE(" ");
BOOST_TEST_MESSAGE("(C) Copyright Hubert Holin 2003-2005.");
BOOST_TEST_MESSAGE("Distributed under the Boost Software License, Version 1.0.");
BOOST_TEST_MESSAGE("(See accompanying file LICENSE_1_0.txt or copy at");
BOOST_TEST_MESSAGE("http://www.boost.org/LICENSE_1_0.txt)");
BOOST_TEST_MESSAGE(" ");
#define BOOST_SPECIAL_FUNCTIONS_COMMON_GENERATOR(fct) \
test->add(BOOST_TEST_CASE_TEMPLATE(fct##_test, test_types));
#define BOOST_SPECIAL_FUNCTIONS_COMMON_GENERATOR_NEAR_EPS(fct) \
test->add(BOOST_TEST_CASE_TEMPLATE(fct##_test, near_eps_test_types));
#define BOOST_SPECIAL_FUNCTIONS_COMMON_TEST \
BOOST_SPECIAL_FUNCTIONS_COMMON_GENERATOR(atanh) \
BOOST_SPECIAL_FUNCTIONS_COMMON_GENERATOR(asinh) \
BOOST_SPECIAL_FUNCTIONS_COMMON_GENERATOR(acosh) \
BOOST_SPECIAL_FUNCTIONS_COMMON_GENERATOR(sinc_pi) \
BOOST_SPECIAL_FUNCTIONS_COMMON_GENERATOR(sinhc_pi)
#define BOOST_SPECIAL_FUNCTIONS_TEMPLATE_TEMPLATE_TEST \
BOOST_SPECIAL_FUNCTIONS_COMMON_GENERATOR_NEAR_EPS(sinc_pi_complex) \
BOOST_SPECIAL_FUNCTIONS_COMMON_GENERATOR_NEAR_EPS(sinhc_pi_complex)
#ifdef BOOST_NO_TEMPLATE_TEMPLATES
#define BOOST_SPECIAL_FUNCTIONS_TEST \
BOOST_SPECIAL_FUNCTIONS_COMMON_TEST \
BOOST_TEST_MESSAGE("Warning: no template templates; curtailed functionality.");
#else /* BOOST_NO_TEMPLATE_TEMPLATES */
#define BOOST_SPECIAL_FUNCTIONS_TEST \
BOOST_SPECIAL_FUNCTIONS_COMMON_TEST \
BOOST_SPECIAL_FUNCTIONS_TEMPLATE_TEMPLATE_TEST
#endif /* BOOST_NO_TEMPLATE_TEMPLATES */
BOOST_SPECIAL_FUNCTIONS_TEST
#undef BOOST_SPECIAL_FUNCTIONS_TEST
#undef BOOST_SPECIAL_FUNCTIONS_TEMPLATE_TEMPLATE_TEST
#undef BOOST_SPECIAL_FUNCTIONS_COMMON_TEST
#undef BOOST_SPECIAL_FUNCTIONS_COMMON_GENERATOR
#undef BOOST_SPECIAL_FUNCTIONS_COMMON_GENERATOR_NEAR_EPS
#ifdef BOOST_SPECIAL_FUNCTIONS_TEST_VERBOSE
using ::std::numeric_limits;
BOOST_TEST_MESSAGE("epsilon");
BOOST_TEST_MESSAGE( ::std::setw(15) << numeric_limits<float>::epsilon()
<< ::std::setw(15) << numeric_limits<double>::epsilon()
<< ::std::setw(15) << numeric_limits<long double>::epsilon());
BOOST_TEST_MESSAGE(" ");
test->add(BOOST_TEST_CASE(atanh_manual_check));
test->add(BOOST_TEST_CASE(asinh_manual_check));
test->add(BOOST_TEST_CASE(acosh_manual_check));
test->add(BOOST_TEST_CASE(sinc_pi_manual_check));
test->add(BOOST_TEST_CASE(sinhc_pi_manual_check));
#endif /* BOOST_SPECIAL_FUNCTIONS_TEST_VERBOSE */
return test;
}
#undef DEFINE_TYPE_NAME
|