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