// (C) Copyright John Maddock 2006. // 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) #ifdef _MSC_VER # pragma warning(disable: 4127) // conditional expression is constant. # pragma warning(disable: 4512) // assignment operator could not be generated. # pragma warning(disable: 4996) // 'std::char_traits::copy' was declared deprecated. #endif #include #include #include #include #include #include #include template void test_spots(T) { // // Basic sanity checks. // T tolerance = boost::math::tools::epsilon() * 100 * 2; // 2 eps as a percent. BOOST_CHECK_CLOSE( ::boost::math::factorial(0), static_cast(1), tolerance); BOOST_CHECK_CLOSE( ::boost::math::factorial(1), static_cast(1), tolerance); BOOST_CHECK_CLOSE( ::boost::math::factorial(10), static_cast(3628800L), tolerance); BOOST_CHECK_CLOSE( ::boost::math::unchecked_factorial(0), static_cast(1), tolerance); BOOST_CHECK_CLOSE( ::boost::math::unchecked_factorial(1), static_cast(1), tolerance); BOOST_CHECK_CLOSE( ::boost::math::unchecked_factorial(10), static_cast(3628800L), tolerance); tolerance = boost::math::tools::epsilon() * 100 * 20; // 20 eps as a percent. unsigned i = boost::math::max_factorial::value; if((boost::is_floating_point::value) && (sizeof(T) <= sizeof(double))) { // Without Lanczos support tgamma isn't accurate enough for this test: BOOST_CHECK_CLOSE( ::boost::math::unchecked_factorial(i), boost::math::tgamma(static_cast(i+1)), tolerance); } i += 10; while(boost::math::lgamma(static_cast(i+1)) < boost::math::tools::log_max_value()) { BOOST_CHECK_CLOSE( ::boost::math::factorial(i), boost::math::tgamma(static_cast(i+1)), tolerance); i += 10; } } int test_main(int, char* []) { test_spots(0.0F); test_spots(0.0); #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS test_spots(0.0L); test_spots(boost::math::concepts::real_concept(0.1)); #else std::cout << "The long double tests have been disabled on this platform " "either because the long double overloads of the usual math functions are " "not available at all, or because they are too inaccurate for these tests " "to pass." << std::cout; #endif return 0; } /* Output is: ------ Build started: Project: test_factorials, Configuration: Debug Win32 ------ Compiling... test_factorials.cpp Linking... Autorun "i:\boost-06-05-03-1300\libs\math\test\Math_test\debug\test_factorials.exe" Running 1 test case... *** No errors detected Build Time 0:05 Build log was saved at "file://i:\boost-06-05-03-1300\libs\math\test\Math_test\test_factorials\Debug\BuildLog.htm" test_factorials - 0 error(s), 0 warning(s) ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== */