/usr/include/boost/math/special_functions/detail
NameSizeModeActions
airy_ai_bi_zero.hpp62940644editdlrm
bernoulli_details.hpp265130644editdlrm
bessel_derivatives_linear.hpp33780644editdlrm
bessel_i0.hpp281350644editdlrm
bessel_i1.hpp299330644editdlrm
bessel_ik.hpp139170644editdlrm
bessel_j0.hpp85850644editdlrm
bessel_j1.hpp89510644editdlrm
bessel_jn.hpp39090644editdlrm
bessel_jy.hpp218680644editdlrm
bessel_jy_asym.hpp64880644editdlrm
bessel_jy_derivatives_asym.hpp46490644editdlrm
bessel_jy_derivatives_series.hpp69440644editdlrm
bessel_jy_series.hpp72410644editdlrm
bessel_jy_zero.hpp249670644editdlrm
bessel_k0.hpp221780644editdlrm
bessel_k1.hpp254650644editdlrm
bessel_kn.hpp22490644editdlrm
bessel_y0.hpp108050644editdlrm
bessel_y1.hpp94580644editdlrm
bessel_yn.hpp31180644editdlrm
daubechies_scaling_integer_grid.hpp2337880644editdlrm
erf_inv.hpp227380644editdlrm
fp_traits.hpp171930644editdlrm
gamma_inva.hpp70660644editdlrm
hypergeometric_0F1_bessel.hpp15430644editdlrm
hypergeometric_1F1_addition_theorems_on_z.hpp129800644editdlrm
hypergeometric_1F1_bessel.hpp327810644editdlrm
hypergeometric_1F1_by_ratios.hpp335400644editdlrm
hypergeometric_1F1_cf.hpp18300644editdlrm
hypergeometric_1F1_large_a.hpp11590644editdlrm
hypergeometric_1F1_large_abz.hpp221010644editdlrm
hypergeometric_1F1_negative_b_regions.hpp333760644editdlrm
hypergeometric_1F1_recurrence.hpp172950644editdlrm
hypergeometric_1F1_scaled_series.hpp21830644editdlrm
hypergeometric_1F1_small_a_negative_b_by_ratio.hpp38930644editdlrm
hypergeometric_asym.hpp59020644editdlrm
hypergeometric_cf.hpp58260644editdlrm
hypergeometric_pade.hpp38370644editdlrm
hypergeometric_pFq_checked_series.hpp279430644editdlrm
hypergeometric_rational.hpp50680644editdlrm
hypergeometric_separated_series.hpp14490644editdlrm
hypergeometric_series.hpp144220644editdlrm
ibeta_inverse.hpp340720644editdlrm
ibeta_inv_ab.hpp103630644editdlrm
iconv.hpp10090644editdlrm
igamma_inverse.hpp174140644editdlrm
igamma_large.hpp395340644editdlrm
lambert_w_lookup_table.ipp156010644editdlrm
lanczos_sse2.hpp89160644editdlrm
lgamma_small.hpp232950644editdlrm
polygamma.hpp225960644editdlrm
round_fwd.hpp27940644editdlrm
t_distribution_inv.hpp177350644editdlrm
unchecked_bernoulli.hpp764370644editdlrm
unchecked_factorial.hpp462900644editdlrm
Edit: /usr/include/boost/math/special_functions/detail/bessel_jy_series.hpp (7241B)
// Copyright (c) 2011 John Maddock // 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_BESSEL_JN_SERIES_HPP #define BOOST_MATH_BESSEL_JN_SERIES_HPP #ifdef _MSC_VER #pragma once #endif namespace boost { namespace math { namespace detail{ template struct bessel_j_small_z_series_term { typedef T result_type; bessel_j_small_z_series_term(T v_, T x) : N(0), v(v_) { BOOST_MATH_STD_USING mult = x / 2; mult *= -mult; term = 1; } T operator()() { T r = term; ++N; term *= mult / (N * (N + v)); return r; } private: unsigned N; T v; T mult; T term; }; // // Series evaluation for BesselJ(v, z) as z -> 0. // See http://functions.wolfram.com/Bessel-TypeFunctions/BesselJ/06/01/04/01/01/0003/ // Converges rapidly for all z << v. // template inline T bessel_j_small_z_series(T v, T x, const Policy& pol) { BOOST_MATH_STD_USING T prefix; if(v < max_factorial::value) { prefix = pow(x / 2, v) / boost::math::tgamma(v+1, pol); } else { prefix = v * log(x / 2) - boost::math::lgamma(v+1, pol); prefix = exp(prefix); } if(0 == prefix) return prefix; bessel_j_small_z_series_term s(v, x); boost::uintmax_t max_iter = policies::get_max_series_iterations(); #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) T zero = 0; T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon(), max_iter, zero); #else T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon(), max_iter); #endif policies::check_series_iterations("boost::math::bessel_j_small_z_series<%1%>(%1%,%1%)", max_iter, pol); return prefix * result; } template struct bessel_y_small_z_series_term_a { typedef T result_type; bessel_y_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; ++N; term *= mult / (N * (N - v)); return r; } private: unsigned N; T v; T mult; T term; }; template struct bessel_y_small_z_series_term_b { typedef T result_type; bessel_y_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()() { T r = term; ++N; term *= mult / (N * (N + v)); return r; } private: unsigned N; T v; T mult; T term; }; // // Series form for BesselY as z -> 0, // see: http://functions.wolfram.com/Bessel-TypeFunctions/BesselY/06/01/04/01/01/0003/ // This series is only useful when the second term is small compared to the first // otherwise we get catastrophic cancellation errors. // // Approximating tgamma(v) by v^v, and assuming |tgamma(-z)| < eps we end up requiring: // eps/2 * v^v(x/2)^-v > (x/2)^v or log(eps/2) > v log((x/2)^2/v) // template inline T bessel_y_small_z_series(T v, T x, T* pscale, const Policy& pol) { BOOST_MATH_STD_USING static const char* function = "bessel_y_small_z_series<%1%>(%1%,%1%)"; T prefix; T gam; T p = log(x / 2); T scale = 1; bool need_logs = (v >= max_factorial::value) || (tools::log_max_value() / v < fabs(p)); if(!need_logs) { gam = boost::math::tgamma(v, pol); p = pow(x / 2, v); if(tools::max_value() * p < gam) { scale /= gam; gam = 1; if(tools::max_value() * p < gam) { return -policies::raise_overflow_error(function, 0, pol); } } prefix = -gam / (constants::pi() * p); } else { gam = boost::math::lgamma(v, pol); p = v * p; prefix = gam - log(constants::pi()) - p; if(tools::log_max_value() < prefix) { prefix -= log(tools::max_value() / 4); scale /= (tools::max_value() / 4); if(tools::log_max_value() < prefix) { return -policies::raise_overflow_error(function, 0, pol); } } prefix = -exp(prefix); } bessel_y_small_z_series_term_a s(v, x); boost::uintmax_t max_iter = policies::get_max_series_iterations(); *pscale = scale; #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) T zero = 0; T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon(), max_iter, zero); #else T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon(), max_iter); #endif policies::check_series_iterations("boost::math::bessel_y_small_z_series<%1%>(%1%,%1%)", max_iter, pol); result *= prefix; if(!need_logs) { prefix = boost::math::tgamma(-v, pol) * boost::math::cos_pi(v) * p / constants::pi(); } else { int sgn; prefix = boost::math::lgamma(-v, &sgn, pol) + p; prefix = exp(prefix) * sgn / constants::pi(); } bessel_y_small_z_series_term_b s2(v, x); max_iter = policies::get_max_series_iterations(); #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) T b = boost::math::tools::sum_series(s2, boost::math::policies::get_epsilon(), max_iter, zero); #else T b = boost::math::tools::sum_series(s2, boost::math::policies::get_epsilon(), max_iter); #endif result -= scale * prefix * b; return result; } template T bessel_yn_small_z(int n, T z, T* scale, const Policy& pol) { // // See http://functions.wolfram.com/Bessel-TypeFunctions/BesselY/06/01/04/01/02/ // // Note that when called we assume that x < epsilon and n is a positive integer. // BOOST_MATH_STD_USING BOOST_ASSERT(n >= 0); BOOST_ASSERT((z < policies::get_epsilon())); if(n == 0) { return (2 / constants::pi()) * (log(z / 2) + constants::euler()); } else if(n == 1) { return (z / constants::pi()) * log(z / 2) - 2 / (constants::pi() * z) - (z / (2 * constants::pi())) * (1 - 2 * constants::euler()); } else if(n == 2) { return (z * z) / (4 * constants::pi()) * log(z / 2) - (4 / (constants::pi() * z * z)) - ((z * z) / (8 * constants::pi())) * (T(3)/2 - 2 * constants::euler()); } else { T p = pow(z / 2, n); T result = -((boost::math::factorial(n - 1) / constants::pi())); if(p * tools::max_value() < result) { T div = tools::max_value() / 8; result /= div; *scale /= div; if(p * tools::max_value() < result) { return -policies::raise_overflow_error("bessel_yn_small_z<%1%>(%1%,%1%)", 0, pol); } } return result / p; } } }}} // namespaces #endif // BOOST_MATH_BESSEL_JN_SERIES_HPP