123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470 |
- // Copyright Paul A. Bristow 2006-7.
- // Copyright John Maddock 2006-7.
- // Use, modification and distribution are subject to 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)
- // Test error handling mechanism produces the expected error messages.
- // for example Error in function boost::math::test_function<float>(float, float, float): Domain Error evaluating function at 0
- // Define some custom dummy error handlers that do nothing but throw,
- // in order to check that they are otherwise undefined.
- // The user MUST define them before they can be used.
- //
- struct user_defined_error{};
- namespace boost{ namespace math{ namespace policies{
- #ifndef BOOST_NO_EXCEPTIONS
- template <class T>
- T user_domain_error(const char* , const char* , const T& )
- {
- throw user_defined_error();
- }
- template <class T>
- T user_pole_error(const char* , const char* , const T& )
- {
- throw user_defined_error();
- }
- template <class T>
- T user_overflow_error(const char* , const char* , const T& )
- {
- throw user_defined_error();
- }
- template <class T>
- T user_underflow_error(const char* , const char* , const T& )
- {
- throw user_defined_error();
- }
- template <class T>
- T user_denorm_error(const char* , const char* , const T& )
- {
- throw user_defined_error();
- }
- template <class T>
- T user_evaluation_error(const char* , const char* , const T& )
- {
- throw user_defined_error();
- }
- template <class T>
- T user_indeterminate_result_error(const char* , const char* , const T& )
- {
- throw user_defined_error();
- }
- #endif
- }}} // namespaces
- #include <boost/math/tools/test.hpp>
- #include <boost/math/concepts/real_concept.hpp>
- #include <boost/math/policies/policy.hpp>
- #include <boost/math/policies/error_handling.hpp>
- #include <boost/math/tools/polynomial.hpp>
- #define BOOST_TEST_MAIN
- #include <boost/test/unit_test.hpp> // for test_main
- #include <cerrno> // for errno
- #include <iostream>
- #include <iomanip>
- //
- // Define some policies:
- //
- using namespace boost::math::policies;
- policy<
- domain_error<throw_on_error>,
- pole_error<throw_on_error>,
- overflow_error<throw_on_error>,
- underflow_error<throw_on_error>,
- denorm_error<throw_on_error>,
- evaluation_error<throw_on_error>,
- indeterminate_result_error<throw_on_error> > throw_policy;
- policy<
- domain_error<errno_on_error>,
- pole_error<errno_on_error>,
- overflow_error<errno_on_error>,
- underflow_error<errno_on_error>,
- denorm_error<errno_on_error>,
- evaluation_error<errno_on_error>,
- indeterminate_result_error<errno_on_error> > errno_policy;
- policy<
- domain_error<ignore_error>,
- pole_error<ignore_error>,
- overflow_error<ignore_error>,
- underflow_error<ignore_error>,
- denorm_error<ignore_error>,
- evaluation_error<ignore_error>,
- indeterminate_result_error<ignore_error> > ignore_policy;
- policy<
- domain_error<user_error>,
- pole_error<user_error>,
- overflow_error<user_error>,
- underflow_error<user_error>,
- denorm_error<user_error>,
- evaluation_error<user_error>,
- indeterminate_result_error<user_error> > user_policy;
- policy<> default_policy;
- #define TEST_EXCEPTION(expression, exception, msg)\
- BOOST_MATH_CHECK_THROW(expression, exception);\
- try{ expression; }catch(const exception& e){ std::cout << e.what() << std::endl; BOOST_CHECK_EQUAL(std::string(e.what()), std::string(msg)); }
- template <class T>
- std::string format_message_string(const char* str)
- {
- std::string type_name = boost::math::policies::detail::name_of<T>();
- std::string result(str);
- if(type_name != "float")
- {
- std::string::size_type pos = 0;
- while((pos = result.find("float", pos)) != std::string::npos)
- {
- result.replace(pos, 5, type_name);
- pos += type_name.size();
- }
- }
- return result;
- }
- template <class T>
- void test_error(T)
- {
- const char* func = "boost::math::test_function<%1%>(%1%, %1%, %1%)";
- const char* msg1 = "Error while handling value %1%";
- const char* msg2 = "Error message goes here...";
- // Check that exception is thrown, catch and show the message, for example:
- // Error in function boost::math::test_function<float>(float, float, float): Error while handling value 0
- #ifndef BOOST_NO_EXCEPTIONS
- TEST_EXCEPTION(boost::math::policies::raise_domain_error(func, msg1, T(0.0), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error while handling value 0"));
- TEST_EXCEPTION(boost::math::policies::raise_domain_error(func, 0, T(0.0), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Domain Error evaluating function at 0"));
- TEST_EXCEPTION(boost::math::policies::raise_pole_error(func, msg1, T(0.0), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error while handling value 0"));
- TEST_EXCEPTION(boost::math::policies::raise_pole_error(func, 0, T(0.0), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Evaluation of function at pole 0"));
- TEST_EXCEPTION(boost::math::policies::raise_overflow_error<T>(func, msg2, throw_policy), std::overflow_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error message goes here..."));
- TEST_EXCEPTION(boost::math::policies::raise_overflow_error<T>(func, 0, throw_policy), std::overflow_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Overflow Error"));
- TEST_EXCEPTION(boost::math::policies::raise_underflow_error<T>(func, msg2, throw_policy), std::underflow_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error message goes here..."));
- TEST_EXCEPTION(boost::math::policies::raise_underflow_error<T>(func, 0, throw_policy), std::underflow_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Underflow Error"));
- TEST_EXCEPTION(boost::math::policies::raise_denorm_error<T>(func, msg2, T(0), throw_policy), std::underflow_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error message goes here..."));
- TEST_EXCEPTION(boost::math::policies::raise_denorm_error<T>(func, 0, T(0), throw_policy), std::underflow_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Denorm Error"));
- TEST_EXCEPTION(boost::math::policies::raise_evaluation_error(func, msg1, T(1.25), throw_policy), boost::math::evaluation_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error while handling value 1.25"));
- TEST_EXCEPTION(boost::math::policies::raise_evaluation_error(func, 0, T(1.25), throw_policy), boost::math::evaluation_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Internal Evaluation Error, best value so far was 1.25"));
- TEST_EXCEPTION(boost::math::policies::raise_indeterminate_result_error(func, msg1, T(1.25), T(12.34), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error while handling value 1.25"));
- TEST_EXCEPTION(boost::math::policies::raise_indeterminate_result_error(func, 0, T(1.25), T(12.34), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Indeterminate result with value 1.25"));
- //
- // Now try user error handlers: these should all throw user_error():
- // - because by design these are undefined and must be defined by the user ;-)
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_domain_error(func, msg1, T(0.0), user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_pole_error(func, msg1, T(0.0), user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_overflow_error<T>(func, msg2, user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_underflow_error<T>(func, msg2, user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_denorm_error<T>(func, msg2, T(0), user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_evaluation_error(func, msg1, T(0.0), user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_indeterminate_result_error(func, msg1, T(0.0), T(0.0), user_policy), user_defined_error);
- #endif
- // Test with ignore_error
- BOOST_CHECK((boost::math::isnan)(boost::math::policies::raise_domain_error(func, msg1, T(0.0), ignore_policy)) || !std::numeric_limits<T>::has_quiet_NaN);
- BOOST_CHECK((boost::math::isnan)(boost::math::policies::raise_pole_error(func, msg1, T(0.0), ignore_policy)) || !std::numeric_limits<T>::has_quiet_NaN);
- BOOST_CHECK_EQUAL(boost::math::policies::raise_overflow_error<T>(func, msg2, ignore_policy), std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : boost::math::tools::max_value<T>());
- BOOST_CHECK_EQUAL(boost::math::policies::raise_underflow_error<T>(func, msg2, ignore_policy), T(0));
- BOOST_CHECK_EQUAL(boost::math::policies::raise_denorm_error<T>(func, msg2, T(1.25), ignore_policy), T(1.25));
- BOOST_CHECK_EQUAL(boost::math::policies::raise_evaluation_error(func, msg1, T(1.25), ignore_policy), T(1.25));
- BOOST_CHECK_EQUAL(boost::math::policies::raise_indeterminate_result_error(func, 0, T(0.0), T(12.34), ignore_policy), T(12.34));
- // Test with errno_on_error
- errno = 0;
- BOOST_CHECK((boost::math::isnan)(boost::math::policies::raise_domain_error(func, msg1, T(0.0), errno_policy)) || !std::numeric_limits<T>::has_quiet_NaN);
- BOOST_CHECK(errno == EDOM);
- errno = 0;
- BOOST_CHECK((boost::math::isnan)(boost::math::policies::raise_pole_error(func, msg1, T(0.0), errno_policy)) || !std::numeric_limits<T>::has_quiet_NaN);
- BOOST_CHECK(errno == EDOM);
- errno = 0;
- BOOST_CHECK_EQUAL(boost::math::policies::raise_overflow_error<T>(func, msg2, errno_policy), std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : boost::math::tools::max_value<T>());
- BOOST_CHECK_EQUAL(errno, ERANGE);
- errno = 0;
- BOOST_CHECK_EQUAL(boost::math::policies::raise_underflow_error<T>(func, msg2, errno_policy), T(0));
- BOOST_CHECK_EQUAL(errno, ERANGE);
- errno = 0;
- BOOST_CHECK_EQUAL(boost::math::policies::raise_denorm_error<T>(func, msg2, T(1.25), errno_policy), T(1.25));
- BOOST_CHECK_EQUAL(errno, ERANGE);
- errno = 0;
- BOOST_CHECK_EQUAL(boost::math::policies::raise_evaluation_error(func, msg1, T(1.25), errno_policy), T(1.25));
- BOOST_CHECK(errno == EDOM);
- errno = 0;
- BOOST_CHECK(boost::math::policies::raise_indeterminate_result_error(func, 0, T(0.0), T(12.34), errno_policy) == T(12.34));
- BOOST_CHECK_EQUAL(errno, EDOM);
- }
- template <class T>
- void test_complex_error(T)
- {
- //
- // Error handling that can be applied to non-scalar types such as std::complex
- //
- const char* func = "boost::math::test_function<%1%>(%1%, %1%, %1%)";
- const char* msg1 = "Error while handling value %1%";
- const char* msg2 = "Error message goes here...";
- // Check that exception is thrown, catch and show the message, for example:
- // Error in function boost::math::test_function<float>(float, float, float): Error while handling value 0
- #ifndef BOOST_NO_EXCEPTIONS
- TEST_EXCEPTION(boost::math::policies::raise_domain_error(func, msg1, T(0.0), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error while handling value (0,0)"));
- TEST_EXCEPTION(boost::math::policies::raise_domain_error(func, 0, T(0.0), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Domain Error evaluating function at (0,0)"));
- TEST_EXCEPTION(boost::math::policies::raise_pole_error(func, msg1, T(0.0), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error while handling value (0,0)"));
- TEST_EXCEPTION(boost::math::policies::raise_pole_error(func, 0, T(0.0), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Evaluation of function at pole (0,0)"));
- //TEST_EXCEPTION(boost::math::policies::raise_overflow_error<T>(func, msg2, throw_policy), std::overflow_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error message goes here..."));
- //TEST_EXCEPTION(boost::math::policies::raise_overflow_error<T>(func, 0, throw_policy), std::overflow_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Overflow Error"));
- TEST_EXCEPTION(boost::math::policies::raise_underflow_error<T>(func, msg2, throw_policy), std::underflow_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error message goes here..."));
- TEST_EXCEPTION(boost::math::policies::raise_underflow_error<T>(func, 0, throw_policy), std::underflow_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Underflow Error"));
- TEST_EXCEPTION(boost::math::policies::raise_denorm_error<T>(func, msg2, T(0), throw_policy), std::underflow_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error message goes here..."));
- TEST_EXCEPTION(boost::math::policies::raise_denorm_error<T>(func, 0, T(0), throw_policy), std::underflow_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Denorm Error"));
- TEST_EXCEPTION(boost::math::policies::raise_evaluation_error(func, msg1, T(1.25), throw_policy), boost::math::evaluation_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error while handling value (1.25,0)"));
- TEST_EXCEPTION(boost::math::policies::raise_evaluation_error(func, 0, T(1.25), throw_policy), boost::math::evaluation_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Internal Evaluation Error, best value so far was (1.25,0)"));
- TEST_EXCEPTION(boost::math::policies::raise_indeterminate_result_error(func, msg1, T(1.25), T(12.34), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error while handling value (1.25,0)"));
- TEST_EXCEPTION(boost::math::policies::raise_indeterminate_result_error(func, 0, T(1.25), T(12.34), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Indeterminate result with value (1.25,0)"));
- //
- // Now try user error handlers: these should all throw user_error():
- // - because by design these are undefined and must be defined by the user ;-)
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_domain_error(func, msg1, T(0.0), user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_pole_error(func, msg1, T(0.0), user_policy), user_defined_error);
- //BOOST_MATH_CHECK_THROW(boost::math::policies::raise_overflow_error<T>(func, msg2, user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_underflow_error<T>(func, msg2, user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_denorm_error<T>(func, msg2, T(0), user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_evaluation_error(func, msg1, T(0.0), user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_indeterminate_result_error(func, msg1, T(0.0), T(0.0), user_policy), user_defined_error);
- #endif
- // Test with ignore_error
- BOOST_CHECK((boost::math::isnan)(boost::math::policies::raise_domain_error(func, msg1, T(0.0), ignore_policy)) || !std::numeric_limits<T>::has_quiet_NaN);
- BOOST_CHECK((boost::math::isnan)(boost::math::policies::raise_pole_error(func, msg1, T(0.0), ignore_policy)) || !std::numeric_limits<T>::has_quiet_NaN);
- //BOOST_CHECK_EQUAL(boost::math::policies::raise_overflow_error<T>(func, msg2, ignore_policy), std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : boost::math::tools::max_value<T>());
- BOOST_CHECK_EQUAL(boost::math::policies::raise_underflow_error<T>(func, msg2, ignore_policy), T(0));
- BOOST_CHECK_EQUAL(boost::math::policies::raise_denorm_error<T>(func, msg2, T(1.25), ignore_policy), T(1.25));
- BOOST_CHECK_EQUAL(boost::math::policies::raise_evaluation_error(func, msg1, T(1.25), ignore_policy), T(1.25));
- BOOST_CHECK_EQUAL(boost::math::policies::raise_indeterminate_result_error(func, 0, T(0.0), T(12.34), ignore_policy), T(12.34));
- // Test with errno_on_error
- errno = 0;
- BOOST_CHECK((boost::math::isnan)(boost::math::policies::raise_domain_error(func, msg1, T(0.0), errno_policy)) || !std::numeric_limits<T>::has_quiet_NaN);
- BOOST_CHECK(errno == EDOM);
- errno = 0;
- BOOST_CHECK((boost::math::isnan)(boost::math::policies::raise_pole_error(func, msg1, T(0.0), errno_policy)) || !std::numeric_limits<T>::has_quiet_NaN);
- BOOST_CHECK(errno == EDOM);
- errno = 0;
- //BOOST_CHECK_EQUAL(boost::math::policies::raise_overflow_error<T>(func, msg2, errno_policy), std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : boost::math::tools::max_value<T>());
- //BOOST_CHECK_EQUAL(errno, ERANGE);
- errno = 0;
- BOOST_CHECK_EQUAL(boost::math::policies::raise_underflow_error<T>(func, msg2, errno_policy), T(0));
- BOOST_CHECK_EQUAL(errno, ERANGE);
- errno = 0;
- BOOST_CHECK_EQUAL(boost::math::policies::raise_denorm_error<T>(func, msg2, T(1.25), errno_policy), T(1.25));
- BOOST_CHECK_EQUAL(errno, ERANGE);
- errno = 0;
- BOOST_CHECK_EQUAL(boost::math::policies::raise_evaluation_error(func, msg1, T(1.25), errno_policy), T(1.25));
- BOOST_CHECK(errno == EDOM);
- errno = 0;
- BOOST_CHECK(boost::math::policies::raise_indeterminate_result_error(func, 0, T(0.0), T(12.34), errno_policy) == T(12.34));
- BOOST_CHECK_EQUAL(errno, EDOM);
- }
- template <class T>
- void test_polynomial_error(T)
- {
- //
- // Error handling that can be applied to non-scalar types such as std::complex
- //
- const char* func = "boost::math::test_function<%1%>(%1%, %1%, %1%)";
- const char* msg1 = "Error while handling value %1%";
- static const typename T::value_type data[] = { 1, 2, 3 };
- static const T val(data, 2);
- // Check that exception is thrown, catch and show the message, for example:
- // Error in function boost::math::test_function<float>(float, float, float): Error while handling value 0
- #ifndef BOOST_NO_EXCEPTIONS
- TEST_EXCEPTION(boost::math::policies::raise_domain_error(func, msg1, val, throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error while handling value { 1, 2, 3 }"));
- TEST_EXCEPTION(boost::math::policies::raise_domain_error(func, 0, val, throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Domain Error evaluating function at { 1, 2, 3 }"));
- TEST_EXCEPTION(boost::math::policies::raise_pole_error(func, msg1, val, throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error while handling value { 1, 2, 3 }"));
- TEST_EXCEPTION(boost::math::policies::raise_pole_error(func, 0, val, throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Evaluation of function at pole { 1, 2, 3 }"));
- TEST_EXCEPTION(boost::math::policies::raise_evaluation_error(func, msg1, val, throw_policy), boost::math::evaluation_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error while handling value { 1, 2, 3 }"));
- TEST_EXCEPTION(boost::math::policies::raise_evaluation_error(func, 0, val, throw_policy), boost::math::evaluation_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Internal Evaluation Error, best value so far was { 1, 2, 3 }"));
- TEST_EXCEPTION(boost::math::policies::raise_indeterminate_result_error(func, msg1, val, T(12.34), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Error while handling value { 1, 2, 3 }"));
- TEST_EXCEPTION(boost::math::policies::raise_indeterminate_result_error(func, 0, val, T(12.34), throw_policy), std::domain_error, format_message_string<T>("Error in function boost::math::test_function<float>(float, float, float): Indeterminate result with value { 1, 2, 3 }"));
- //
- // Now try user error handlers: these should all throw user_error():
- // - because by design these are undefined and must be defined by the user ;-)
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_domain_error(func, msg1, T(0.0), user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_pole_error(func, msg1, T(0.0), user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_evaluation_error(func, msg1, T(0.0), user_policy), user_defined_error);
- BOOST_MATH_CHECK_THROW(boost::math::policies::raise_indeterminate_result_error(func, msg1, T(0.0), T(0.0), user_policy), user_defined_error);
- #endif
- // Test with ignore_error
- BOOST_CHECK((boost::math::isnan)(boost::math::policies::raise_domain_error(func, msg1, T(0.0), ignore_policy)) || !std::numeric_limits<T>::has_quiet_NaN);
- BOOST_CHECK((boost::math::isnan)(boost::math::policies::raise_pole_error(func, msg1, T(0.0), ignore_policy)) || !std::numeric_limits<T>::has_quiet_NaN);
- BOOST_CHECK_EQUAL(boost::math::policies::raise_evaluation_error(func, msg1, T(1.25), ignore_policy), T(1.25));
- BOOST_CHECK_EQUAL(boost::math::policies::raise_indeterminate_result_error(func, 0, T(0.0), T(12.34), ignore_policy), T(12.34));
- // Test with errno_on_error
- errno = 0;
- BOOST_CHECK((boost::math::isnan)(boost::math::policies::raise_domain_error(func, msg1, T(0.0), errno_policy)) || !std::numeric_limits<T>::has_quiet_NaN);
- BOOST_CHECK(errno == EDOM);
- errno = 0;
- BOOST_CHECK((boost::math::isnan)(boost::math::policies::raise_pole_error(func, msg1, T(0.0), errno_policy)) || !std::numeric_limits<T>::has_quiet_NaN);
- BOOST_CHECK(errno == EDOM);
- errno = 0;
- BOOST_CHECK_EQUAL(boost::math::policies::raise_evaluation_error(func, msg1, T(1.25), errno_policy), T(1.25));
- BOOST_CHECK(errno == EDOM);
- errno = 0;
- BOOST_CHECK(boost::math::policies::raise_indeterminate_result_error(func, 0, T(0.0), T(12.34), errno_policy) == T(12.34));
- BOOST_CHECK_EQUAL(errno, EDOM);
- }
- BOOST_AUTO_TEST_CASE( test_main )
- {
- // Test error handling.
- // (Parameter value, arbitrarily zero, only communicates the floating point type FPT).
- test_error(0.0F); // Test float.
- test_error(0.0); // Test double.
- test_error(0.0L); // Test long double.
- test_error(boost::math::concepts::real_concept(0.0L)); // Test concepts.
- // try complex numbers too:
- test_complex_error(std::complex<float>(0));
- test_complex_error(std::complex<double>(0));
- test_complex_error(std::complex<long double>(0));
- test_polynomial_error(boost::math::tools::polynomial<float>());
- } // BOOST_AUTO_TEST_CASE( test_main )
- /*
- Autorun "i:\boost-06-05-03-1300\libs\math\test\Math_test\debug\test_error_handling.exe"
- Running 1 test case...
- Error in function boost::math::test_function<float>(float, float, float): Error while handling value 0
- Error in function boost::math::test_function<float>(float, float, float): Domain Error evaluating function at 0
- Error in function boost::math::test_function<float>(float, float, float): Error while handling value 0
- Error in function boost::math::test_function<float>(float, float, float): Evaluation of function at pole 0
- Error in function boost::math::test_function<float>(float, float, float): Error message goes here...
- Error in function boost::math::test_function<float>(float, float, float): Overflow Error
- Error in function boost::math::test_function<float>(float, float, float): Error message goes here...
- Error in function boost::math::test_function<float>(float, float, float): Underflow Error
- Error in function boost::math::test_function<float>(float, float, float): Error message goes here...
- Error in function boost::math::test_function<float>(float, float, float): Denorm Error
- Error in function boost::math::test_function<float>(float, float, float): Error while handling value 1.25
- Error in function boost::math::test_function<float>(float, float, float): Internal Evaluation Error, best value so far was 1.25
- Error in function boost::math::test_function<double>(double, double, double): Error while handling value 0
- Error in function boost::math::test_function<double>(double, double, double): Domain Error evaluating function at 0
- Error in function boost::math::test_function<double>(double, double, double): Error while handling value 0
- Error in function boost::math::test_function<double>(double, double, double): Evaluation of function at pole 0
- Error in function boost::math::test_function<double>(double, double, double): Error message goes here...
- Error in function boost::math::test_function<double>(double, double, double): Overflow Error
- Error in function boost::math::test_function<double>(double, double, double): Error message goes here...
- Error in function boost::math::test_function<double>(double, double, double): Underflow Error
- Error in function boost::math::test_function<double>(double, double, double): Error message goes here...
- Error in function boost::math::test_function<double>(double, double, double): Denorm Error
- Error in function boost::math::test_function<double>(double, double, double): Error while handling value 1.25
- Error in function boost::math::test_function<double>(double, double, double): Internal Evaluation Error, best value so far was 1.25
- Error in function boost::math::test_function<long double>(long double, long double, long double): Error while handling value 0
- Error in function boost::math::test_function<long double>(long double, long double, long double): Domain Error evaluating function at 0
- Error in function boost::math::test_function<long double>(long double, long double, long double): Error while handling value 0
- Error in function boost::math::test_function<long double>(long double, long double, long double): Evaluation of function at pole 0
- Error in function boost::math::test_function<long double>(long double, long double, long double): Error message goes here...
- Error in function boost::math::test_function<long double>(long double, long double, long double): Overflow Error
- Error in function boost::math::test_function<long double>(long double, long double, long double): Error message goes here...
- Error in function boost::math::test_function<long double>(long double, long double, long double): Underflow Error
- Error in function boost::math::test_function<long double>(long double, long double, long double): Error message goes here...
- Error in function boost::math::test_function<long double>(long double, long double, long double): Denorm Error
- Error in function boost::math::test_function<long double>(long double, long double, long double): Error while handling value 1.25
- Error in function boost::math::test_function<long double>(long double, long double, long double): Internal Evaluation Error, best value so far was 1.25
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Error while handling value 0
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Domain Error evaluating function at 0
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Error while handling value 0
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Evaluation of function at pole 0
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Error message goes here...
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Overflow Error
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Error message goes here...
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Underflow Error
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Error message goes here...
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Denorm Error
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Error while handling value 1.25
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Internal Evaluation Error, best value so far was 1.25
- *** No errors detected
- VS 2010
- ------ Rebuild All started: Project: test_error_handling, Configuration: Release Win32 ------
- test_error_handling.cpp
- Generating code
- Finished generating code
- test_error_handling.vcxproj -> J:\Cpp\MathToolkit\test\Math_test\Release\test_error_handling.exe
- Running 1 test case...
- Error in function boost::math::test_function<float>(float, float, float): Error while handling value 0
- Error in function boost::math::test_function<float>(float, float, float): Domain Error evaluating function at 0
- Error in function boost::math::test_function<float>(float, float, float): Error while handling value 0
- Error in function boost::math::test_function<float>(float, float, float): Evaluation of function at pole 0
- Error in function boost::math::test_function<float>(float, float, float): Error message goes here...
- Error in function boost::math::test_function<float>(float, float, float): Overflow Error
- Error in function boost::math::test_function<float>(float, float, float): Error message goes here...
- Error in function boost::math::test_function<float>(float, float, float): Underflow Error
- Error in function boost::math::test_function<float>(float, float, float): Error message goes here...
- Error in function boost::math::test_function<float>(float, float, float): Denorm Error
- Error in function boost::math::test_function<float>(float, float, float): Error while handling value 1.25
- Error in function boost::math::test_function<float>(float, float, float): Internal Evaluation Error, best value so far was 1.25
- Error in function boost::math::test_function<float>(float, float, float): Error while handling value 1.25
- Error in function boost::math::test_function<float>(float, float, float): Indeterminate result with value 1.25
- Error in function boost::math::test_function<double>(double, double, double): Error while handling value 0
- Error in function boost::math::test_function<double>(double, double, double): Domain Error evaluating function at 0
- Error in function boost::math::test_function<double>(double, double, double): Error while handling value 0
- Error in function boost::math::test_function<double>(double, double, double): Evaluation of function at pole 0
- Error in function boost::math::test_function<double>(double, double, double): Error message goes here...
- Error in function boost::math::test_function<double>(double, double, double): Overflow Error
- Error in function boost::math::test_function<double>(double, double, double): Error message goes here...
- Error in function boost::math::test_function<double>(double, double, double): Underflow Error
- Error in function boost::math::test_function<double>(double, double, double): Error message goes here...
- Error in function boost::math::test_function<double>(double, double, double): Denorm Error
- Error in function boost::math::test_function<double>(double, double, double): Error while handling value 1.25
- Error in function boost::math::test_function<double>(double, double, double): Internal Evaluation Error, best value so far was 1.25
- Error in function boost::math::test_function<double>(double, double, double): Error while handling value 1.25
- Error in function boost::math::test_function<double>(double, double, double): Indeterminate result with value 1.25
- Error in function boost::math::test_function<long double>(long double, long double, long double): Error while handling value 0
- Error in function boost::math::test_function<long double>(long double, long double, long double): Domain Error evaluating function at 0
- Error in function boost::math::test_function<long double>(long double, long double, long double): Error while handling value 0
- Error in function boost::math::test_function<long double>(long double, long double, long double): Evaluation of function at pole 0
- Error in function boost::math::test_function<long double>(long double, long double, long double): Error message goes here...
- Error in function boost::math::test_function<long double>(long double, long double, long double): Overflow Error
- Error in function boost::math::test_function<long double>(long double, long double, long double): Error message goes here...
- Error in function boost::math::test_function<long double>(long double, long double, long double): Underflow Error
- Error in function boost::math::test_function<long double>(long double, long double, long double): Error message goes here...
- Error in function boost::math::test_function<long double>(long double, long double, long double): Denorm Error
- Error in function boost::math::test_function<long double>(long double, long double, long double): Error while handling value 1.25
- Error in function boost::math::test_function<long double>(long double, long double, long double): Internal Evaluation Error, best value so far was 1.25
- Error in function boost::math::test_function<long double>(long double, long double, long double): Error while handling value 1.25
- Error in function boost::math::test_function<long double>(long double, long double, long double): Indeterminate result with value 1.25
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Error while handling value 0
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Domain Error evaluating function at 0
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Error while handling value 0
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Evaluation of function at pole 0
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Error message goes here...
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Overflow Error
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Error message goes here...
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Underflow Error
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Error message goes here...
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Denorm Error
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Error while handling value 1.25
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Internal Evaluation Error, best value so far was 1.25
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Error while handling value 1.25
-
- *** No errors detected
- Error in function boost::math::test_function<class boost::math::concepts::real_concept>(class boost::math::concepts::real_concept, class boost::math::concepts::real_concept, class boost::math::concepts::real_concept): Indeterminate result with value 1.25
- ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
- */
|