// unit test file sinhc.hpp for the special functions test suite // (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 #include #include #include #include #include #define BOOST_TEST_MAIN #include #include BOOST_TEST_CASE_TEMPLATE_FUNCTION(sinhc_pi_test, T) { using ::std::abs; using ::std::numeric_limits; using ::boost::math::sinhc_pi; BOOST_TEST_MESSAGE("Testing sinhc_pi in the real domain for " << string_type_name::_() << "."); BOOST_CHECK_PREDICATE(::std::less_equal(), (abs(sinhc_pi(static_cast(0))-static_cast(1))) (numeric_limits::epsilon())); using mp_t = boost::multiprecision::cpp_bin_float_50; T val = 2; T tolerance = boost::math::tools::epsilon() * 100; for (unsigned i = 0; i < 1000; ++i) { val /= 3; if (val < boost::math::tools::min_value()) break; T r1 = sinhc_pi(val); T r2 = static_cast(sinh(mp_t(val)) / mp_t(val)); BOOST_CHECK_CLOSE_FRACTION(r1, r2, tolerance); } } BOOST_TEST_CASE_TEMPLATE_FUNCTION(sinhc_pi_complex_test, T) { using ::std::abs; using ::std::sin; using ::std::numeric_limits; using ::boost::math::sinhc_pi; BOOST_TEST_MESSAGE("Testing sinhc_pi in the complex domain for " << string_type_name::_() << "."); BOOST_CHECK_PREDICATE(::std::less_equal(), (abs(sinhc_pi(::std::complex(0, 1))- ::std::complex(sin(static_cast(1))))) (numeric_limits::epsilon())); using mp_t = boost::multiprecision::cpp_complex_50; std::complex val(2, 2.5); for (unsigned i = 0; i < 50; ++i) { val /= 3; if (val.real() < boost::math::tools::min_value()) break; std::complex r1 = sinhc_pi(val); std::complex r2 = static_cast>(sinh(mp_t(val)) / mp_t(val)); BOOST_CHECK_LE(std::abs(r1.real() - r2.real()), boost::math::tools::epsilon()); BOOST_CHECK_LE(std::abs(r1.imag() - r2.imag()), boost::math::tools::epsilon()); } } void sinhc_pi_manual_check() { using ::boost::math::sinhc_pi; BOOST_TEST_MESSAGE(" "); BOOST_TEST_MESSAGE("sinc_pi"); for (int i = 0; i <= 100; i++) { #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS BOOST_TEST_MESSAGE( ::std::setw(15) << sinhc_pi(static_cast(i-50)/ static_cast(50)) << ::std::setw(15) << sinhc_pi(static_cast(i-50)/ static_cast(50)) << ::std::setw(15) << sinhc_pi(static_cast(i-50)/ static_cast(50))); #else BOOST_TEST_MESSAGE( ::std::setw(15) << sinhc_pi(static_cast(i-50)/ static_cast(50)) << ::std::setw(15) << sinhc_pi(static_cast(i-50)/ static_cast(50))); #endif } BOOST_TEST_MESSAGE(" "); }