/* multiprecision_float_test.cpp * * Copyright John Maddock 2015 * 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) * * $Id$ * * Tests all floating point related generators and distributions with multiprecision types. */ #define BOOST_TEST_MAIN #include #include #include #include #include #include #include #include typedef boost::multiprecision::number big_float; typedef boost::random::subtract_with_carry_01_engine ranlux_big_base_01; typedef boost::random::independent_bits_engine large_int_generator; typedef boost::mpl::list < boost::random::lagged_fibonacci_01_engine, boost::random::discard_block_engine< ranlux_big_base_01, 389, 24 > > engines; BOOST_AUTO_TEST_CASE_TEMPLATE(generator_test, engine_type, engines) { typedef typename engine_type::result_type test_type; boost::scoped_ptr gen(new engine_type()); unsigned seeds[] = { 1, 2, 3, 4 }; unsigned *p1 = seeds, *p2 = seeds + 4; BOOST_CHECK_THROW(gen->seed(p1, p2), std::invalid_argument); gen->seed(); gen->seed(2); test_type a = gen->min(); test_type b = gen->max(); BOOST_CHECK(a < b); for(unsigned i = 0; i < 200; ++i) { test_type r = (*gen)(); BOOST_CHECK((boost::math::isfinite)(r)); BOOST_CHECK(a <= r); BOOST_CHECK(b >= r); } gen->discard(20); std::stringstream ss; ss << std::setprecision(std::numeric_limits::digits10 + 3) << *gen; boost::scoped_ptr gen2(new engine_type()); ss >> *gen2; BOOST_CHECK(*gen == *gen2); (*gen2)(); BOOST_CHECK(*gen != *gen2); } typedef boost::mpl::list < boost::random::bernoulli_distribution, boost::random::beta_distribution, boost::random::cauchy_distribution, boost::random::chi_squared_distribution, boost::random::exponential_distribution, boost::random::extreme_value_distribution, boost::random::fisher_f_distribution, boost::random::gamma_distribution, boost::random::laplace_distribution, boost::random::lognormal_distribution, boost::random::normal_distribution, #ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS boost::random::piecewise_constant_distribution, boost::random::piecewise_linear_distribution, #endif boost::random::student_t_distribution, boost::random::triangle_distribution, //boost::random::uniform_01, // doesn't respect the concept! But gets used internally anyway. boost::random::uniform_real_distribution, boost::random::uniform_on_sphere, boost::random::weibull_distribution > distributions; BOOST_AUTO_TEST_CASE_TEMPLATE(distributions_test, dist_type, distributions) { typedef typename dist_type::result_type result_type; dist_type d; result_type a = (d.min)(); result_type b = (d.max)(); typename dist_type::param_type p = d.param(); boost::ignore_unused(p); d.reset(); std::stringstream ss; ss << std::setprecision(std::numeric_limits::digits10 + 3) << d; dist_type d2; ss >> d2; BOOST_CHECK(d == d2); boost::random::mt19937 int_gen; for(unsigned i = 0; i < 200; ++i) { result_type r = d(int_gen); BOOST_CHECK((boost::math::isfinite)(r)); BOOST_CHECK(r >= a); BOOST_CHECK(r <= b); } #ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS large_int_generator big_int_gen; for(unsigned i = 0; i < 200; ++i) { result_type r = d(big_int_gen); BOOST_CHECK((boost::math::isfinite)(r)); BOOST_CHECK(r >= a); BOOST_CHECK(r <= b); } boost::random::discard_block_engine< ranlux_big_base_01, 389, 24 > big_float_gen; for(unsigned i = 0; i < 200; ++i) { result_type r = d(big_float_gen); BOOST_CHECK((boost::math::isfinite)(r)); BOOST_CHECK(r >= a); BOOST_CHECK(r <= b); } #endif boost::random::ranlux64_4_01 float_gen; for(unsigned i = 0; i < 200; ++i) { result_type r = d(float_gen); BOOST_CHECK((boost::math::isfinite)(r)); BOOST_CHECK(r >= a); BOOST_CHECK(r <= b); } } BOOST_AUTO_TEST_CASE(canonical_test) { typedef big_float result_type; boost::random::mt19937 int_gen; for(unsigned i = 0; i < 200; ++i) { result_type r = boost::random::generate_canonical::digits>(int_gen); BOOST_CHECK((boost::math::isfinite)(r)); BOOST_CHECK(r >= 0); BOOST_CHECK(r <= 1); } large_int_generator big_int_gen; for(unsigned i = 0; i < 200; ++i) { result_type r = boost::random::generate_canonical::digits>(big_int_gen); BOOST_CHECK((boost::math::isfinite)(r)); BOOST_CHECK(r >= 0); BOOST_CHECK(r <= 1); } boost::random::discard_block_engine< ranlux_big_base_01, 389, 24 > big_float_gen; for(unsigned i = 0; i < 200; ++i) { result_type r = boost::random::generate_canonical::digits>(big_float_gen); BOOST_CHECK((boost::math::isfinite)(r)); BOOST_CHECK(r >= 0); BOOST_CHECK(r <= 1); } boost::random::ranlux64_4_01 float_gen; for(unsigned i = 0; i < 200; ++i) { result_type r = boost::random::generate_canonical::digits>(float_gen); BOOST_CHECK((boost::math::isfinite)(r)); BOOST_CHECK(r >= 0); BOOST_CHECK(r <= 1); } }