1 // (C) Copyright John Maddock 2006.
2 // Use, modification and distribution are subject to the
3 // Boost Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #define BOOST_MATH_MAX_SERIES_ITERATION_POLICY 10000000
9 #include <boost/math/constants/constants.hpp>
10 #include <boost/lexical_cast.hpp>
13 #include <boost/math/tools/test_data.hpp>
14 #include <boost/random.hpp>
16 using namespace boost::math::tools
;
17 using namespace boost::math
;
20 struct hypergeometric_2f2_gen
22 mp_t
operator()(mp_t a1
, mp_t a2
, mp_t b1
, mp_t b2
, mp_t z
)
32 abs_result
+= fabs(term
);
33 if (fabs(result
) * boost::math::tools::epsilon
<mp_t
>() > fabs(term
))
46 if (abs_result
* boost::math::tools::epsilon
<mp_t
>() / fabs(result
) > 1e-40)
47 throw std::domain_error("Unable to calculate result");
48 if(fabs(result
) > (std::numeric_limits
<double>::max
)())
49 throw std::domain_error("Unable to calculate result");
51 std::cout
<< a1
<< " " << a2
<< " " << b1
<< " " << b2
<< " " << z
<< " " << result
<< std::endl
;
56 int main(int, char* [])
58 parameter_info
<mp_t
> arg1
, arg2
, arg3
, arg4
, arg5
;
61 std::cout
<< "Welcome.\n"
62 "This program will generate spot tests for 2F2:\n";
70 std::cout
<< "Enter the range to calculate over for a1, a2, b1 and b2 (single value, range will be -x to x): ";
74 std::cout
<< "Enter the range to calculate over for z (single value, range will be -x to x): ";
78 std::cout
<< "Enter how many test points to calculate: ";
79 std::cin
>> num_spots
;
82 random_ns::mt19937 rnd
;
83 random_ns::uniform_real_distribution
<float> ur_a(-range
, range
);
84 random_ns::uniform_real_distribution
<float> ur_z(-z_range
, z_range
);
94 arg1
= make_single_param(a1
);
95 arg2
= make_single_param(a2
);
96 arg3
= make_single_param(b1
);
97 arg4
= make_single_param(b2
);
98 arg5
= make_single_param(z
);
99 data
.insert(hypergeometric_2f2_gen(), arg1
, arg2
, arg3
, arg4
, arg5
);
100 } while (num_spots
--);
102 std::cout
<< "Any more data?";
109 std::cout
<< "Enter name of test data file [default=hypergeometric_2f2.ipp]";
110 std::getline(std::cin
, line
);
111 boost::algorithm::trim(line
);
113 line
= "hypergeometric_2f2.ipp";
114 std::ofstream
ofs(line
.c_str());
115 ofs
<< std::scientific
<< std::setprecision(40);
116 write_code(ofs
, data
, line
.c_str());