+2013-02-08 Edward Smith-Rowland <3dw4rd@verizon.net>
+
+ PR libstdc++/56216
+ * include/tr1/special_function_util.h: Remove spurious const
+ from numeric arguments.
+ * include/tr1/riemann_zeta.tcc: Ditto.
+ * include/tr1/exp_integral.tcc: Ditto.
+ * include/tr1/bessel_function.tcc: Ditto.
+ * include/tr1/hypergeometric.tcc: Ditto.
+ * include/tr1/modified_bessel_func.tcc: Ditto.
+ * include/tr1/poly_laguerre.tcc: Ditto.
+ * include/tr1/gamma.tcc: Ditto.
+ * include/tr1/legendre_function.tcc: Ditto.
+ * include/tr1/poly_hermite.tcc: Ditto.
+ * include/tr1/ell_integral.tcc: Ditto.
+ * include/tr1/bessel_function.tcc (__cyl_bessel_ij_series):
+ If argument is zero return function value.
+ * testsuite/tr1/5_numerical_facilities/special_functions/08_cyl_bessel_i/pr56216.cc:
+ New file.
+
2013-02-07 Paolo Carlini <paolo.carlini@oracle.com>
* testsuite/27_io/basic_ios/pr56193.cc: Tweak.
*/
template <typename _Tp>
void
- __gamma_temme(const _Tp __mu,
- _Tp & __gam1, _Tp & __gam2, _Tp & __gampl, _Tp & __gammi)
+ __gamma_temme(_Tp __mu,
+ _Tp & __gam1, _Tp & __gam2, _Tp & __gampl, _Tp & __gammi)
{
#if _GLIBCXX_USE_C99_MATH_TR1
__gampl = _Tp(1) / std::tr1::tgamma(_Tp(1) + __mu);
*/
template <typename _Tp>
void
- __bessel_jn(const _Tp __nu, const _Tp __x,
+ __bessel_jn(_Tp __nu, _Tp __x,
_Tp & __Jnu, _Tp & __Nnu, _Tp & __Jpnu, _Tp & __Npnu)
{
if (__x == _Tp(0))
*/
template <typename _Tp>
void
- __cyl_bessel_jn_asymp(const _Tp __nu, const _Tp __x,
- _Tp & __Jnu, _Tp & __Nnu)
+ __cyl_bessel_jn_asymp(_Tp __nu, _Tp __x, _Tp & __Jnu, _Tp & __Nnu)
{
- const _Tp __coef = std::sqrt(_Tp(2)
- / (__numeric_constants<_Tp>::__pi() * __x));
const _Tp __mu = _Tp(4) * __nu * __nu;
const _Tp __mum1 = __mu - _Tp(1);
const _Tp __mum9 = __mu - _Tp(9);
const _Tp __c = std::cos(__chi);
const _Tp __s = std::sin(__chi);
+ const _Tp __coef = std::sqrt(_Tp(2)
+ / (__numeric_constants<_Tp>::__pi() * __x));
__Jnu = __coef * (__c * __P - __s * __Q);
__Nnu = __coef * (__s * __P + __c * __Q);
*/
template <typename _Tp>
_Tp
- __cyl_bessel_ij_series(const _Tp __nu, const _Tp __x, const _Tp __sgn,
- const unsigned int __max_iter)
+ __cyl_bessel_ij_series(_Tp __nu, _Tp __x, _Tp __sgn,
+ unsigned int __max_iter)
{
-
+ if (__x == _Tp(0))
+ {
+ if (__nu == _Tp(0))
+ return _Tp(1);
+ else if (__nu == _Tp(1))
+ return _Tp(0);
+ else
+ return _Tp(0);
+ }
const _Tp __x2 = __x / _Tp(2);
_Tp __fact = __nu * std::log(__x2);
#if _GLIBCXX_USE_C99_MATH_TR1
*/
template<typename _Tp>
_Tp
- __cyl_bessel_j(const _Tp __nu, const _Tp __x)
+ __cyl_bessel_j(_Tp __nu, _Tp __x)
{
if (__nu < _Tp(0) || __x < _Tp(0))
std::__throw_domain_error(__N("Bad argument "
*/
template<typename _Tp>
_Tp
- __cyl_neumann_n(const _Tp __nu, const _Tp __x)
+ __cyl_neumann_n(_Tp __nu, _Tp __x)
{
if (__nu < _Tp(0) || __x < _Tp(0))
std::__throw_domain_error(__N("Bad argument "
*/
template <typename _Tp>
void
- __sph_bessel_jn(const unsigned int __n, const _Tp __x,
+ __sph_bessel_jn(unsigned int __n, _Tp __x,
_Tp & __j_n, _Tp & __n_n, _Tp & __jp_n, _Tp & __np_n)
{
const _Tp __nu = _Tp(__n) + _Tp(0.5L);
*/
template <typename _Tp>
_Tp
- __sph_bessel(const unsigned int __n, const _Tp __x)
+ __sph_bessel(unsigned int __n, _Tp __x)
{
if (__x < _Tp(0))
std::__throw_domain_error(__N("Bad argument "
*/
template <typename _Tp>
_Tp
- __sph_neumann(const unsigned int __n, const _Tp __x)
+ __sph_neumann(unsigned int __n, _Tp __x)
{
if (__x < _Tp(0))
std::__throw_domain_error(__N("Bad argument "
*/
template<typename _Tp>
_Tp
- __ellint_rf(const _Tp __x, const _Tp __y, const _Tp __z)
+ __ellint_rf(_Tp __x, _Tp __y, _Tp __z)
{
const _Tp __min = std::numeric_limits<_Tp>::min();
const _Tp __max = std::numeric_limits<_Tp>::max();
*/
template<typename _Tp>
_Tp
- __comp_ellint_1_series(const _Tp __k)
+ __comp_ellint_1_series(_Tp __k)
{
const _Tp __kk = __k * __k;
*/
template<typename _Tp>
_Tp
- __comp_ellint_1(const _Tp __k)
+ __comp_ellint_1(_Tp __k)
{
if (__isnan(__k))
*/
template<typename _Tp>
_Tp
- __ellint_1(const _Tp __k, const _Tp __phi)
+ __ellint_1(_Tp __k, _Tp __phi)
{
if (__isnan(__k) || __isnan(__phi))
*/
template<typename _Tp>
_Tp
- __comp_ellint_2_series(const _Tp __k)
+ __comp_ellint_2_series(_Tp __k)
{
const _Tp __kk = __k * __k;
*/
template<typename _Tp>
_Tp
- __ellint_rd(const _Tp __x, const _Tp __y, const _Tp __z)
+ __ellint_rd(_Tp __x, _Tp __y, _Tp __z)
{
const _Tp __eps = std::numeric_limits<_Tp>::epsilon();
const _Tp __errtol = std::pow(__eps / _Tp(8), _Tp(1) / _Tp(6));
*/
template<typename _Tp>
_Tp
- __comp_ellint_2(const _Tp __k)
+ __comp_ellint_2(_Tp __k)
{
if (__isnan(__k))
*/
template<typename _Tp>
_Tp
- __ellint_2(const _Tp __k, const _Tp __phi)
+ __ellint_2(_Tp __k, _Tp __phi)
{
if (__isnan(__k) || __isnan(__phi))
*/
template<typename _Tp>
_Tp
- __ellint_rc(const _Tp __x, const _Tp __y)
+ __ellint_rc(_Tp __x, _Tp __y)
{
const _Tp __min = std::numeric_limits<_Tp>::min();
const _Tp __max = std::numeric_limits<_Tp>::max();
*/
template<typename _Tp>
_Tp
- __ellint_rj(const _Tp __x, const _Tp __y, const _Tp __z, const _Tp __p)
+ __ellint_rj(_Tp __x, _Tp __y, _Tp __z, _Tp __p)
{
const _Tp __min = std::numeric_limits<_Tp>::min();
const _Tp __max = std::numeric_limits<_Tp>::max();
*/
template<typename _Tp>
_Tp
- __comp_ellint_3(const _Tp __k, const _Tp __nu)
+ __comp_ellint_3(_Tp __k, _Tp __nu)
{
if (__isnan(__k) || __isnan(__nu))
*/
template<typename _Tp>
_Tp
- __ellint_3(const _Tp __k, const _Tp __nu, const _Tp __phi)
+ __ellint_3(_Tp __k, _Tp __nu, _Tp __phi)
{
if (__isnan(__k) || __isnan(__nu) || __isnan(__phi))
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
- template<typename _Tp> _Tp __expint_E1(const _Tp);
+ template<typename _Tp> _Tp __expint_E1(_Tp);
/**
* @brief Return the exponential integral @f$ E_1(x) @f$
*/
template<typename _Tp>
_Tp
- __expint_E1_series(const _Tp __x)
+ __expint_E1_series(_Tp __x)
{
const _Tp __eps = std::numeric_limits<_Tp>::epsilon();
_Tp __term = _Tp(1);
*/
template<typename _Tp>
_Tp
- __expint_E1_asymp(const _Tp __x)
+ __expint_E1_asymp(_Tp __x)
{
_Tp __term = _Tp(1);
_Tp __esum = _Tp(1);
*/
template<typename _Tp>
_Tp
- __expint_En_series(const unsigned int __n, const _Tp __x)
+ __expint_En_series(unsigned int __n, _Tp __x)
{
const unsigned int __max_iter = 100;
const _Tp __eps = std::numeric_limits<_Tp>::epsilon();
*/
template<typename _Tp>
_Tp
- __expint_En_cont_frac(const unsigned int __n, const _Tp __x)
+ __expint_En_cont_frac(unsigned int __n, _Tp __x)
{
const unsigned int __max_iter = 100;
const _Tp __eps = std::numeric_limits<_Tp>::epsilon();
*/
template<typename _Tp>
_Tp
- __expint_En_recursion(const unsigned int __n, const _Tp __x)
+ __expint_En_recursion(unsigned int __n, _Tp __x)
{
_Tp __En;
_Tp __E1 = __expint_E1(__x);
*/
template<typename _Tp>
_Tp
- __expint_Ei_series(const _Tp __x)
+ __expint_Ei_series(_Tp __x)
{
_Tp __term = _Tp(1);
_Tp __sum = _Tp(0);
*/
template<typename _Tp>
_Tp
- __expint_Ei_asymp(const _Tp __x)
+ __expint_Ei_asymp(_Tp __x)
{
_Tp __term = _Tp(1);
_Tp __sum = _Tp(1);
*/
template<typename _Tp>
_Tp
- __expint_Ei(const _Tp __x)
+ __expint_Ei(_Tp __x)
{
if (__x < _Tp(0))
return -__expint_E1(-__x);
*/
template<typename _Tp>
_Tp
- __expint_E1(const _Tp __x)
+ __expint_E1(_Tp __x)
{
if (__x < _Tp(0))
return -__expint_Ei(-__x);
*/
template<typename _Tp>
_Tp
- __expint_asymp(const unsigned int __n, const _Tp __x)
+ __expint_asymp(unsigned int __n, _Tp __x)
{
_Tp __term = _Tp(1);
_Tp __sum = _Tp(1);
*/
template<typename _Tp>
_Tp
- __expint_large_n(const unsigned int __n, const _Tp __x)
+ __expint_large_n(unsigned int __n, _Tp __x)
{
const _Tp __xpn = __x + __n;
const _Tp __xpn2 = __xpn * __xpn;
*/
template<typename _Tp>
_Tp
- __expint(const unsigned int __n, const _Tp __x)
+ __expint(unsigned int __n, _Tp __x)
{
// Return NaN on NaN input.
if (__isnan(__x))
*/
template<typename _Tp>
inline _Tp
- __expint(const _Tp __x)
+ __expint(_Tp __x)
{
if (__isnan(__x))
return std::numeric_limits<_Tp>::quiet_NaN();
* @return The Bernoulli number of order n.
*/
template <typename _Tp>
- _Tp __bernoulli_series(unsigned int __n)
+ _Tp
+ __bernoulli_series(unsigned int __n)
{
static const _Tp __num[28] = {
*/
template<typename _Tp>
inline _Tp
- __bernoulli(const int __n)
- {
- return __bernoulli_series<_Tp>(__n);
- }
+ __bernoulli(int __n)
+ { return __bernoulli_series<_Tp>(__n); }
/**
*/
template<typename _Tp>
_Tp
- __log_gamma_bernoulli(const _Tp __x)
+ __log_gamma_bernoulli(_Tp __x)
{
_Tp __lg = (__x - _Tp(0.5L)) * std::log(__x) - __x
+ _Tp(0.5L) * std::log(_Tp(2)
*/
template<typename _Tp>
_Tp
- __log_gamma_lanczos(const _Tp __x)
+ __log_gamma_lanczos(_Tp __x)
{
const _Tp __xm1 = __x - _Tp(1);
*/
template<typename _Tp>
_Tp
- __log_gamma(const _Tp __x)
+ __log_gamma(_Tp __x)
{
if (__x > _Tp(0.5L))
return __log_gamma_lanczos(__x);
*/
template<typename _Tp>
_Tp
- __log_gamma_sign(const _Tp __x)
+ __log_gamma_sign(_Tp __x)
{
if (__x > _Tp(0))
return _Tp(1);
*/
template<typename _Tp>
_Tp
- __log_bincoef(const unsigned int __n, const unsigned int __k)
+ __log_bincoef(unsigned int __n, unsigned int __k)
{
// Max e exponent before overflow.
static const _Tp __max_bincoeff
*/
template<typename _Tp>
_Tp
- __bincoef(const unsigned int __n, const unsigned int __k)
+ __bincoef(unsigned int __n, unsigned int __k)
{
// Max e exponent before overflow.
static const _Tp __max_bincoeff
*/
template<typename _Tp>
inline _Tp
- __gamma(const _Tp __x)
- {
- return std::exp(__log_gamma(__x));
- }
+ __gamma(_Tp __x)
+ { return std::exp(__log_gamma(__x)); }
/**
*/
template<typename _Tp>
_Tp
- __psi_series(const _Tp __x)
+ __psi_series(_Tp __x)
{
_Tp __sum = -__numeric_constants<_Tp>::__gamma_e() - _Tp(1) / __x;
const unsigned int __max_iter = 100000;
*/
template<typename _Tp>
_Tp
- __psi_asymp(const _Tp __x)
+ __psi_asymp(_Tp __x)
{
_Tp __sum = std::log(__x) - _Tp(0.5L) / __x;
const _Tp __xx = __x * __x;
*/
template<typename _Tp>
_Tp
- __psi(const _Tp __x)
+ __psi(_Tp __x)
{
const int __n = static_cast<int>(__x + 0.5L);
const _Tp __eps = _Tp(4) * std::numeric_limits<_Tp>::epsilon();
*/
template<typename _Tp>
_Tp
- __psi(const unsigned int __n, const _Tp __x)
+ __psi(unsigned int __n, _Tp __x)
{
if (__x <= _Tp(0))
std::__throw_domain_error(__N("Argument out of range "
*/
template<typename _Tp>
_Tp
- __conf_hyperg_series(const _Tp __a, const _Tp __c, const _Tp __x)
+ __conf_hyperg_series(_Tp __a, _Tp __c, _Tp __x)
{
const _Tp __eps = std::numeric_limits<_Tp>::epsilon();
*/
template<typename _Tp>
_Tp
- __conf_hyperg_luke(const _Tp __a, const _Tp __c, const _Tp __xin)
+ __conf_hyperg_luke(_Tp __a, _Tp __c, _Tp __xin)
{
const _Tp __big = std::pow(std::numeric_limits<_Tp>::max(), _Tp(0.16L));
const int __nmax = 20000;
* @return The confluent hypergeometric function.
*/
template<typename _Tp>
- inline _Tp
- __conf_hyperg(const _Tp __a, const _Tp __c, const _Tp __x)
+ _Tp
+ __conf_hyperg(_Tp __a, _Tp __c, _Tp __x)
{
#if _GLIBCXX_USE_C99_MATH_TR1
const _Tp __c_nint = std::tr1::nearbyint(__c);
*/
template<typename _Tp>
_Tp
- __hyperg_series(const _Tp __a, const _Tp __b,
- const _Tp __c, const _Tp __x)
+ __hyperg_series(_Tp __a, _Tp __b, _Tp __c, _Tp __x)
{
const _Tp __eps = std::numeric_limits<_Tp>::epsilon();
*/
template<typename _Tp>
_Tp
- __hyperg_luke(const _Tp __a, const _Tp __b, const _Tp __c,
- const _Tp __xin)
+ __hyperg_luke(_Tp __a, _Tp __b, _Tp __c, _Tp __xin)
{
const _Tp __big = std::pow(std::numeric_limits<_Tp>::max(), _Tp(0.16L));
const int __nmax = 20000;
*/
template<typename _Tp>
_Tp
- __hyperg_reflect(const _Tp __a, const _Tp __b, const _Tp __c,
- const _Tp __x)
+ __hyperg_reflect(_Tp __a, _Tp __b, _Tp __c, _Tp __x)
{
const _Tp __d = __c - __a - __b;
const int __intd = std::floor(__d + _Tp(0.5L));
* @return The confluent hypergeometric function.
*/
template<typename _Tp>
- inline _Tp
- __hyperg(const _Tp __a, const _Tp __b, const _Tp __c, const _Tp __x)
+ _Tp
+ __hyperg(_Tp __a, _Tp __b, _Tp __c, _Tp __x)
{
#if _GLIBCXX_USE_C99_MATH_TR1
const _Tp __a_nint = std::tr1::nearbyint(__a);
*/
template<typename _Tp>
_Tp
- __poly_legendre_p(const unsigned int __l, const _Tp __x)
+ __poly_legendre_p(unsigned int __l, _Tp __x)
{
if ((__x < _Tp(-1)) || (__x > _Tp(+1)))
*/
template<typename _Tp>
_Tp
- __assoc_legendre_p(const unsigned int __l, const unsigned int __m,
- const _Tp __x)
+ __assoc_legendre_p(unsigned int __l, unsigned int __m, _Tp __x)
{
if (__x < _Tp(-1) || __x > _Tp(+1))
*/
template <typename _Tp>
_Tp
- __sph_legendre(const unsigned int __l, const unsigned int __m,
- const _Tp __theta)
+ __sph_legendre(unsigned int __l, unsigned int __m, _Tp __theta)
{
if (__isnan(__theta))
return std::numeric_limits<_Tp>::quiet_NaN();
*/
template <typename _Tp>
void
- __bessel_ik(const _Tp __nu, const _Tp __x,
+ __bessel_ik(_Tp __nu, _Tp __x,
_Tp & __Inu, _Tp & __Knu, _Tp & __Ipnu, _Tp & __Kpnu)
{
if (__x == _Tp(0))
}
if (__i > __max_iter)
std::__throw_runtime_error(__N("Argument x too large "
- "in __bessel_jn; "
+ "in __bessel_ik; "
"try asymptotic expansion."));
_Tp __Inul = __fp_min;
_Tp __Ipnul = __h * __Inul;
}
if (__i > __max_iter)
std::__throw_runtime_error(__N("Bessel k series failed to converge "
- "in __bessel_jn."));
+ "in __bessel_ik."));
__Kmu = __sum;
__Knu1 = __sum1 * __xi2;
}
}
if (__i > __max_iter)
std::__throw_runtime_error(__N("Steed's method failed "
- "in __bessel_jn."));
+ "in __bessel_ik."));
__h = __a1 * __h;
__Kmu = std::sqrt(__numeric_constants<_Tp>::__pi() / (_Tp(2) * __x))
* std::exp(-__x) / __s;
*/
template<typename _Tp>
_Tp
- __cyl_bessel_i(const _Tp __nu, const _Tp __x)
+ __cyl_bessel_i(_Tp __nu, _Tp __x)
{
if (__nu < _Tp(0) || __x < _Tp(0))
std::__throw_domain_error(__N("Bad argument "
*/
template<typename _Tp>
_Tp
- __cyl_bessel_k(const _Tp __nu, const _Tp __x)
+ __cyl_bessel_k(_Tp __nu, _Tp __x)
{
if (__nu < _Tp(0) || __x < _Tp(0))
std::__throw_domain_error(__N("Bad argument "
*/
template <typename _Tp>
void
- __sph_bessel_ik(const unsigned int __n, const _Tp __x,
+ __sph_bessel_ik(unsigned int __n, _Tp __x,
_Tp & __i_n, _Tp & __k_n, _Tp & __ip_n, _Tp & __kp_n)
{
const _Tp __nu = _Tp(__n) + _Tp(0.5L);
*/
template <typename _Tp>
void
- __airy(const _Tp __x,
- _Tp & __Ai, _Tp & __Bi, _Tp & __Aip, _Tp & __Bip)
+ __airy(_Tp __x, _Tp & __Ai, _Tp & __Bi, _Tp & __Aip, _Tp & __Bip)
{
const _Tp __absx = std::abs(__x);
const _Tp __rootx = std::sqrt(__absx);
*/
template<typename _Tp>
_Tp
- __poly_hermite_recursion(const unsigned int __n, const _Tp __x)
+ __poly_hermite_recursion(unsigned int __n, _Tp __x)
{
// Compute H_0.
_Tp __H_0 = 1;
*/
template<typename _Tp>
inline _Tp
- __poly_hermite(const unsigned int __n, const _Tp __x)
+ __poly_hermite(unsigned int __n, _Tp __x)
{
if (__isnan(__x))
return std::numeric_limits<_Tp>::quiet_NaN();
*/
template<typename _Tpa, typename _Tp>
_Tp
- __poly_laguerre_large_n(const unsigned __n, const _Tpa __alpha1,
- const _Tp __x)
+ __poly_laguerre_large_n(unsigned __n, _Tpa __alpha1, _Tp __x)
{
const _Tp __a = -_Tp(__n);
const _Tp __b = _Tp(__alpha1) + _Tp(1);
*/
template<typename _Tpa, typename _Tp>
_Tp
- __poly_laguerre_hyperg(const unsigned int __n, const _Tpa __alpha1,
- const _Tp __x)
+ __poly_laguerre_hyperg(unsigned int __n, _Tpa __alpha1, _Tp __x)
{
const _Tp __b = _Tp(__alpha1) + _Tp(1);
const _Tp __mx = -__x;
*/
template<typename _Tpa, typename _Tp>
_Tp
- __poly_laguerre_recursion(const unsigned int __n,
- const _Tpa __alpha1, const _Tp __x)
+ __poly_laguerre_recursion(unsigned int __n, _Tpa __alpha1, _Tp __x)
{
// Compute l_0.
_Tp __l_0 = _Tp(1);
* degree @f$ \alpha @f$, and argument x.
*/
template<typename _Tpa, typename _Tp>
- inline _Tp
- __poly_laguerre(const unsigned int __n, const _Tpa __alpha1,
- const _Tp __x)
+ _Tp
+ __poly_laguerre(unsigned int __n, _Tpa __alpha1, _Tp __x)
{
if (__x < _Tp(0))
std::__throw_domain_error(__N("Negative argument "
*/
template<typename _Tp>
inline _Tp
- __assoc_laguerre(const unsigned int __n, const unsigned int __m,
- const _Tp __x)
- {
- return __poly_laguerre<unsigned int, _Tp>(__n, __m, __x);
- }
+ __assoc_laguerre(unsigned int __n, unsigned int __m, _Tp __x)
+ { return __poly_laguerre<unsigned int, _Tp>(__n, __m, __x); }
/**
*/
template<typename _Tp>
inline _Tp
- __laguerre(const unsigned int __n, const _Tp __x)
- {
- return __poly_laguerre<unsigned int, _Tp>(__n, 0, __x);
- }
+ __laguerre(unsigned int __n, _Tp __x)
+ { return __poly_laguerre<unsigned int, _Tp>(__n, 0, __x); }
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std::tr1::__detail
*/
template<typename _Tp>
_Tp
- __riemann_zeta_sum(const _Tp __s)
+ __riemann_zeta_sum(_Tp __s)
{
// A user shouldn't get to this.
if (__s < _Tp(1))
*/
template<typename _Tp>
_Tp
- __riemann_zeta_alt(const _Tp __s)
+ __riemann_zeta_alt(_Tp __s)
{
_Tp __sgn = _Tp(1);
_Tp __zeta = _Tp(0);
*/
template<typename _Tp>
_Tp
- __riemann_zeta_glob(const _Tp __s)
+ __riemann_zeta_glob(_Tp __s)
{
_Tp __zeta = _Tp(0);
*/
template<typename _Tp>
_Tp
- __riemann_zeta_product(const _Tp __s)
+ __riemann_zeta_product(_Tp __s)
{
static const _Tp __prime[] = {
_Tp(2), _Tp(3), _Tp(5), _Tp(7), _Tp(11), _Tp(13), _Tp(17), _Tp(19),
*/
template<typename _Tp>
_Tp
- __riemann_zeta(const _Tp __s)
+ __riemann_zeta(_Tp __s)
{
if (__isnan(__s))
return std::numeric_limits<_Tp>::quiet_NaN();
*/
template<typename _Tp>
_Tp
- __hurwitz_zeta_glob(const _Tp __a, const _Tp __s)
+ __hurwitz_zeta_glob(_Tp __a, _Tp __s)
{
_Tp __zeta = _Tp(0);
*/
template<typename _Tp>
inline _Tp
- __hurwitz_zeta(const _Tp __a, const _Tp __s)
- {
- return __hurwitz_zeta_glob(__a, __s);
- }
+ __hurwitz_zeta(_Tp __a, _Tp __s)
+ { return __hurwitz_zeta_glob(__a, __s); }
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std::tr1::__detail
/// out of intrinsics, this will disappear completely in favor of
/// std::isnan.
template<typename _Tp>
- inline bool __isnan(const _Tp __x)
- {
- return std::isnan(__x);
- }
+ inline bool __isnan(_Tp __x)
+ { return std::isnan(__x); }
#else
template<typename _Tp>
inline bool __isnan(const _Tp __x)
- {
- return __builtin_isnan(__x);
- }
+ { return __builtin_isnan(__x); }
template<>
- inline bool __isnan<float>(const float __x)
- {
- return __builtin_isnanf(__x);
- }
+ inline bool __isnan<float>(float __x)
+ { return __builtin_isnanf(__x); }
template<>
- inline bool __isnan<long double>(const long double __x)
- {
- return __builtin_isnanl(__x);
- }
+ inline bool __isnan<long double>(long double __x)
+ { return __builtin_isnanl(__x); }
#endif
--- /dev/null
+// 2013-02-08 Edward Smith-Rowland <3dw4rd@verizon.net>
+//
+// Copyright (C) 2013 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// PR libstdc++/56216 - Crash of Bessel functions at x==0!
+
+#include <testsuite_hooks.h>
+#include <tr1/cmath>
+
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ double j0 = std::tr1::cyl_bessel_j(0.0, 0.0);
+ double i0 = std::tr1::cyl_bessel_i(0.0, 0.0);
+ double j1 = std::tr1::cyl_bessel_j(1.0, 0.0);
+ double i1 = std::tr1::cyl_bessel_i(1.0, 0.0);
+
+ VERIFY(j0 == 1.0);
+ VERIFY(i0 == 1.0);
+ VERIFY(j1 == 0.0);
+ VERIFY(i1 == 0.0);
+}
+
+int
+main()
+{
+ test01();
+
+ return 0;
+}