1// Mathematical Special Functions for -*- C++ -*-
2
3// Copyright (C) 2006-2024 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file bits/specfun.h
26 * This is an internal header file, included by other library headers.
27 * Do not attempt to use it directly. @headername{cmath}
28 */
29
30#ifndef _GLIBCXX_BITS_SPECFUN_H
31#define _GLIBCXX_BITS_SPECFUN_H 1
32
33#include <bits/c++config.h>
34
35#define __glibcxx_want_math_spec_funcs
36#define __glibcxx_want_math_special_functions
37#include <bits/version.h>
38
39#if __cplusplus <= 201403L && __STDCPP_WANT_MATH_SPEC_FUNCS__ == 0
40# error include <cmath> and define __STDCPP_WANT_MATH_SPEC_FUNCS__
41#endif
42
43#include <bits/stl_algobase.h>
44#include <limits>
45#include <type_traits>
46
47#include <tr1/gamma.tcc>
48#include <tr1/bessel_function.tcc>
49#include <tr1/beta_function.tcc>
50#include <tr1/ell_integral.tcc>
51#include <tr1/exp_integral.tcc>
52#include <tr1/hypergeometric.tcc>
53#include <tr1/legendre_function.tcc>
54#include <tr1/modified_bessel_func.tcc>
55#include <tr1/poly_hermite.tcc>
56#include <tr1/poly_laguerre.tcc>
57#include <tr1/riemann_zeta.tcc>
58
59namespace std _GLIBCXX_VISIBILITY(default)
60{
61_GLIBCXX_BEGIN_NAMESPACE_VERSION
62
63 /**
64 * @defgroup mathsf Mathematical Special Functions
65 * @ingroup numerics
66 *
67 * @section mathsf_desc Mathematical Special Functions
68 *
69 * A collection of advanced mathematical special functions,
70 * defined by ISO/IEC IS 29124 and then added to ISO C++ 2017.
71 *
72 *
73 * @subsection mathsf_intro Introduction and History
74 * The first significant library upgrade on the road to C++2011,
75 * <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1836.pdf">
76 * TR1</a>, included a set of 23 mathematical functions that significantly
77 * extended the standard transcendental functions inherited from C and declared
78 * in @<cmath@>.
79 *
80 * Although most components from TR1 were eventually adopted for C++11 these
81 * math functions were left behind out of concern for implementability.
82 * The math functions were published as a separate international standard
83 * <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2010/n3060.pdf">
84 * IS 29124 - Extensions to the C++ Library to Support Mathematical Special
85 * Functions</a>.
86 *
87 * For C++17 these functions were incorporated into the main standard.
88 *
89 * @subsection mathsf_contents Contents
90 * The following functions are implemented in namespace @c std:
91 * - @ref assoc_laguerre "assoc_laguerre - Associated Laguerre functions"
92 * - @ref assoc_legendre "assoc_legendre - Associated Legendre functions"
93 * - @ref beta "beta - Beta functions"
94 * - @ref comp_ellint_1 "comp_ellint_1 - Complete elliptic functions of the first kind"
95 * - @ref comp_ellint_2 "comp_ellint_2 - Complete elliptic functions of the second kind"
96 * - @ref comp_ellint_3 "comp_ellint_3 - Complete elliptic functions of the third kind"
97 * - @ref cyl_bessel_i "cyl_bessel_i - Regular modified cylindrical Bessel functions"
98 * - @ref cyl_bessel_j "cyl_bessel_j - Cylindrical Bessel functions of the first kind"
99 * - @ref cyl_bessel_k "cyl_bessel_k - Irregular modified cylindrical Bessel functions"
100 * - @ref cyl_neumann "cyl_neumann - Cylindrical Neumann functions or Cylindrical Bessel functions of the second kind"
101 * - @ref ellint_1 "ellint_1 - Incomplete elliptic functions of the first kind"
102 * - @ref ellint_2 "ellint_2 - Incomplete elliptic functions of the second kind"
103 * - @ref ellint_3 "ellint_3 - Incomplete elliptic functions of the third kind"
104 * - @ref expint "expint - The exponential integral"
105 * - @ref hermite "hermite - Hermite polynomials"
106 * - @ref laguerre "laguerre - Laguerre functions"
107 * - @ref legendre "legendre - Legendre polynomials"
108 * - @ref riemann_zeta "riemann_zeta - The Riemann zeta function"
109 * - @ref sph_bessel "sph_bessel - Spherical Bessel functions"
110 * - @ref sph_legendre "sph_legendre - Spherical Legendre functions"
111 * - @ref sph_neumann "sph_neumann - Spherical Neumann functions"
112 *
113 * The hypergeometric functions were stricken from the TR29124 and C++17
114 * versions of this math library because of implementation concerns.
115 * However, since they were in the TR1 version and since they are popular
116 * we kept them as an extension in namespace @c __gnu_cxx:
117 * - @ref __gnu_cxx::conf_hyperg "conf_hyperg - Confluent hypergeometric functions"
118 * - @ref __gnu_cxx::hyperg "hyperg - Hypergeometric functions"
119 *
120 * <!-- @subsection mathsf_general General Features -->
121 *
122 * @subsection mathsf_promotion Argument Promotion
123 * The arguments suppled to the non-suffixed functions will be promoted
124 * according to the following rules:
125 * 1. If any argument intended to be floating point is given an integral value
126 * That integral value is promoted to double.
127 * 2. All floating point arguments are promoted up to the largest floating
128 * point precision among them.
129 *
130 * @subsection mathsf_NaN NaN Arguments
131 * If any of the floating point arguments supplied to these functions is
132 * invalid or NaN (std::numeric_limits<Tp>::quiet_NaN),
133 * the value NaN is returned.
134 *
135 * @subsection mathsf_impl Implementation
136 *
137 * We strive to implement the underlying math with type generic algorithms
138 * to the greatest extent possible. In practice, the functions are thin
139 * wrappers that dispatch to function templates. Type dependence is
140 * controlled with std::numeric_limits and functions thereof.
141 *
142 * We don't promote @c float to @c double or @c double to <tt>long double</tt>
143 * reflexively. The goal is for @c float functions to operate more quickly,
144 * at the cost of @c float accuracy and possibly a smaller domain of validity.
145 * Similaryly, <tt>long double</tt> should give you more dynamic range
146 * and slightly more pecision than @c double on many systems.
147 *
148 * @subsection mathsf_testing Testing
149 *
150 * These functions have been tested against equivalent implementations
151 * from the <a href="http://www.gnu.org/software/gsl">
152 * Gnu Scientific Library, GSL</a> and
153 * <a href="http://www.boost.org/doc/libs/1_60_0/libs/math/doc/html/index.html">Boost</a>
154 * and the ratio
155 * @f[
156 * \frac{|f - f_{test}|}{|f_{test}|}
157 * @f]
158 * is generally found to be within 10<sup>-15</sup> for 64-bit double on
159 * linux-x86_64 systems over most of the ranges of validity.
160 *
161 * @todo Provide accuracy comparisons on a per-function basis for a small
162 * number of targets.
163 *
164 * @subsection mathsf_bibliography General Bibliography
165 *
166 * @see Abramowitz and Stegun: Handbook of Mathematical Functions,
167 * with Formulas, Graphs, and Mathematical Tables
168 * Edited by Milton Abramowitz and Irene A. Stegun,
169 * National Bureau of Standards Applied Mathematics Series - 55
170 * Issued June 1964, Tenth Printing, December 1972, with corrections
171 * Electronic versions of A&S abound including both pdf and navigable html.
172 * @see for example http://people.math.sfu.ca/~cbm/aands/
173 *
174 * @see The old A&S has been redone as the
175 * NIST Digital Library of Mathematical Functions: http://dlmf.nist.gov/
176 * This version is far more navigable and includes more recent work.
177 *
178 * @see An Atlas of Functions: with Equator, the Atlas Function Calculator
179 * 2nd Edition, by Oldham, Keith B., Myland, Jan, Spanier, Jerome
180 *
181 * @see Asymptotics and Special Functions by Frank W. J. Olver,
182 * Academic Press, 1974
183 *
184 * @see Numerical Recipes in C, The Art of Scientific Computing,
185 * by William H. Press, Second Ed., Saul A. Teukolsky,
186 * William T. Vetterling, and Brian P. Flannery,
187 * Cambridge University Press, 1992
188 *
189 * @see The Special Functions and Their Approximations: Volumes 1 and 2,
190 * by Yudell L. Luke, Academic Press, 1969
191 *
192 * @{
193 */
194
195 // Associated Laguerre polynomials
196
197 /**
198 * Return the associated Laguerre polynomial of order @c n,
199 * degree @c m: @f$ L_n^m(x) @f$ for @c float argument.
200 *
201 * @see assoc_laguerre for more details.
202 */
203 inline float
204 assoc_laguerref(unsigned int __n, unsigned int __m, float __x)
205 { return __detail::__assoc_laguerre<float>(__n, __m, __x); }
206
207 /**
208 * Return the associated Laguerre polynomial of order @c n,
209 * degree @c m: @f$ L_n^m(x) @f$.
210 *
211 * @see assoc_laguerre for more details.
212 */
213 inline long double
214 assoc_laguerrel(unsigned int __n, unsigned int __m, long double __x)
215 { return __detail::__assoc_laguerre<long double>(__n, __m, __x); }
216
217 /**
218 * Return the associated Laguerre polynomial of nonnegative order @c n,
219 * nonnegative degree @c m and real argument @c x: @f$ L_n^m(x) @f$.
220 *
221 * The associated Laguerre function of real degree @f$ \alpha @f$,
222 * @f$ L_n^\alpha(x) @f$, is defined by
223 * @f[
224 * L_n^\alpha(x) = \frac{(\alpha + 1)_n}{n!}
225 * {}_1F_1(-n; \alpha + 1; x)
226 * @f]
227 * where @f$ (\alpha)_n @f$ is the Pochhammer symbol and
228 * @f$ {}_1F_1(a; c; x) @f$ is the confluent hypergeometric function.
229 *
230 * The associated Laguerre polynomial is defined for integral
231 * degree @f$ \alpha = m @f$ by:
232 * @f[
233 * L_n^m(x) = (-1)^m \frac{d^m}{dx^m} L_{n + m}(x)
234 * @f]
235 * where the Laguerre polynomial is defined by:
236 * @f[
237 * L_n(x) = \frac{e^x}{n!} \frac{d^n}{dx^n} (x^ne^{-x})
238 * @f]
239 * and @f$ x >= 0 @f$.
240 * @see laguerre for details of the Laguerre function of degree @c n
241 *
242 * @tparam _Tp The floating-point type of the argument @c __x.
243 * @param __n The order of the Laguerre function, <tt>__n >= 0</tt>.
244 * @param __m The degree of the Laguerre function, <tt>__m >= 0</tt>.
245 * @param __x The argument of the Laguerre function, <tt>__x >= 0</tt>.
246 * @throw std::domain_error if <tt>__x < 0</tt>.
247 */
248 template<typename _Tp>
249 inline typename __gnu_cxx::__promote<_Tp>::__type
250 assoc_laguerre(unsigned int __n, unsigned int __m, _Tp __x)
251 {
252 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
253 return __detail::__assoc_laguerre<__type>(__n, __m, __x);
254 }
255
256 // Associated Legendre functions
257
258 /**
259 * Return the associated Legendre function of degree @c l and order @c m
260 * for @c float argument.
261 *
262 * @see assoc_legendre for more details.
263 */
264 inline float
265 assoc_legendref(unsigned int __l, unsigned int __m, float __x)
266 { return __detail::__assoc_legendre_p<float>(__l, __m, __x); }
267
268 /**
269 * Return the associated Legendre function of degree @c l and order @c m.
270 *
271 * @see assoc_legendre for more details.
272 */
273 inline long double
274 assoc_legendrel(unsigned int __l, unsigned int __m, long double __x)
275 { return __detail::__assoc_legendre_p<long double>(__l, __m, __x); }
276
277
278 /**
279 * Return the associated Legendre function of degree @c l and order @c m.
280 *
281 * The associated Legendre function is derived from the Legendre function
282 * @f$ P_l(x) @f$ by the Rodrigues formula:
283 * @f[
284 * P_l^m(x) = (1 - x^2)^{m/2}\frac{d^m}{dx^m}P_l(x)
285 * @f]
286 * @see legendre for details of the Legendre function of degree @c l
287 *
288 * @tparam _Tp The floating-point type of the argument @c __x.
289 * @param __l The degree <tt>__l >= 0</tt>.
290 * @param __m The order <tt>__m <= l</tt>.
291 * @param __x The argument, <tt>abs(__x) <= 1</tt>.
292 * @throw std::domain_error if <tt>abs(__x) > 1</tt>.
293 */
294 template<typename _Tp>
295 inline typename __gnu_cxx::__promote<_Tp>::__type
296 assoc_legendre(unsigned int __l, unsigned int __m, _Tp __x)
297 {
298 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
299 return __detail::__assoc_legendre_p<__type>(__l, __m, __x);
300 }
301
302 // Beta functions
303
304 /**
305 * Return the beta function, @f$ B(a,b) @f$, for @c float parameters @c a, @c b.
306 *
307 * @see beta for more details.
308 */
309 inline float
310 betaf(float __a, float __b)
311 { return __detail::__beta<float>(x: __a, y: __b); }
312
313 /**
314 * Return the beta function, @f$B(a,b)@f$, for long double
315 * parameters @c a, @c b.
316 *
317 * @see beta for more details.
318 */
319 inline long double
320 betal(long double __a, long double __b)
321 { return __detail::__beta<long double>(x: __a, y: __b); }
322
323 /**
324 * Return the beta function, @f$B(a,b)@f$, for real parameters @c a, @c b.
325 *
326 * The beta function is defined by
327 * @f[
328 * B(a,b) = \int_0^1 t^{a - 1} (1 - t)^{b - 1} dt
329 * = \frac{\Gamma(a)\Gamma(b)}{\Gamma(a+b)}
330 * @f]
331 * where @f$ a > 0 @f$ and @f$ b > 0 @f$
332 *
333 * @tparam _Tpa The floating-point type of the parameter @c __a.
334 * @tparam _Tpb The floating-point type of the parameter @c __b.
335 * @param __a The first argument of the beta function, <tt> __a > 0 </tt>.
336 * @param __b The second argument of the beta function, <tt> __b > 0 </tt>.
337 * @throw std::domain_error if <tt> __a < 0 </tt> or <tt> __b < 0 </tt>.
338 */
339 template<typename _Tpa, typename _Tpb>
340 inline typename __gnu_cxx::__promote_2<_Tpa, _Tpb>::__type
341 beta(_Tpa __a, _Tpb __b)
342 {
343 typedef typename __gnu_cxx::__promote_2<_Tpa, _Tpb>::__type __type;
344 return __detail::__beta<__type>(__a, __b);
345 }
346
347 // Complete elliptic integrals of the first kind
348
349 /**
350 * Return the complete elliptic integral of the first kind @f$ E(k) @f$
351 * for @c float modulus @c k.
352 *
353 * @see comp_ellint_1 for details.
354 */
355 inline float
356 comp_ellint_1f(float __k)
357 { return __detail::__comp_ellint_1<float>(__k); }
358
359 /**
360 * Return the complete elliptic integral of the first kind @f$ E(k) @f$
361 * for long double modulus @c k.
362 *
363 * @see comp_ellint_1 for details.
364 */
365 inline long double
366 comp_ellint_1l(long double __k)
367 { return __detail::__comp_ellint_1<long double>(__k); }
368
369 /**
370 * Return the complete elliptic integral of the first kind
371 * @f$ K(k) @f$ for real modulus @c k.
372 *
373 * The complete elliptic integral of the first kind is defined as
374 * @f[
375 * K(k) = F(k,\pi/2) = \int_0^{\pi/2}\frac{d\theta}
376 * {\sqrt{1 - k^2 sin^2\theta}}
377 * @f]
378 * where @f$ F(k,\phi) @f$ is the incomplete elliptic integral of the
379 * first kind and the modulus @f$ |k| <= 1 @f$.
380 * @see ellint_1 for details of the incomplete elliptic function
381 * of the first kind.
382 *
383 * @tparam _Tp The floating-point type of the modulus @c __k.
384 * @param __k The modulus, <tt> abs(__k) <= 1 </tt>
385 * @throw std::domain_error if <tt> abs(__k) > 1 </tt>.
386 */
387 template<typename _Tp>
388 inline typename __gnu_cxx::__promote<_Tp>::__type
389 comp_ellint_1(_Tp __k)
390 {
391 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
392 return __detail::__comp_ellint_1<__type>(__k);
393 }
394
395 // Complete elliptic integrals of the second kind
396
397 /**
398 * Return the complete elliptic integral of the second kind @f$ E(k) @f$
399 * for @c float modulus @c k.
400 *
401 * @see comp_ellint_2 for details.
402 */
403 inline float
404 comp_ellint_2f(float __k)
405 { return __detail::__comp_ellint_2<float>(__k); }
406
407 /**
408 * Return the complete elliptic integral of the second kind @f$ E(k) @f$
409 * for long double modulus @c k.
410 *
411 * @see comp_ellint_2 for details.
412 */
413 inline long double
414 comp_ellint_2l(long double __k)
415 { return __detail::__comp_ellint_2<long double>(__k); }
416
417 /**
418 * Return the complete elliptic integral of the second kind @f$ E(k) @f$
419 * for real modulus @c k.
420 *
421 * The complete elliptic integral of the second kind is defined as
422 * @f[
423 * E(k) = E(k,\pi/2) = \int_0^{\pi/2}\sqrt{1 - k^2 sin^2\theta}
424 * @f]
425 * where @f$ E(k,\phi) @f$ is the incomplete elliptic integral of the
426 * second kind and the modulus @f$ |k| <= 1 @f$.
427 * @see ellint_2 for details of the incomplete elliptic function
428 * of the second kind.
429 *
430 * @tparam _Tp The floating-point type of the modulus @c __k.
431 * @param __k The modulus, @c abs(__k) <= 1
432 * @throw std::domain_error if @c abs(__k) > 1.
433 */
434 template<typename _Tp>
435 inline typename __gnu_cxx::__promote<_Tp>::__type
436 comp_ellint_2(_Tp __k)
437 {
438 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
439 return __detail::__comp_ellint_2<__type>(__k);
440 }
441
442 // Complete elliptic integrals of the third kind
443
444 /**
445 * @brief Return the complete elliptic integral of the third kind
446 * @f$ \Pi(k,\nu) @f$ for @c float modulus @c k.
447 *
448 * @see comp_ellint_3 for details.
449 */
450 inline float
451 comp_ellint_3f(float __k, float __nu)
452 { return __detail::__comp_ellint_3<float>(__k, __nu); }
453
454 /**
455 * @brief Return the complete elliptic integral of the third kind
456 * @f$ \Pi(k,\nu) @f$ for <tt>long double</tt> modulus @c k.
457 *
458 * @see comp_ellint_3 for details.
459 */
460 inline long double
461 comp_ellint_3l(long double __k, long double __nu)
462 { return __detail::__comp_ellint_3<long double>(__k, __nu); }
463
464 /**
465 * Return the complete elliptic integral of the third kind
466 * @f$ \Pi(k,\nu) = \Pi(k,\nu,\pi/2) @f$ for real modulus @c k.
467 *
468 * The complete elliptic integral of the third kind is defined as
469 * @f[
470 * \Pi(k,\nu) = \Pi(k,\nu,\pi/2) = \int_0^{\pi/2}
471 * \frac{d\theta}
472 * {(1 - \nu \sin^2\theta)\sqrt{1 - k^2 \sin^2\theta}}
473 * @f]
474 * where @f$ \Pi(k,\nu,\phi) @f$ is the incomplete elliptic integral of the
475 * second kind and the modulus @f$ |k| <= 1 @f$.
476 * @see ellint_3 for details of the incomplete elliptic function
477 * of the third kind.
478 *
479 * @tparam _Tp The floating-point type of the modulus @c __k.
480 * @tparam _Tpn The floating-point type of the argument @c __nu.
481 * @param __k The modulus, @c abs(__k) <= 1
482 * @param __nu The argument
483 * @throw std::domain_error if @c abs(__k) > 1.
484 */
485 template<typename _Tp, typename _Tpn>
486 inline typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type
487 comp_ellint_3(_Tp __k, _Tpn __nu)
488 {
489 typedef typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type __type;
490 return __detail::__comp_ellint_3<__type>(__k, __nu);
491 }
492
493 // Regular modified cylindrical Bessel functions
494
495 /**
496 * Return the regular modified Bessel function @f$ I_{\nu}(x) @f$
497 * for @c float order @f$ \nu @f$ and argument @f$ x >= 0 @f$.
498 *
499 * @see cyl_bessel_i for setails.
500 */
501 inline float
502 cyl_bessel_if(float __nu, float __x)
503 { return __detail::__cyl_bessel_i<float>(__nu, __x); }
504
505 /**
506 * Return the regular modified Bessel function @f$ I_{\nu}(x) @f$
507 * for <tt>long double</tt> order @f$ \nu @f$ and argument @f$ x >= 0 @f$.
508 *
509 * @see cyl_bessel_i for setails.
510 */
511 inline long double
512 cyl_bessel_il(long double __nu, long double __x)
513 { return __detail::__cyl_bessel_i<long double>(__nu, __x); }
514
515 /**
516 * Return the regular modified Bessel function @f$ I_{\nu}(x) @f$
517 * for real order @f$ \nu @f$ and argument @f$ x >= 0 @f$.
518 *
519 * The regular modified cylindrical Bessel function is:
520 * @f[
521 * I_{\nu}(x) = i^{-\nu}J_\nu(ix) = \sum_{k=0}^{\infty}
522 * \frac{(x/2)^{\nu + 2k}}{k!\Gamma(\nu+k+1)}
523 * @f]
524 *
525 * @tparam _Tpnu The floating-point type of the order @c __nu.
526 * @tparam _Tp The floating-point type of the argument @c __x.
527 * @param __nu The order
528 * @param __x The argument, <tt> __x >= 0 </tt>
529 * @throw std::domain_error if <tt> __x < 0 </tt>.
530 */
531 template<typename _Tpnu, typename _Tp>
532 inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
533 cyl_bessel_i(_Tpnu __nu, _Tp __x)
534 {
535 typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
536 return __detail::__cyl_bessel_i<__type>(__nu, __x);
537 }
538
539 // Cylindrical Bessel functions (of the first kind)
540
541 /**
542 * Return the Bessel function of the first kind @f$ J_{\nu}(x) @f$
543 * for @c float order @f$ \nu @f$ and argument @f$ x >= 0 @f$.
544 *
545 * @see cyl_bessel_j for setails.
546 */
547 inline float
548 cyl_bessel_jf(float __nu, float __x)
549 { return __detail::__cyl_bessel_j<float>(__nu, __x); }
550
551 /**
552 * Return the Bessel function of the first kind @f$ J_{\nu}(x) @f$
553 * for <tt>long double</tt> order @f$ \nu @f$ and argument @f$ x >= 0 @f$.
554 *
555 * @see cyl_bessel_j for setails.
556 */
557 inline long double
558 cyl_bessel_jl(long double __nu, long double __x)
559 { return __detail::__cyl_bessel_j<long double>(__nu, __x); }
560
561 /**
562 * Return the Bessel function @f$ J_{\nu}(x) @f$ of real order @f$ \nu @f$
563 * and argument @f$ x >= 0 @f$.
564 *
565 * The cylindrical Bessel function is:
566 * @f[
567 * J_{\nu}(x) = \sum_{k=0}^{\infty}
568 * \frac{(-1)^k (x/2)^{\nu + 2k}}{k!\Gamma(\nu+k+1)}
569 * @f]
570 *
571 * @tparam _Tpnu The floating-point type of the order @c __nu.
572 * @tparam _Tp The floating-point type of the argument @c __x.
573 * @param __nu The order
574 * @param __x The argument, <tt> __x >= 0 </tt>
575 * @throw std::domain_error if <tt> __x < 0 </tt>.
576 */
577 template<typename _Tpnu, typename _Tp>
578 inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
579 cyl_bessel_j(_Tpnu __nu, _Tp __x)
580 {
581 typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
582 return __detail::__cyl_bessel_j<__type>(__nu, __x);
583 }
584
585 // Irregular modified cylindrical Bessel functions
586
587 /**
588 * Return the irregular modified Bessel function @f$ K_{\nu}(x) @f$
589 * for @c float order @f$ \nu @f$ and argument @f$ x >= 0 @f$.
590 *
591 * @see cyl_bessel_k for setails.
592 */
593 inline float
594 cyl_bessel_kf(float __nu, float __x)
595 { return __detail::__cyl_bessel_k<float>(__nu, __x); }
596
597 /**
598 * Return the irregular modified Bessel function @f$ K_{\nu}(x) @f$
599 * for <tt>long double</tt> order @f$ \nu @f$ and argument @f$ x >= 0 @f$.
600 *
601 * @see cyl_bessel_k for setails.
602 */
603 inline long double
604 cyl_bessel_kl(long double __nu, long double __x)
605 { return __detail::__cyl_bessel_k<long double>(__nu, __x); }
606
607 /**
608 * Return the irregular modified Bessel function @f$ K_{\nu}(x) @f$
609 * of real order @f$ \nu @f$ and argument @f$ x @f$.
610 *
611 * The irregular modified Bessel function is defined by:
612 * @f[
613 * K_{\nu}(x) = \frac{\pi}{2}
614 * \frac{I_{-\nu}(x) - I_{\nu}(x)}{\sin \nu\pi}
615 * @f]
616 * where for integral @f$ \nu = n @f$ a limit is taken:
617 * @f$ lim_{\nu \to n} @f$.
618 * For negative argument we have simply:
619 * @f[
620 * K_{-\nu}(x) = K_{\nu}(x)
621 * @f]
622 *
623 * @tparam _Tpnu The floating-point type of the order @c __nu.
624 * @tparam _Tp The floating-point type of the argument @c __x.
625 * @param __nu The order
626 * @param __x The argument, <tt> __x >= 0 </tt>
627 * @throw std::domain_error if <tt> __x < 0 </tt>.
628 */
629 template<typename _Tpnu, typename _Tp>
630 inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
631 cyl_bessel_k(_Tpnu __nu, _Tp __x)
632 {
633 typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
634 return __detail::__cyl_bessel_k<__type>(__nu, __x);
635 }
636
637 // Cylindrical Neumann functions
638
639 /**
640 * Return the Neumann function @f$ N_{\nu}(x) @f$
641 * of @c float order @f$ \nu @f$ and argument @f$ x @f$.
642 *
643 * @see cyl_neumann for setails.
644 */
645 inline float
646 cyl_neumannf(float __nu, float __x)
647 { return __detail::__cyl_neumann_n<float>(__nu, __x); }
648
649 /**
650 * Return the Neumann function @f$ N_{\nu}(x) @f$
651 * of <tt>long double</tt> order @f$ \nu @f$ and argument @f$ x @f$.
652 *
653 * @see cyl_neumann for setails.
654 */
655 inline long double
656 cyl_neumannl(long double __nu, long double __x)
657 { return __detail::__cyl_neumann_n<long double>(__nu, __x); }
658
659 /**
660 * Return the Neumann function @f$ N_{\nu}(x) @f$
661 * of real order @f$ \nu @f$ and argument @f$ x >= 0 @f$.
662 *
663 * The Neumann function is defined by:
664 * @f[
665 * N_{\nu}(x) = \frac{J_{\nu}(x) \cos \nu\pi - J_{-\nu}(x)}
666 * {\sin \nu\pi}
667 * @f]
668 * where @f$ x >= 0 @f$ and for integral order @f$ \nu = n @f$
669 * a limit is taken: @f$ lim_{\nu \to n} @f$.
670 *
671 * @tparam _Tpnu The floating-point type of the order @c __nu.
672 * @tparam _Tp The floating-point type of the argument @c __x.
673 * @param __nu The order
674 * @param __x The argument, <tt> __x >= 0 </tt>
675 * @throw std::domain_error if <tt> __x < 0 </tt>.
676 */
677 template<typename _Tpnu, typename _Tp>
678 inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
679 cyl_neumann(_Tpnu __nu, _Tp __x)
680 {
681 typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
682 return __detail::__cyl_neumann_n<__type>(__nu, __x);
683 }
684
685 // Incomplete elliptic integrals of the first kind
686
687 /**
688 * Return the incomplete elliptic integral of the first kind @f$ E(k,\phi) @f$
689 * for @c float modulus @f$ k @f$ and angle @f$ \phi @f$.
690 *
691 * @see ellint_1 for details.
692 */
693 inline float
694 ellint_1f(float __k, float __phi)
695 { return __detail::__ellint_1<float>(__k, __phi); }
696
697 /**
698 * Return the incomplete elliptic integral of the first kind @f$ E(k,\phi) @f$
699 * for <tt>long double</tt> modulus @f$ k @f$ and angle @f$ \phi @f$.
700 *
701 * @see ellint_1 for details.
702 */
703 inline long double
704 ellint_1l(long double __k, long double __phi)
705 { return __detail::__ellint_1<long double>(__k, __phi); }
706
707 /**
708 * Return the incomplete elliptic integral of the first kind @f$ F(k,\phi) @f$
709 * for @c real modulus @f$ k @f$ and angle @f$ \phi @f$.
710 *
711 * The incomplete elliptic integral of the first kind is defined as
712 * @f[
713 * F(k,\phi) = \int_0^{\phi}\frac{d\theta}
714 * {\sqrt{1 - k^2 sin^2\theta}}
715 * @f]
716 * For @f$ \phi= \pi/2 @f$ this becomes the complete elliptic integral of
717 * the first kind, @f$ K(k) @f$. @see comp_ellint_1.
718 *
719 * @tparam _Tp The floating-point type of the modulus @c __k.
720 * @tparam _Tpp The floating-point type of the angle @c __phi.
721 * @param __k The modulus, <tt> abs(__k) <= 1 </tt>
722 * @param __phi The integral limit argument in radians
723 * @throw std::domain_error if <tt> abs(__k) > 1 </tt>.
724 */
725 template<typename _Tp, typename _Tpp>
726 inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type
727 ellint_1(_Tp __k, _Tpp __phi)
728 {
729 typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type;
730 return __detail::__ellint_1<__type>(__k, __phi);
731 }
732
733 // Incomplete elliptic integrals of the second kind
734
735 /**
736 * @brief Return the incomplete elliptic integral of the second kind
737 * @f$ E(k,\phi) @f$ for @c float argument.
738 *
739 * @see ellint_2 for details.
740 */
741 inline float
742 ellint_2f(float __k, float __phi)
743 { return __detail::__ellint_2<float>(__k, __phi); }
744
745 /**
746 * @brief Return the incomplete elliptic integral of the second kind
747 * @f$ E(k,\phi) @f$.
748 *
749 * @see ellint_2 for details.
750 */
751 inline long double
752 ellint_2l(long double __k, long double __phi)
753 { return __detail::__ellint_2<long double>(__k, __phi); }
754
755 /**
756 * Return the incomplete elliptic integral of the second kind
757 * @f$ E(k,\phi) @f$.
758 *
759 * The incomplete elliptic integral of the second kind is defined as
760 * @f[
761 * E(k,\phi) = \int_0^{\phi} \sqrt{1 - k^2 sin^2\theta}
762 * @f]
763 * For @f$ \phi= \pi/2 @f$ this becomes the complete elliptic integral of
764 * the second kind, @f$ E(k) @f$. @see comp_ellint_2.
765 *
766 * @tparam _Tp The floating-point type of the modulus @c __k.
767 * @tparam _Tpp The floating-point type of the angle @c __phi.
768 * @param __k The modulus, <tt> abs(__k) <= 1 </tt>
769 * @param __phi The integral limit argument in radians
770 * @return The elliptic function of the second kind.
771 * @throw std::domain_error if <tt> abs(__k) > 1 </tt>.
772 */
773 template<typename _Tp, typename _Tpp>
774 inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type
775 ellint_2(_Tp __k, _Tpp __phi)
776 {
777 typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type;
778 return __detail::__ellint_2<__type>(__k, __phi);
779 }
780
781 // Incomplete elliptic integrals of the third kind
782
783 /**
784 * @brief Return the incomplete elliptic integral of the third kind
785 * @f$ \Pi(k,\nu,\phi) @f$ for @c float argument.
786 *
787 * @see ellint_3 for details.
788 */
789 inline float
790 ellint_3f(float __k, float __nu, float __phi)
791 { return __detail::__ellint_3<float>(__k, __nu, __phi); }
792
793 /**
794 * @brief Return the incomplete elliptic integral of the third kind
795 * @f$ \Pi(k,\nu,\phi) @f$.
796 *
797 * @see ellint_3 for details.
798 */
799 inline long double
800 ellint_3l(long double __k, long double __nu, long double __phi)
801 { return __detail::__ellint_3<long double>(__k, __nu, __phi); }
802
803 /**
804 * @brief Return the incomplete elliptic integral of the third kind
805 * @f$ \Pi(k,\nu,\phi) @f$.
806 *
807 * The incomplete elliptic integral of the third kind is defined by:
808 * @f[
809 * \Pi(k,\nu,\phi) = \int_0^{\phi}
810 * \frac{d\theta}
811 * {(1 - \nu \sin^2\theta)
812 * \sqrt{1 - k^2 \sin^2\theta}}
813 * @f]
814 * For @f$ \phi= \pi/2 @f$ this becomes the complete elliptic integral of
815 * the third kind, @f$ \Pi(k,\nu) @f$. @see comp_ellint_3.
816 *
817 * @tparam _Tp The floating-point type of the modulus @c __k.
818 * @tparam _Tpn The floating-point type of the argument @c __nu.
819 * @tparam _Tpp The floating-point type of the angle @c __phi.
820 * @param __k The modulus, <tt> abs(__k) <= 1 </tt>
821 * @param __nu The second argument
822 * @param __phi The integral limit argument in radians
823 * @return The elliptic function of the third kind.
824 * @throw std::domain_error if <tt> abs(__k) > 1 </tt>.
825 */
826 template<typename _Tp, typename _Tpn, typename _Tpp>
827 inline typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type
828 ellint_3(_Tp __k, _Tpn __nu, _Tpp __phi)
829 {
830 typedef typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type __type;
831 return __detail::__ellint_3<__type>(__k, __nu, __phi);
832 }
833
834 // Exponential integrals
835
836 /**
837 * Return the exponential integral @f$ Ei(x) @f$ for @c float argument @c x.
838 *
839 * @see expint for details.
840 */
841 inline float
842 expintf(float __x)
843 { return __detail::__expint<float>(__x); }
844
845 /**
846 * Return the exponential integral @f$ Ei(x) @f$
847 * for <tt>long double</tt> argument @c x.
848 *
849 * @see expint for details.
850 */
851 inline long double
852 expintl(long double __x)
853 { return __detail::__expint<long double>(__x); }
854
855 /**
856 * Return the exponential integral @f$ Ei(x) @f$ for @c real argument @c x.
857 *
858 * The exponential integral is given by
859 * \f[
860 * Ei(x) = -\int_{-x}^\infty \frac{e^t}{t} dt
861 * \f]
862 *
863 * @tparam _Tp The floating-point type of the argument @c __x.
864 * @param __x The argument of the exponential integral function.
865 */
866 template<typename _Tp>
867 inline typename __gnu_cxx::__promote<_Tp>::__type
868 expint(_Tp __x)
869 {
870 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
871 return __detail::__expint<__type>(__x);
872 }
873
874 // Hermite polynomials
875
876 /**
877 * Return the Hermite polynomial @f$ H_n(x) @f$ of nonnegative order n
878 * and float argument @c x.
879 *
880 * @see hermite for details.
881 */
882 inline float
883 hermitef(unsigned int __n, float __x)
884 { return __detail::__poly_hermite<float>(__n, __x); }
885
886 /**
887 * Return the Hermite polynomial @f$ H_n(x) @f$ of nonnegative order n
888 * and <tt>long double</tt> argument @c x.
889 *
890 * @see hermite for details.
891 */
892 inline long double
893 hermitel(unsigned int __n, long double __x)
894 { return __detail::__poly_hermite<long double>(__n, __x); }
895
896 /**
897 * Return the Hermite polynomial @f$ H_n(x) @f$ of order n
898 * and @c real argument @c x.
899 *
900 * The Hermite polynomial is defined by:
901 * @f[
902 * H_n(x) = (-1)^n e^{x^2} \frac{d^n}{dx^n} e^{-x^2}
903 * @f]
904 *
905 * The Hermite polynomial obeys a reflection formula:
906 * @f[
907 * H_n(-x) = (-1)^n H_n(x)
908 * @f]
909 *
910 * @tparam _Tp The floating-point type of the argument @c __x.
911 * @param __n The order
912 * @param __x The argument
913 */
914 template<typename _Tp>
915 inline typename __gnu_cxx::__promote<_Tp>::__type
916 hermite(unsigned int __n, _Tp __x)
917 {
918 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
919 return __detail::__poly_hermite<__type>(__n, __x);
920 }
921
922 // Laguerre polynomials
923
924 /**
925 * Returns the Laguerre polynomial @f$ L_n(x) @f$ of nonnegative degree @c n
926 * and @c float argument @f$ x >= 0 @f$.
927 *
928 * @see laguerre for more details.
929 */
930 inline float
931 laguerref(unsigned int __n, float __x)
932 { return __detail::__laguerre<float>(__n, __x); }
933
934 /**
935 * Returns the Laguerre polynomial @f$ L_n(x) @f$ of nonnegative degree @c n
936 * and <tt>long double</tt> argument @f$ x >= 0 @f$.
937 *
938 * @see laguerre for more details.
939 */
940 inline long double
941 laguerrel(unsigned int __n, long double __x)
942 { return __detail::__laguerre<long double>(__n, __x); }
943
944 /**
945 * Returns the Laguerre polynomial @f$ L_n(x) @f$
946 * of nonnegative degree @c n and real argument @f$ x >= 0 @f$.
947 *
948 * The Laguerre polynomial is defined by:
949 * @f[
950 * L_n(x) = \frac{e^x}{n!} \frac{d^n}{dx^n} (x^ne^{-x})
951 * @f]
952 *
953 * @tparam _Tp The floating-point type of the argument @c __x.
954 * @param __n The nonnegative order
955 * @param __x The argument <tt> __x >= 0 </tt>
956 * @throw std::domain_error if <tt> __x < 0 </tt>.
957 */
958 template<typename _Tp>
959 inline typename __gnu_cxx::__promote<_Tp>::__type
960 laguerre(unsigned int __n, _Tp __x)
961 {
962 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
963 return __detail::__laguerre<__type>(__n, __x);
964 }
965
966 // Legendre polynomials
967
968 /**
969 * Return the Legendre polynomial @f$ P_l(x) @f$ of nonnegative
970 * degree @f$ l @f$ and @c float argument @f$ |x| <= 0 @f$.
971 *
972 * @see legendre for more details.
973 */
974 inline float
975 legendref(unsigned int __l, float __x)
976 { return __detail::__poly_legendre_p<float>(__l, __x); }
977
978 /**
979 * Return the Legendre polynomial @f$ P_l(x) @f$ of nonnegative
980 * degree @f$ l @f$ and <tt>long double</tt> argument @f$ |x| <= 0 @f$.
981 *
982 * @see legendre for more details.
983 */
984 inline long double
985 legendrel(unsigned int __l, long double __x)
986 { return __detail::__poly_legendre_p<long double>(__l, __x); }
987
988 /**
989 * Return the Legendre polynomial @f$ P_l(x) @f$ of nonnegative
990 * degree @f$ l @f$ and real argument @f$ |x| <= 0 @f$.
991 *
992 * The Legendre function of order @f$ l @f$ and argument @f$ x @f$,
993 * @f$ P_l(x) @f$, is defined by:
994 * @f[
995 * P_l(x) = \frac{1}{2^l l!}\frac{d^l}{dx^l}(x^2 - 1)^{l}
996 * @f]
997 *
998 * @tparam _Tp The floating-point type of the argument @c __x.
999 * @param __l The degree @f$ l >= 0 @f$
1000 * @param __x The argument @c abs(__x) <= 1
1001 * @throw std::domain_error if @c abs(__x) > 1
1002 */
1003 template<typename _Tp>
1004 inline typename __gnu_cxx::__promote<_Tp>::__type
1005 legendre(unsigned int __l, _Tp __x)
1006 {
1007 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1008 return __detail::__poly_legendre_p<__type>(__l, __x);
1009 }
1010
1011 // Riemann zeta functions
1012
1013 /**
1014 * Return the Riemann zeta function @f$ \zeta(s) @f$
1015 * for @c float argument @f$ s @f$.
1016 *
1017 * @see riemann_zeta for more details.
1018 */
1019 inline float
1020 riemann_zetaf(float __s)
1021 { return __detail::__riemann_zeta<float>(__s); }
1022
1023 /**
1024 * Return the Riemann zeta function @f$ \zeta(s) @f$
1025 * for <tt>long double</tt> argument @f$ s @f$.
1026 *
1027 * @see riemann_zeta for more details.
1028 */
1029 inline long double
1030 riemann_zetal(long double __s)
1031 { return __detail::__riemann_zeta<long double>(__s); }
1032
1033 /**
1034 * Return the Riemann zeta function @f$ \zeta(s) @f$
1035 * for real argument @f$ s @f$.
1036 *
1037 * The Riemann zeta function is defined by:
1038 * @f[
1039 * \zeta(s) = \sum_{k=1}^{\infty} k^{-s} \hbox{ for } s > 1
1040 * @f]
1041 * and
1042 * @f[
1043 * \zeta(s) = \frac{1}{1-2^{1-s}}\sum_{k=1}^{\infty}(-1)^{k-1}k^{-s}
1044 * \hbox{ for } 0 <= s <= 1
1045 * @f]
1046 * For s < 1 use the reflection formula:
1047 * @f[
1048 * \zeta(s) = 2^s \pi^{s-1} \sin(\frac{\pi s}{2}) \Gamma(1-s) \zeta(1-s)
1049 * @f]
1050 *
1051 * @tparam _Tp The floating-point type of the argument @c __s.
1052 * @param __s The argument <tt> s != 1 </tt>
1053 */
1054 template<typename _Tp>
1055 inline typename __gnu_cxx::__promote<_Tp>::__type
1056 riemann_zeta(_Tp __s)
1057 {
1058 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1059 return __detail::__riemann_zeta<__type>(__s);
1060 }
1061
1062 // Spherical Bessel functions
1063
1064 /**
1065 * Return the spherical Bessel function @f$ j_n(x) @f$ of nonnegative order n
1066 * and @c float argument @f$ x >= 0 @f$.
1067 *
1068 * @see sph_bessel for more details.
1069 */
1070 inline float
1071 sph_besself(unsigned int __n, float __x)
1072 { return __detail::__sph_bessel<float>(__n, __x); }
1073
1074 /**
1075 * Return the spherical Bessel function @f$ j_n(x) @f$ of nonnegative order n
1076 * and <tt>long double</tt> argument @f$ x >= 0 @f$.
1077 *
1078 * @see sph_bessel for more details.
1079 */
1080 inline long double
1081 sph_bessell(unsigned int __n, long double __x)
1082 { return __detail::__sph_bessel<long double>(__n, __x); }
1083
1084 /**
1085 * Return the spherical Bessel function @f$ j_n(x) @f$ of nonnegative order n
1086 * and real argument @f$ x >= 0 @f$.
1087 *
1088 * The spherical Bessel function is defined by:
1089 * @f[
1090 * j_n(x) = \left(\frac{\pi}{2x} \right) ^{1/2} J_{n+1/2}(x)
1091 * @f]
1092 *
1093 * @tparam _Tp The floating-point type of the argument @c __x.
1094 * @param __n The integral order <tt> n >= 0 </tt>
1095 * @param __x The real argument <tt> x >= 0 </tt>
1096 * @throw std::domain_error if <tt> __x < 0 </tt>.
1097 */
1098 template<typename _Tp>
1099 inline typename __gnu_cxx::__promote<_Tp>::__type
1100 sph_bessel(unsigned int __n, _Tp __x)
1101 {
1102 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1103 return __detail::__sph_bessel<__type>(__n, __x);
1104 }
1105
1106 // Spherical associated Legendre functions
1107
1108 /**
1109 * Return the spherical Legendre function of nonnegative integral
1110 * degree @c l and order @c m and float angle @f$ \theta @f$ in radians.
1111 *
1112 * @see sph_legendre for details.
1113 */
1114 inline float
1115 sph_legendref(unsigned int __l, unsigned int __m, float __theta)
1116 { return __detail::__sph_legendre<float>(__l, __m, __theta); }
1117
1118 /**
1119 * Return the spherical Legendre function of nonnegative integral
1120 * degree @c l and order @c m and <tt>long double</tt> angle @f$ \theta @f$
1121 * in radians.
1122 *
1123 * @see sph_legendre for details.
1124 */
1125 inline long double
1126 sph_legendrel(unsigned int __l, unsigned int __m, long double __theta)
1127 { return __detail::__sph_legendre<long double>(__l, __m, __theta); }
1128
1129 /**
1130 * Return the spherical Legendre function of nonnegative integral
1131 * degree @c l and order @c m and real angle @f$ \theta @f$ in radians.
1132 *
1133 * The spherical Legendre function is defined by
1134 * @f[
1135 * Y_l^m(\theta,\phi) = (-1)^m[\frac{(2l+1)}{4\pi}
1136 * \frac{(l-m)!}{(l+m)!}]
1137 * P_l^m(\cos\theta) \exp^{im\phi}
1138 * @f]
1139 *
1140 * @tparam _Tp The floating-point type of the angle @c __theta.
1141 * @param __l The order <tt> __l >= 0 </tt>
1142 * @param __m The degree <tt> __m >= 0 </tt> and <tt> __m <= __l </tt>
1143 * @param __theta The radian polar angle argument
1144 */
1145 template<typename _Tp>
1146 inline typename __gnu_cxx::__promote<_Tp>::__type
1147 sph_legendre(unsigned int __l, unsigned int __m, _Tp __theta)
1148 {
1149 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1150 return __detail::__sph_legendre<__type>(__l, __m, __theta);
1151 }
1152
1153 // Spherical Neumann functions
1154
1155 /**
1156 * Return the spherical Neumann function of integral order @f$ n >= 0 @f$
1157 * and @c float argument @f$ x >= 0 @f$.
1158 *
1159 * @see sph_neumann for details.
1160 */
1161 inline float
1162 sph_neumannf(unsigned int __n, float __x)
1163 { return __detail::__sph_neumann<float>(__n, __x); }
1164
1165 /**
1166 * Return the spherical Neumann function of integral order @f$ n >= 0 @f$
1167 * and <tt>long double</tt> @f$ x >= 0 @f$.
1168 *
1169 * @see sph_neumann for details.
1170 */
1171 inline long double
1172 sph_neumannl(unsigned int __n, long double __x)
1173 { return __detail::__sph_neumann<long double>(__n, __x); }
1174
1175 /**
1176 * Return the spherical Neumann function of integral order @f$ n >= 0 @f$
1177 * and real argument @f$ x >= 0 @f$.
1178 *
1179 * The spherical Neumann function is defined by
1180 * @f[
1181 * n_n(x) = \left(\frac{\pi}{2x} \right) ^{1/2} N_{n+1/2}(x)
1182 * @f]
1183 *
1184 * @tparam _Tp The floating-point type of the argument @c __x.
1185 * @param __n The integral order <tt> n >= 0 </tt>
1186 * @param __x The real argument <tt> __x >= 0 </tt>
1187 * @throw std::domain_error if <tt> __x < 0 </tt>.
1188 */
1189 template<typename _Tp>
1190 inline typename __gnu_cxx::__promote<_Tp>::__type
1191 sph_neumann(unsigned int __n, _Tp __x)
1192 {
1193 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1194 return __detail::__sph_neumann<__type>(__n, __x);
1195 }
1196
1197 /// @} group mathsf
1198
1199_GLIBCXX_END_NAMESPACE_VERSION
1200} // namespace std
1201
1202#ifndef __STRICT_ANSI__
1203namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
1204{
1205_GLIBCXX_BEGIN_NAMESPACE_VERSION
1206
1207 /** @addtogroup mathsf
1208 * @{
1209 */
1210
1211 // Airy functions
1212
1213 /**
1214 * Return the Airy function @f$ Ai(x) @f$ of @c float argument x.
1215 */
1216 inline float
1217 airy_aif(float __x)
1218 {
1219 float __Ai, __Bi, __Aip, __Bip;
1220 std::__detail::__airy<float>(__x, __Ai, __Bi, __Aip, __Bip);
1221 return __Ai;
1222 }
1223
1224 /**
1225 * Return the Airy function @f$ Ai(x) @f$ of <tt>long double</tt> argument x.
1226 */
1227 inline long double
1228 airy_ail(long double __x)
1229 {
1230 long double __Ai, __Bi, __Aip, __Bip;
1231 std::__detail::__airy<long double>(__x, __Ai, __Bi, __Aip, __Bip);
1232 return __Ai;
1233 }
1234
1235 /**
1236 * Return the Airy function @f$ Ai(x) @f$ of real argument x.
1237 */
1238 template<typename _Tp>
1239 inline typename __gnu_cxx::__promote<_Tp>::__type
1240 airy_ai(_Tp __x)
1241 {
1242 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1243 __type __Ai, __Bi, __Aip, __Bip;
1244 std::__detail::__airy<__type>(__x, __Ai, __Bi, __Aip, __Bip);
1245 return __Ai;
1246 }
1247
1248 /**
1249 * Return the Airy function @f$ Bi(x) @f$ of @c float argument x.
1250 */
1251 inline float
1252 airy_bif(float __x)
1253 {
1254 float __Ai, __Bi, __Aip, __Bip;
1255 std::__detail::__airy<float>(__x, __Ai, __Bi, __Aip, __Bip);
1256 return __Bi;
1257 }
1258
1259 /**
1260 * Return the Airy function @f$ Bi(x) @f$ of <tt>long double</tt> argument x.
1261 */
1262 inline long double
1263 airy_bil(long double __x)
1264 {
1265 long double __Ai, __Bi, __Aip, __Bip;
1266 std::__detail::__airy<long double>(__x, __Ai, __Bi, __Aip, __Bip);
1267 return __Bi;
1268 }
1269
1270 /**
1271 * Return the Airy function @f$ Bi(x) @f$ of real argument x.
1272 */
1273 template<typename _Tp>
1274 inline typename __gnu_cxx::__promote<_Tp>::__type
1275 airy_bi(_Tp __x)
1276 {
1277 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1278 __type __Ai, __Bi, __Aip, __Bip;
1279 std::__detail::__airy<__type>(__x, __Ai, __Bi, __Aip, __Bip);
1280 return __Bi;
1281 }
1282
1283 // Confluent hypergeometric functions
1284
1285 /**
1286 * Return the confluent hypergeometric function @f$ {}_1F_1(a;c;x) @f$
1287 * of @c float numeratorial parameter @c a, denominatorial parameter @c c,
1288 * and argument @c x.
1289 *
1290 * @see conf_hyperg for details.
1291 */
1292 inline float
1293 conf_hypergf(float __a, float __c, float __x)
1294 { return std::__detail::__conf_hyperg<float>(__a, __c, __x); }
1295
1296 /**
1297 * Return the confluent hypergeometric function @f$ {}_1F_1(a;c;x) @f$
1298 * of <tt>long double</tt> numeratorial parameter @c a,
1299 * denominatorial parameter @c c, and argument @c x.
1300 *
1301 * @see conf_hyperg for details.
1302 */
1303 inline long double
1304 conf_hypergl(long double __a, long double __c, long double __x)
1305 { return std::__detail::__conf_hyperg<long double>(__a, __c, __x); }
1306
1307 /**
1308 * Return the confluent hypergeometric function @f$ {}_1F_1(a;c;x) @f$
1309 * of real numeratorial parameter @c a, denominatorial parameter @c c,
1310 * and argument @c x.
1311 *
1312 * The confluent hypergeometric function is defined by
1313 * @f[
1314 * {}_1F_1(a;c;x) = \sum_{n=0}^{\infty} \frac{(a)_n x^n}{(c)_n n!}
1315 * @f]
1316 * where the Pochhammer symbol is @f$ (x)_k = (x)(x+1)...(x+k-1) @f$,
1317 * @f$ (x)_0 = 1 @f$
1318 *
1319 * @param __a The numeratorial parameter
1320 * @param __c The denominatorial parameter
1321 * @param __x The argument
1322 */
1323 template<typename _Tpa, typename _Tpc, typename _Tp>
1324 inline typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type
1325 conf_hyperg(_Tpa __a, _Tpc __c, _Tp __x)
1326 {
1327 typedef typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type __type;
1328 return std::__detail::__conf_hyperg<__type>(__a, __c, __x);
1329 }
1330
1331 // Hypergeometric functions
1332
1333 /**
1334 * Return the hypergeometric function @f$ {}_2F_1(a,b;c;x) @f$
1335 * of @ float numeratorial parameters @c a and @c b,
1336 * denominatorial parameter @c c, and argument @c x.
1337 *
1338 * @see hyperg for details.
1339 */
1340 inline float
1341 hypergf(float __a, float __b, float __c, float __x)
1342 { return std::__detail::__hyperg<float>(__a, __b, __c, __x); }
1343
1344 /**
1345 * Return the hypergeometric function @f$ {}_2F_1(a,b;c;x) @f$
1346 * of <tt>long double</tt> numeratorial parameters @c a and @c b,
1347 * denominatorial parameter @c c, and argument @c x.
1348 *
1349 * @see hyperg for details.
1350 */
1351 inline long double
1352 hypergl(long double __a, long double __b, long double __c, long double __x)
1353 { return std::__detail::__hyperg<long double>(__a, __b, __c, __x); }
1354
1355 /**
1356 * Return the hypergeometric function @f$ {}_2F_1(a,b;c;x) @f$
1357 * of real numeratorial parameters @c a and @c b,
1358 * denominatorial parameter @c c, and argument @c x.
1359 *
1360 * The hypergeometric function is defined by
1361 * @f[
1362 * {}_2F_1(a;c;x) = \sum_{n=0}^{\infty} \frac{(a)_n (b)_n x^n}{(c)_n n!}
1363 * @f]
1364 * where the Pochhammer symbol is @f$ (x)_k = (x)(x+1)...(x+k-1) @f$,
1365 * @f$ (x)_0 = 1 @f$
1366 *
1367 * @param __a The first numeratorial parameter
1368 * @param __b The second numeratorial parameter
1369 * @param __c The denominatorial parameter
1370 * @param __x The argument
1371 */
1372 template<typename _Tpa, typename _Tpb, typename _Tpc, typename _Tp>
1373 inline typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>::__type
1374 hyperg(_Tpa __a, _Tpb __b, _Tpc __c, _Tp __x)
1375 {
1376 typedef typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>
1377 ::__type __type;
1378 return std::__detail::__hyperg<__type>(__a, __b, __c, __x);
1379 }
1380
1381 /// @}
1382_GLIBCXX_END_NAMESPACE_VERSION
1383} // namespace __gnu_cxx
1384#endif // __STRICT_ANSI__
1385
1386#endif // _GLIBCXX_BITS_SPECFUN_H
1387