diff --git a/boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp b/boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp index e8bf603fe..0dc68fc73 100644 --- a/boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp +++ b/boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp @@ -18,26 +18,30 @@ struct bessel_j_derivative_small_z_series_term typedef T result_type; bessel_j_derivative_small_z_series_term(T v_, T x) - : N(0), v(v_) + : N(0), v(v_), term(1), mult(x / 2) { - BOOST_MATH_STD_USING - mult = x / 2; mult *= -mult; - term = 1; + // iterate if v == 0; otherwise result of + // first term is 0 and tools::sum_series stops + if (v == 0) + iterate(); } T operator()() { - BOOST_MATH_STD_USING T r = term * (v + 2 * N); - ++N; - term *= mult / (N * (N + v)); - return r == 0 ? operator()() : r; + iterate(); + return r; } private: + void iterate() + { + ++N; + term *= mult / (N * (N + v)); + } unsigned N; T v; - T mult; T term; + T mult; }; // // Series evaluation for BesselJ'(v, z) as z -> 0. @@ -51,11 +55,11 @@ inline T bessel_j_derivative_small_z_series(T v, T x, const Policy& pol) T prefix; if (v < boost::math::max_factorial::value) { - prefix = pow(x / 2, v-1) / 2 / boost::math::tgamma(v+1, pol); + prefix = pow(x / 2, v - 1) / 2 / boost::math::tgamma(v + 1, pol); } else { - prefix = (v - 1) * log(x / 2) - constants::ln_two() - boost::math::lgamma(v+1, pol); + prefix = (v - 1) * log(x / 2) - constants::ln_two() - boost::math::lgamma(v + 1, pol); prefix = exp(prefix); } if (0 == prefix) @@ -81,18 +85,16 @@ struct bessel_y_derivative_small_z_series_term_a bessel_y_derivative_small_z_series_term_a(T v_, T x) : N(0), v(v_) { - BOOST_MATH_STD_USING mult = x / 2; mult *= -mult; term = 1; } T operator()() { - BOOST_MATH_STD_USING T r = term * (-v + 2 * N); ++N; term *= mult / (N * (N - v)); - return r == 0 ? operator()() : r; + return r; } private: unsigned N; @@ -109,18 +111,16 @@ struct bessel_y_derivative_small_z_series_term_b bessel_y_derivative_small_z_series_term_b(T v_, T x) : N(0), v(v_) { - BOOST_MATH_STD_USING mult = x / 2; mult *= -mult; term = 1; } T operator()() { - BOOST_MATH_STD_USING T r = term * (v + 2 * N); ++N; term *= mult / (N * (N + v)); - return r == 0 ? operator()() : r; + return r; } private: unsigned N;