diff options
Diffstat (limited to 'boost/math/constants/generate.hpp')
-rw-r--r-- | boost/math/constants/generate.hpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/boost/math/constants/generate.hpp b/boost/math/constants/generate.hpp new file mode 100644 index 0000000000..dfb15633a5 --- /dev/null +++ b/boost/math/constants/generate.hpp @@ -0,0 +1,76 @@ +// Copyright John Maddock 2010. +// 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) + +#ifndef BOOST_MATH_CONSTANTS_GENERATE_INCLUDED +#define BOOST_MATH_CONSTANTS_GENERATE_INCLUDED + +#include <boost/math/constants/constants.hpp> +#include <boost/regex.hpp> +#include <iostream> +#include <iomanip> +#include <sstream> + +#ifdef USE_MPFR +#include <boost/math/bindings/mpfr.hpp> +#elif defined(USE_MPREAL) +#include <boost/math/bindings/mpreal.hpp> +#elif defined(USE_CPP_FLOAT) +#include <boost/multiprecision/cpp_float.hpp> +#else +#include <boost/math/bindings/rr.hpp> +#endif + +namespace boost{ namespace math{ namespace constants{ + +#ifdef USE_MPFR +typedef mpfr_class generator_type; +#elif defined(USE_MPREAL) +typedef mpfr::mpreal generator_type; +#elif defined(USE_CPP_FLOAT) +typedef boost::multiprecision::mp_number<boost::multiprecision::cpp_float<500> > generator_type; +#else +typedef ntl::RR generator_type; +#endif + +inline void print_constant(const char* name, generator_type(*f)(const mpl::int_<0>&)) +{ +#ifdef USE_MPFR + mpfr_class::set_dprec(((200 + 1) * 1000L) / 301L); +#elif defined(USE_MPREAL) + mpfr::mpreal::set_default_prec(((200 + 1) * 1000L) / 301L); +#elif defined(USE_CPP_FLOAT) + // Nothing to do, precision is already set. +#else + ntl::RR::SetPrecision(((200 + 1) * 1000L) / 301L); + ntl::RR::SetOutputPrecision(102); +#endif + generator_type value = f(boost::mpl::int_<0>()); + std::stringstream os; + os << std::setprecision(110) << std::scientific; + os << value; + std::string s = os.str(); + static const regex e("([+-]?\\d+(?:\\.\\d{0,36})?)(\\d*)(?:e([+-]?\\d+))?"); + smatch what; + if(regex_match(s, what, e)) + { + std::cout << + "BOOST_DEFINE_MATH_CONSTANT(" << name << ", " + << what[1] << "e" << (what[3].length() ? what[3].str() : std::string("0")) << ", " + << "\"" << what[1] << what[2] << "e" << (what[3].length() ? what[3].str() : std::string("0")) + << "\");" << std::endl; + } + else + { + std::cout << "Format of numeric constant was not recognised!!" << std::endl; + } +} + +#define BOOST_CONSTANTS_GENERATE(name) \ + boost::math::constants::print_constant(#name, \ + & boost::math::constants::detail::BOOST_JOIN(constant_, name)<boost::math::constants::generator_type>::get) + +}}} // namespaces + +#endif // BOOST_MATH_CONSTANTS_GENERATE_INCLUDED |