// test_find_location.cpp // Copyright John Maddock 2006. // Copyright Paul A. Bristow 2007. // 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) // Basic sanity test for find_location Function. // Default domain error policy is // #define BOOST_MATH_DOMAIN_ERROR_POLICY throw_on_error #include // for normal_distribution using boost::math::normal; using boost::math::normal_distribution; #include // for cauchy_distribution using boost::math::cauchy; #include // for cauchy_distribution using boost::math::pareto; #include using boost::math::find_location; using boost::math::policies::policy; #include // for test_main #include // for BOOST_CHECK_CLOSE_FRACTION, BOOST_CHECK_EQUAL... #include using std::cout; using std::endl; using std::fixed; using std::right; using std::left; using std::showpoint; using std::showpos; using std::setw; using std::setprecision; #include using std::numeric_limits; template // Any floating-point type RealType. void test_spots(RealType) { // Parameter only provides the type, float, double... value ignored. // Basic sanity checks, test data may be to double precision only // so set tolerance to 100 eps expressed as a fraction, // or 100 eps of type double expressed as a fraction, // whichever is the larger. RealType tolerance = (std::max) (boost::math::tools::epsilon(), static_cast(std::numeric_limits::epsilon())); tolerance *= 100; cout << "Tolerance for type " << typeid(RealType).name() << " is " << setprecision(3) << tolerance << " (or " << tolerance * 100 << "%)." << endl; BOOST_CHECK_THROW( // probability outside 0 to 1. find_location >(static_cast(0.), static_cast(-1.), static_cast(0.) ), std::domain_error); } // template void test_spots(RealType) int test_main(int, char* []) { // Check for 'bad' arguments. BOOST_CHECK_THROW(find_location(0., -1., 0.), std::domain_error); // p outside 0 to 1. BOOST_CHECK_THROW(find_location(0., 2., 0.), std::domain_error); // p outside 0 to 1. BOOST_CHECK_THROW(find_location(numeric_limits::infinity(), 0.5, 0.), std::domain_error); // z not finite. BOOST_CHECK_THROW(find_location(numeric_limits::quiet_NaN(), -1., 0.), std::domain_error); // z not finite BOOST_CHECK_THROW(find_location(0., -1., numeric_limits::quiet_NaN()), std::domain_error); // scale not finite //// Check for ab-use with unsuitable distribution(s). //BOOST_CHECK_THROW(find_location(0., 0.5, 0.), std::domain_error); // double tol5eps = std::numeric_limits::epsilon() * 5; // 5 eps as a fraction. double tol100eps = std::numeric_limits::epsilon() * 100; // 100 eps as a fraction. double mean = 3.; // kg double standard_deviation = 0.1; // kg normal n(mean, standard_deviation); double z = 2.9; double p = 0.05; double l = find_location(z, p, n.scale()); BOOST_CHECK_CLOSE_FRACTION(l, 3.0644853626951472, tol100eps); //l = find_location(complement(z, 1 - p, n.scale())); BOOST_CHECK_CLOSE_FRACTION(l, 3.0644853626951472, tol100eps); ////using namespace boost::math; or //using boost::math::normal; // Basic sanity-check spot values. // (Parameter value, arbitrarily zero, only communicates the floating point type). test_spots(0.0F); // Test float. test_spots(0.0); // Test double. //test_spots(0.0L); // Test long double. //#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) // test_spots(boost::math::concepts::real_concept(0.)); // Test real concept. //#endif return 0; } // int test_main(int, char* []) /* Output is: */