special_functions_test.cpp 4.7 KB

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