Import gcc-4.4.1
[dragonfly.git] / contrib / gcc-4.4 / libstdc++-v3 / include / tr1 / cmath
1 // TR1 cmath -*- C++ -*-
2
3 // Copyright (C) 2006, 2007, 2008, 2009 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 tr1/cmath
26  *  This is a TR1 C++ Library header. 
27  */
28
29 #ifndef _GLIBCXX_TR1_CMATH
30 #define _GLIBCXX_TR1_CMATH 1
31
32 #pragma GCC system_header
33
34 #if defined(_GLIBCXX_INCLUDE_AS_CXX0X)
35 #  error TR1 header cannot be included from C++0x header
36 #endif
37
38 #include <cmath>
39
40 #if defined(_GLIBCXX_INCLUDE_AS_TR1)
41 #  include <tr1_impl/cmath>
42 #else
43 #  define _GLIBCXX_INCLUDE_AS_TR1
44 #  define _GLIBCXX_BEGIN_NAMESPACE_TR1 namespace tr1 {
45 #  define _GLIBCXX_END_NAMESPACE_TR1 }
46 #  define _GLIBCXX_TR1 tr1::
47 #  include <tr1_impl/cmath>
48 #  undef _GLIBCXX_TR1
49 #  undef _GLIBCXX_END_NAMESPACE_TR1
50 #  undef _GLIBCXX_BEGIN_NAMESPACE_TR1
51 #  undef _GLIBCXX_INCLUDE_AS_TR1
52 #endif
53
54 namespace std
55 {
56 namespace tr1
57 {
58   // DR 550. What should the return type of pow(float,int) be?
59   // NB: C++0x and TR1 != C++03.
60   inline double
61   pow(double __x, double __y)
62   { return std::pow(__x, __y); }
63
64   inline float
65   pow(float __x, float __y)
66   { return std::pow(__x, __y); }
67
68   inline long double
69   pow(long double __x, long double __y)
70   { return std::pow(__x, __y); }
71
72   template<typename _Tp, typename _Up>
73     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
74     pow(_Tp __x, _Up __y)
75     {
76       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
77       return std::pow(__type(__x), __type(__y));
78     }
79 }
80 }
81
82 #include <bits/stl_algobase.h>
83 #include <limits>
84 #include <tr1/type_traits>
85
86 #include <tr1/gamma.tcc>
87 #include <tr1/bessel_function.tcc>
88 #include <tr1/beta_function.tcc>
89 #include <tr1/ell_integral.tcc>
90 #include <tr1/exp_integral.tcc>
91 #include <tr1/hypergeometric.tcc>
92 #include <tr1/legendre_function.tcc>
93 #include <tr1/modified_bessel_func.tcc>
94 #include <tr1/poly_hermite.tcc>
95 #include <tr1/poly_laguerre.tcc>
96 #include <tr1/riemann_zeta.tcc>
97
98 namespace std
99 {
100 namespace tr1
101 {
102   /**
103    * @defgroup tr1_math_spec_func Mathematical Special Functions
104    * @ingroup numerics
105    *
106    * A collection of advanced mathematical special functions.
107    * @{
108    */
109
110   inline float
111   assoc_laguerref(unsigned int __n, unsigned int __m, float __x)
112   { return __detail::__assoc_laguerre<float>(__n, __m, __x); }
113
114   inline long double
115   assoc_laguerrel(unsigned int __n, unsigned int __m, long double __x)
116   {
117     return __detail::__assoc_laguerre<long double>(__n, __m, __x);
118   }
119
120   ///  5.2.1.1  Associated Laguerre polynomials.
121   template<typename _Tp>
122     inline typename __gnu_cxx::__promote<_Tp>::__type
123     assoc_laguerre(unsigned int __n, unsigned int __m, _Tp __x)
124     {
125       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
126       return __detail::__assoc_laguerre<__type>(__n, __m, __x);
127     }
128
129   inline float
130   assoc_legendref(unsigned int __l, unsigned int __m, float __x)
131   { return __detail::__assoc_legendre_p<float>(__l, __m, __x); }
132
133   inline long double
134   assoc_legendrel(unsigned int __l, unsigned int __m, long double __x)
135   { return __detail::__assoc_legendre_p<long double>(__l, __m, __x); }
136
137   ///  5.2.1.2  Associated Legendre functions.
138   template<typename _Tp>
139     inline typename __gnu_cxx::__promote<_Tp>::__type
140     assoc_legendre(unsigned int __l, unsigned int __m, _Tp __x)
141     {
142       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
143       return __detail::__assoc_legendre_p<__type>(__l, __m, __x);
144     }
145
146   inline float
147   betaf(float __x, float __y)
148   { return __detail::__beta<float>(__x, __y); }
149
150   inline long double
151   betal(long double __x, long double __y)
152   { return __detail::__beta<long double>(__x, __y); }
153
154   ///  5.2.1.3  Beta functions.
155   template<typename _Tpx, typename _Tpy>
156     inline typename __gnu_cxx::__promote_2<_Tpx, _Tpy>::__type
157     beta(_Tpx __x, _Tpy __y)
158     {
159       typedef typename __gnu_cxx::__promote_2<_Tpx, _Tpy>::__type __type;
160       return __detail::__beta<__type>(__x, __y);
161     }
162
163   inline float
164   comp_ellint_1f(float __k)
165   { return __detail::__comp_ellint_1<float>(__k); }
166
167   inline long double
168   comp_ellint_1l(long double __k)
169   { return __detail::__comp_ellint_1<long double>(__k); }
170
171   ///  5.2.1.4  Complete elliptic integrals of the first kind.
172   template<typename _Tp>
173     inline typename __gnu_cxx::__promote<_Tp>::__type
174     comp_ellint_1(_Tp __k)
175     {
176       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
177       return __detail::__comp_ellint_1<__type>(__k);
178     }
179
180   inline float
181   comp_ellint_2f(float __k)
182   { return __detail::__comp_ellint_2<float>(__k); }
183
184   inline long double
185   comp_ellint_2l(long double __k)
186   { return __detail::__comp_ellint_2<long double>(__k); }
187
188   ///  5.2.1.5  Complete elliptic integrals of the second kind.
189   template<typename _Tp>
190     inline typename __gnu_cxx::__promote<_Tp>::__type
191     comp_ellint_2(_Tp __k)
192     {
193       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
194       return __detail::__comp_ellint_2<__type>(__k);
195     }
196
197   inline float
198   comp_ellint_3f(float __k, float __nu)
199   { return __detail::__comp_ellint_3<float>(__k, __nu); }
200
201   inline long double
202   comp_ellint_3l(long double __k, long double __nu)
203   { return __detail::__comp_ellint_3<long double>(__k, __nu); }
204
205   ///  5.2.1.6  Complete elliptic integrals of the third kind.
206   template<typename _Tp, typename _Tpn>
207     inline typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type
208     comp_ellint_3(_Tp __k, _Tpn __nu)
209     {
210       typedef typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type __type;
211       return __detail::__comp_ellint_3<__type>(__k, __nu);
212     }
213
214   inline float
215   conf_hypergf(float __a, float __c, float __x)
216   { return __detail::__conf_hyperg<float>(__a, __c, __x); }
217
218   inline long double
219   conf_hypergl(long double __a, long double __c, long double __x)
220   { return __detail::__conf_hyperg<long double>(__a, __c, __x); }
221
222   ///  5.2.1.7  Confluent hypergeometric functions.
223   template<typename _Tpa, typename _Tpc, typename _Tp>
224     inline typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type
225     conf_hyperg(_Tpa __a, _Tpc __c, _Tp __x)
226     {
227       typedef typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type __type;
228       return __detail::__conf_hyperg<__type>(__a, __c, __x);
229     }
230
231   inline float
232   cyl_bessel_if(float __nu, float __x)
233   { return __detail::__cyl_bessel_i<float>(__nu, __x); }
234
235   inline long double
236   cyl_bessel_il(long double __nu, long double __x)
237   { return __detail::__cyl_bessel_i<long double>(__nu, __x); }
238
239   ///  5.2.1.8  Regular modified cylindrical Bessel functions.
240   template<typename _Tpnu, typename _Tp>
241     inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
242     cyl_bessel_i(_Tpnu __nu, _Tp __x)
243     {
244       typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
245       return __detail::__cyl_bessel_i<__type>(__nu, __x);
246     }
247
248   inline float
249   cyl_bessel_jf(float __nu, float __x)
250   { return __detail::__cyl_bessel_j<float>(__nu, __x); }
251
252   inline long double
253   cyl_bessel_jl(long double __nu, long double __x)
254   { return __detail::__cyl_bessel_j<long double>(__nu, __x); }
255
256   ///  5.2.1.9  Cylindrical Bessel functions (of the first kind).
257   template<typename _Tpnu, typename _Tp>
258     inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
259     cyl_bessel_j(_Tpnu __nu, _Tp __x)
260     {
261       typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
262       return __detail::__cyl_bessel_j<__type>(__nu, __x);
263     }
264
265   inline float
266   cyl_bessel_kf(float __nu, float __x)
267   { return __detail::__cyl_bessel_k<float>(__nu, __x); }
268
269   inline long double
270   cyl_bessel_kl(long double __nu, long double __x)
271   { return __detail::__cyl_bessel_k<long double>(__nu, __x); }
272
273   ///  5.2.1.10  Irregular modified cylindrical Bessel functions.
274   template<typename _Tpnu, typename _Tp>
275     inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
276     cyl_bessel_k(_Tpnu __nu, _Tp __x)
277     {
278       typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
279       return __detail::__cyl_bessel_k<__type>(__nu, __x);
280     }
281
282   inline float
283   cyl_neumannf(float __nu, float __x)
284   { return __detail::__cyl_neumann_n<float>(__nu, __x); }
285
286   inline long double
287   cyl_neumannl(long double __nu, long double __x)
288   { return __detail::__cyl_neumann_n<long double>(__nu, __x); }
289
290   ///  5.2.1.11  Cylindrical Neumann functions.
291   template<typename _Tpnu, typename _Tp>
292     inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
293     cyl_neumann(_Tpnu __nu, _Tp __x)
294     {
295       typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
296       return __detail::__cyl_neumann_n<__type>(__nu, __x);
297     }
298
299   inline float
300   ellint_1f(float __k, float __phi)
301   { return __detail::__ellint_1<float>(__k, __phi); }
302
303   inline long double
304   ellint_1l(long double __k, long double __phi)
305   { return __detail::__ellint_1<long double>(__k, __phi); }
306
307   ///  5.2.1.12  Incomplete elliptic integrals of the first kind.
308   template<typename _Tp, typename _Tpp>
309     inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type
310     ellint_1(_Tp __k, _Tpp __phi)
311     {
312       typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type;
313       return __detail::__ellint_1<__type>(__k, __phi);
314     }
315
316   inline float
317   ellint_2f(float __k, float __phi)
318   { return __detail::__ellint_2<float>(__k, __phi); }
319
320   inline long double
321   ellint_2l(long double __k, long double __phi)
322   { return __detail::__ellint_2<long double>(__k, __phi); }
323
324   ///  5.2.1.13  Incomplete elliptic integrals of the second kind.
325   template<typename _Tp, typename _Tpp>
326     inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type
327     ellint_2(_Tp __k, _Tpp __phi)
328     {
329       typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type;
330       return __detail::__ellint_2<__type>(__k, __phi);
331     }
332
333   inline float
334   ellint_3f(float __k, float __nu, float __phi)
335   { return __detail::__ellint_3<float>(__k, __nu, __phi); }
336
337   inline long double
338   ellint_3l(long double __k, long double __nu, long double __phi)
339   { return __detail::__ellint_3<long double>(__k, __nu, __phi); }
340
341   ///  5.2.1.14  Incomplete elliptic integrals of the third kind.
342   template<typename _Tp, typename _Tpn, typename _Tpp>
343     inline typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type
344     ellint_3(_Tp __k, _Tpn __nu, _Tpp __phi)
345     {
346       typedef typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type __type;
347       return __detail::__ellint_3<__type>(__k, __nu, __phi);
348     }
349
350   inline float
351   expintf(float __x)
352   { return __detail::__expint<float>(__x); }
353
354   inline long double
355   expintl(long double __x)
356   { return __detail::__expint<long double>(__x); }
357
358   ///  5.2.1.15  Exponential integrals.
359   template<typename _Tp>
360     inline typename __gnu_cxx::__promote<_Tp>::__type
361     expint(_Tp __x)
362     {
363       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
364       return __detail::__expint<__type>(__x);
365     }
366
367   inline float
368   hermitef(unsigned int __n, float __x)
369   { return __detail::__poly_hermite<float>(__n, __x); }
370
371   inline long double
372   hermitel(unsigned int __n, long double __x)
373   { return __detail::__poly_hermite<long double>(__n, __x); }
374
375   ///  5.2.1.16  Hermite polynomials.
376   template<typename _Tp>
377     inline typename __gnu_cxx::__promote<_Tp>::__type
378     hermite(unsigned int __n, _Tp __x)
379     {
380       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
381       return __detail::__poly_hermite<__type>(__n, __x);
382     }
383
384   inline float
385   hypergf(float __a, float __b, float __c, float __x)
386   { return __detail::__hyperg<float>(__a, __b, __c, __x); }
387
388   inline long double
389   hypergl(long double __a, long double __b, long double __c, long double __x)
390   { return __detail::__hyperg<long double>(__a, __b, __c, __x); }
391
392   ///  5.2.1.17  Hypergeometric functions.
393   template<typename _Tpa, typename _Tpb, typename _Tpc, typename _Tp>
394     inline typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>::__type
395     hyperg(_Tpa __a, _Tpb __b, _Tpc __c, _Tp __x)
396     {
397       typedef typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>::__type __type;
398       return __detail::__hyperg<__type>(__a, __b, __c, __x);
399     }
400
401   inline float
402   laguerref(unsigned int __n, float __x)
403   { return __detail::__laguerre<float>(__n, __x); }
404
405   inline long double
406   laguerrel(unsigned int __n, long double __x)
407   { return __detail::__laguerre<long double>(__n, __x); }
408
409   ///  5.2.1.18  Laguerre polynomials.
410   template<typename _Tp>
411     inline typename __gnu_cxx::__promote<_Tp>::__type
412     laguerre(unsigned int __n, _Tp __x)
413     {
414       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
415       return __detail::__laguerre<__type>(__n, __x);
416     }
417
418   inline float
419   legendref(unsigned int __n, float __x)
420   { return __detail::__poly_legendre_p<float>(__n, __x); }
421
422   inline long double
423   legendrel(unsigned int __n, long double __x)
424   { return __detail::__poly_legendre_p<long double>(__n, __x); }
425
426   ///  5.2.1.19  Legendre polynomials.
427   template<typename _Tp>
428     inline typename __gnu_cxx::__promote<_Tp>::__type
429     legendre(unsigned int __n, _Tp __x)
430     {
431       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
432       return __detail::__poly_legendre_p<__type>(__n, __x);
433     }
434
435   inline float
436   riemann_zetaf(float __x)
437   { return __detail::__riemann_zeta<float>(__x); }
438
439   inline long double
440   riemann_zetal(long double __x)
441   { return __detail::__riemann_zeta<long double>(__x); }
442
443   ///  5.2.1.20  Riemann zeta function.
444   template<typename _Tp>
445     inline typename __gnu_cxx::__promote<_Tp>::__type
446     riemann_zeta(_Tp __x)
447     {
448       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
449       return __detail::__riemann_zeta<__type>(__x);
450     }
451
452   inline float
453   sph_besself(unsigned int __n, float __x)
454   { return __detail::__sph_bessel<float>(__n, __x); }
455
456   inline long double
457   sph_bessell(unsigned int __n, long double __x)
458   { return __detail::__sph_bessel<long double>(__n, __x); }
459
460   ///  5.2.1.21  Spherical Bessel functions.
461   template<typename _Tp>
462     inline typename __gnu_cxx::__promote<_Tp>::__type
463     sph_bessel(unsigned int __n, _Tp __x)
464     {
465       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
466       return __detail::__sph_bessel<__type>(__n, __x);
467     }
468
469   inline float
470   sph_legendref(unsigned int __l, unsigned int __m, float __theta)
471   { return __detail::__sph_legendre<float>(__l, __m, __theta); }
472
473   inline long double
474   sph_legendrel(unsigned int __l, unsigned int __m, long double __theta)
475   { return __detail::__sph_legendre<long double>(__l, __m, __theta); }
476
477   ///  5.2.1.22  Spherical associated Legendre functions.
478   template<typename _Tp>
479     inline typename __gnu_cxx::__promote<_Tp>::__type
480     sph_legendre(unsigned int __l, unsigned int __m, _Tp __theta)
481     {
482       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
483       return __detail::__sph_legendre<__type>(__l, __m, __theta);
484     }
485
486   inline float
487   sph_neumannf(unsigned int __n, float __x)
488   { return __detail::__sph_neumann<float>(__n, __x); }
489
490   inline long double
491   sph_neumannl(unsigned int __n, long double __x)
492   { return __detail::__sph_neumann<long double>(__n, __x); }
493
494   ///  5.2.1.23  Spherical Neumann functions.
495   template<typename _Tp>
496     inline typename __gnu_cxx::__promote<_Tp>::__type
497     sph_neumann(unsigned int __n, _Tp __x)
498     {
499       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
500       return __detail::__sph_neumann<__type>(__n, __x);
501     }
502
503   /* @} */ // tr1_math_spec_func
504 }
505 }
506
507 #endif // _GLIBCXX_TR1_CMATH