diff --git a/include/boost/math/special_functions/detail/bessel_ik.hpp b/include/boost/math/special_functions/detail/bessel_ik.hpp index 0c653b475..7a9903708 100644 --- a/include/boost/math/special_functions/detail/bessel_ik.hpp +++ b/include/boost/math/special_functions/detail/bessel_ik.hpp @@ -326,6 +326,9 @@ int bessel_ik(T v, T x, T* result_I, T* result_K, int kind, const Policy& pol) T scale = 1; T scale_sign = 1; + n = iround(v, pol); + u = v - n; // -1/2 <= u < 1/2 + if (((kind & need_i) == 0) && (fabs(4 * v * v - 25) / (8 * x) < tools::forth_root_epsilon())) { // A&S 9.7.2 @@ -337,8 +340,6 @@ int bessel_ik(T v, T x, T* result_I, T* result_K, int kind, const Policy& pol) } else { - n = iround(v, pol); - u = v - n; // -1/2 <= u < 1/2 BOOST_MATH_INSTRUMENT_VARIABLE(n); BOOST_MATH_INSTRUMENT_VARIABLE(u); @@ -412,7 +413,7 @@ int bessel_ik(T v, T x, T* result_I, T* result_K, int kind, const Policy& pol) else Iv = std::numeric_limits::quiet_NaN(); // any value will do } - if (reflect) + if (reflect && (kind & need_i)) { T z = (u + n % 2); T fact = (2 / pi()) * (boost::math::sin_pi(z, pol) * Kv); diff --git a/include/boost/math/special_functions/detail/bessel_j1.hpp b/include/boost/math/special_functions/detail/bessel_j1.hpp index 6d354dcce..90f26bcc8 100644 --- a/include/boost/math/special_functions/detail/bessel_j1.hpp +++ b/include/boost/math/special_functions/detail/bessel_j1.hpp @@ -34,36 +34,9 @@ namespace boost { namespace math{ namespace detail{ template T bessel_j1(T x); -template -struct bessel_j1_initializer -{ - struct init - { - init() - { - do_init(); - } - static void do_init() - { - bessel_j1(T(1)); - } - void force_instantiate()const{} - }; - static const init initializer; - static void force_instantiate() - { - initializer.force_instantiate(); - } -}; - -template -const typename bessel_j1_initializer::init bessel_j1_initializer::initializer; - template T bessel_j1(T x) { - bessel_j1_initializer::force_instantiate(); - static const T P1[] = { static_cast(BOOST_MATH_BIG_CONSTANT(T, 64, -1.4258509801366645672e+11)), static_cast(BOOST_MATH_BIG_CONSTANT(T, 64, 6.6781041261492395835e+09)), diff --git a/include/boost/math/special_functions/detail/bessel_k0.hpp b/include/boost/math/special_functions/detail/bessel_k0.hpp index f29ffa75c..69a48b779 100644 --- a/include/boost/math/special_functions/detail/bessel_k0.hpp +++ b/include/boost/math/special_functions/detail/bessel_k0.hpp @@ -46,40 +46,6 @@ namespace boost { namespace math { namespace detail{ template T bessel_k0(const T& x); -template -struct bessel_k0_initializer -{ - struct init - { - init() - { - do_init(tag()); - } - static void do_init(const std::integral_constant&) - { - bessel_k0(T(0.5)); - bessel_k0(T(1.5)); - } - static void do_init(const std::integral_constant&) - { - bessel_k0(T(0.5)); - bessel_k0(T(1.5)); - } - template - static void do_init(const U&){} - void force_instantiate()const{} - }; - static const init initializer; - static void force_instantiate() - { - initializer.force_instantiate(); - } -}; - -template -const typename bessel_k0_initializer::init bessel_k0_initializer::initializer; - - template T bessel_k0_imp(const T&, const std::integral_constant&) { @@ -505,7 +471,6 @@ inline T bessel_k0(const T& x) 113 : -1 > tag_type; - bessel_k0_initializer::force_instantiate(); return bessel_k0_imp(x, tag_type()); } diff --git a/include/boost/math/special_functions/detail/bessel_k1.hpp b/include/boost/math/special_functions/detail/bessel_k1.hpp index bd37f9021..b7259e467 100644 --- a/include/boost/math/special_functions/detail/bessel_k1.hpp +++ b/include/boost/math/special_functions/detail/bessel_k1.hpp @@ -46,41 +46,6 @@ namespace boost { namespace math { namespace detail{ template T bessel_k1(const T&); - template - struct bessel_k1_initializer - { - struct init - { - init() - { - do_init(tag()); - } - static void do_init(const std::integral_constant&) - { - bessel_k1(T(0.5)); - bessel_k1(T(2)); - bessel_k1(T(6)); - } - static void do_init(const std::integral_constant&) - { - bessel_k1(T(0.5)); - bessel_k1(T(6)); - } - template - static void do_init(const U&) {} - void force_instantiate()const {} - }; - static const init initializer; - static void force_instantiate() - { - initializer.force_instantiate(); - } - }; - - template - const typename bessel_k1_initializer::init bessel_k1_initializer::initializer; - - template inline T bessel_k1_imp(const T&, const std::integral_constant&) { @@ -547,7 +512,6 @@ namespace boost { namespace math { namespace detail{ 113 : -1 > tag_type; - bessel_k1_initializer::force_instantiate(); return bessel_k1_imp(x, tag_type()); } diff --git a/include/boost/math/special_functions/detail/polygamma.hpp b/include/boost/math/special_functions/detail/polygamma.hpp index 8ca366314..a608f22c7 100644 --- a/include/boost/math/special_functions/detail/polygamma.hpp +++ b/include/boost/math/special_functions/detail/polygamma.hpp @@ -470,34 +470,12 @@ namespace boost { namespace math { namespace detail{ return exp(power_terms) * ((s < 0) && ((n + 1) & 1) ? -1 : 1) * boost::math::sign(sum); } - template - struct polygamma_initializer - { - struct init - { - init() - { - // Forces initialization of our table of coefficients and mutex: - boost::math::polygamma(30, T(-2.5f), Policy()); - } - void force_instantiate()const{} - }; - static const init initializer; - static void force_instantiate() - { - initializer.force_instantiate(); - } - }; - - template - const typename polygamma_initializer::init polygamma_initializer::initializer; - template inline T polygamma_imp(const int n, T x, const Policy &pol) { BOOST_MATH_STD_USING static const char* function = "boost::math::polygamma<%1%>(int, %1%)"; - polygamma_initializer::initializer.force_instantiate(); + if(n < 0) return policies::raise_domain_error(function, "Order must be >= 0, but got %1%", static_cast(n), pol); if(x < 0) diff --git a/include/boost/math/special_functions/detail/unchecked_factorial.hpp b/include/boost/math/special_functions/detail/unchecked_factorial.hpp index b528a24fe..8428f7400 100644 --- a/include/boost/math/special_functions/detail/unchecked_factorial.hpp +++ b/include/boost/math/special_functions/detail/unchecked_factorial.hpp @@ -1271,28 +1271,6 @@ struct max_factorial #endif -template -struct unchecked_factorial_initializer -{ - struct init - { - init() - { - boost::math::unchecked_factorial(3); - } - void force_instantiate()const {} - }; - static const init initializer; - static void force_instantiate() - { - initializer.force_instantiate(); - } -}; - -template -const typename unchecked_factorial_initializer::init unchecked_factorial_initializer::initializer; - - template inline T unchecked_factorial_imp(unsigned i, const std::integral_constant&) { diff --git a/include/boost/math/special_functions/log1p.hpp b/include/boost/math/special_functions/log1p.hpp index 9b8a8e0eb..1fdd6dc52 100644 --- a/include/boost/math/special_functions/log1p.hpp +++ b/include/boost/math/special_functions/log1p.hpp @@ -263,34 +263,6 @@ T log1p_imp(T const& x, const Policy& pol, const std::integral_constant return result; } -template -struct log1p_initializer -{ - struct init - { - init() - { - do_init(tag()); - } - template - static void do_init(const std::integral_constant&){} - static void do_init(const std::integral_constant&) - { - boost::math::log1p(static_cast(0.25), Policy()); - } - void force_instantiate()const{} - }; - static const init initializer; - static void force_instantiate() - { - initializer.force_instantiate(); - } -}; - -template -const typename log1p_initializer::init log1p_initializer::initializer; - - } // namespace detail template @@ -312,8 +284,6 @@ inline typename tools::promote_args::type log1p(T x, const Policy&) precision_type::value <= 64 ? 64 : 0 > tag_type; - detail::log1p_initializer::force_instantiate(); - return policies::checked_narrowing_cast( detail::log1p_imp(static_cast(x), forwarding_policy(), tag_type()), "boost::math::log1p<%1%>(%1%)"); } diff --git a/include/boost/math/special_functions/next.hpp b/include/boost/math/special_functions/next.hpp index 02a208e4e..ee22ce78c 100644 --- a/include/boost/math/special_functions/next.hpp +++ b/include/boost/math/special_functions/next.hpp @@ -121,31 +121,6 @@ inline bool has_denorm_now() { template T get_min_shift_value(); -template -struct min_shift_initializer -{ - struct init - { - init() - { - do_init(); - } - static void do_init() - { - get_min_shift_value(); - } - void force_instantiate()const{} - }; - static const init initializer; - static void force_instantiate() - { - initializer.force_instantiate(); - } -}; - -template -const typename min_shift_initializer::init min_shift_initializer::initializer; - template inline T calc_min_shifted(const std::true_type&) { @@ -166,8 +141,6 @@ template inline T get_min_shift_value() { static const T val = calc_min_shifted(std::integral_constant::is_specialized || std::numeric_limits::radix == 2>()); - min_shift_initializer::force_instantiate(); - return val; } diff --git a/include/boost/math/special_functions/owens_t.hpp b/include/boost/math/special_functions/owens_t.hpp index c794f0cac..e09608b39 100644 --- a/include/boost/math/special_functions/owens_t.hpp +++ b/include/boost/math/special_functions/owens_t.hpp @@ -1026,34 +1026,6 @@ namespace boost return val; } // RealType owens_t(RealType h, RealType a) - template - struct owens_t_initializer - { - struct init - { - init() - { - do_init(tag()); - } - template - static void do_init(const std::integral_constant&){} - static void do_init(const std::integral_constant&) - { - boost::math::owens_t(static_cast(7), static_cast(0.96875), Policy()); - boost::math::owens_t(static_cast(2), static_cast(0.5), Policy()); - } - void force_instantiate()const{} - }; - static const init initializer; - static void force_instantiate() - { - initializer.force_instantiate(); - } - }; - - template - const typename owens_t_initializer::init owens_t_initializer::initializer; - } // namespace detail template @@ -1067,8 +1039,6 @@ namespace boost precision_type::value <= 64 ? 64 : 65 > tag_type; - detail::owens_t_initializer::force_instantiate(); - return policies::checked_narrowing_cast(detail::owens_t(static_cast(h), static_cast(a), pol), "boost::math::owens_t<%1%>(%1%,%1%)"); } diff --git a/include/boost/math/special_functions/trigamma.hpp b/include/boost/math/special_functions/trigamma.hpp index f74b43db1..d40be39cb 100644 --- a/include/boost/math/special_functions/trigamma.hpp +++ b/include/boost/math/special_functions/trigamma.hpp @@ -394,35 +394,6 @@ T trigamma_imp(T x, const std::integral_constant*, const Policy& pol) { return polygamma_imp(1, x, pol); } -// -// Initializer: ensure all our constants are initialized prior to the first call of main: -// -template -struct trigamma_initializer -{ - struct init - { - init() - { - typedef typename policies::precision::type precision_type; - do_init(std::integral_constant()); - } - void do_init(const std::true_type&) - { - boost::math::trigamma(T(2.5), Policy()); - } - void do_init(const std::false_type&){} - void force_instantiate()const{} - }; - static const init initializer; - static void force_instantiate() - { - initializer.force_instantiate(); - } -}; - -template -const typename trigamma_initializer::init trigamma_initializer::initializer; } // namespace detail @@ -446,9 +417,6 @@ inline typename tools::promote_args::type policies::discrete_quantile<>, policies::assert_undefined<> >::type forwarding_policy; - // Force initialization of constants: - detail::trigamma_initializer::force_instantiate(); - return policies::checked_narrowing_cast(detail::trigamma_imp( static_cast(x), static_cast(nullptr), forwarding_policy()), "boost::math::trigamma<%1%>(%1%)"); diff --git a/include/boost/math/special_functions/zeta.hpp b/include/boost/math/special_functions/zeta.hpp index 1a3bba748..de74d3d05 100644 --- a/include/boost/math/special_functions/zeta.hpp +++ b/include/boost/math/special_functions/zeta.hpp @@ -1010,53 +1010,6 @@ T zeta_imp(T s, T sc, const Policy& pol, const Tag& tag) return result; } -template -struct zeta_initializer -{ - struct init - { - init() - { - do_init(tag()); - } - static void do_init(const std::integral_constant&){ boost::math::zeta(static_cast(5), Policy()); } - static void do_init(const std::integral_constant&){ boost::math::zeta(static_cast(5), Policy()); } - static void do_init(const std::integral_constant&) - { - boost::math::zeta(static_cast(0.5), Policy()); - boost::math::zeta(static_cast(1.5), Policy()); - boost::math::zeta(static_cast(3.5), Policy()); - boost::math::zeta(static_cast(6.5), Policy()); - boost::math::zeta(static_cast(14.5), Policy()); - boost::math::zeta(static_cast(40.5), Policy()); - - boost::math::zeta(static_cast(5), Policy()); - } - static void do_init(const std::integral_constant&) - { - boost::math::zeta(static_cast(0.5), Policy()); - boost::math::zeta(static_cast(1.5), Policy()); - boost::math::zeta(static_cast(3.5), Policy()); - boost::math::zeta(static_cast(5.5), Policy()); - boost::math::zeta(static_cast(9.5), Policy()); - boost::math::zeta(static_cast(16.5), Policy()); - boost::math::zeta(static_cast(25.5), Policy()); - boost::math::zeta(static_cast(70.5), Policy()); - - boost::math::zeta(static_cast(5), Policy()); - } - void force_instantiate()const{} - }; - static const init initializer; - static void force_instantiate() - { - initializer.force_instantiate(); - } -}; - -template -const typename zeta_initializer::init zeta_initializer::initializer; - } // detail template @@ -1078,8 +1031,6 @@ inline typename tools::promote_args::type zeta(T s, const Policy&) precision_type::value <= 113 ? 113 : 0 > tag_type; - detail::zeta_initializer::force_instantiate(); - return policies::checked_narrowing_cast(detail::zeta_imp( static_cast(s), static_cast(1 - static_cast(s)),