libstdc++
|
00001 // TR1 cmath -*- C++ -*- 00002 00003 // Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc. 00004 // 00005 // This file is part of the GNU ISO C++ Library. This library is free 00006 // software; you can redistribute it and/or modify it under the 00007 // terms of the GNU General Public License as published by the 00008 // Free Software Foundation; either version 3, or (at your option) 00009 // any later version. 00010 00011 // This library is distributed in the hope that it will be useful, 00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 // GNU General Public License for more details. 00015 00016 // Under Section 7 of GPL version 3, you are granted additional 00017 // permissions described in the GCC Runtime Library Exception, version 00018 // 3.1, as published by the Free Software Foundation. 00019 00020 // You should have received a copy of the GNU General Public License and 00021 // a copy of the GCC Runtime Library Exception along with this program; 00022 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 00023 // <http://www.gnu.org/licenses/>. 00024 00025 /** @file tr1/cmath 00026 * This is a TR1 C++ Library header. 00027 */ 00028 00029 #ifndef _GLIBCXX_TR1_CMATH 00030 #define _GLIBCXX_TR1_CMATH 1 00031 00032 #pragma GCC system_header 00033 00034 #if defined(_GLIBCXX_INCLUDE_AS_CXX0X) 00035 # error TR1 header cannot be included from C++0x header 00036 #endif 00037 00038 #include <cmath> 00039 00040 #if defined(_GLIBCXX_INCLUDE_AS_TR1) 00041 # include <tr1_impl/cmath> 00042 #else 00043 # define _GLIBCXX_INCLUDE_AS_TR1 00044 # define _GLIBCXX_BEGIN_NAMESPACE_TR1 namespace tr1 { 00045 # define _GLIBCXX_END_NAMESPACE_TR1 } 00046 # define _GLIBCXX_TR1 tr1:: 00047 # include <tr1_impl/cmath> 00048 # undef _GLIBCXX_TR1 00049 # undef _GLIBCXX_END_NAMESPACE_TR1 00050 # undef _GLIBCXX_BEGIN_NAMESPACE_TR1 00051 # undef _GLIBCXX_INCLUDE_AS_TR1 00052 #endif 00053 00054 namespace std 00055 { 00056 namespace tr1 00057 { 00058 // DR 550. What should the return type of pow(float,int) be? 00059 // NB: C++0x and TR1 != C++03. 00060 inline double 00061 pow(double __x, double __y) 00062 { return std::pow(__x, __y); } 00063 00064 inline float 00065 pow(float __x, float __y) 00066 { return std::pow(__x, __y); } 00067 00068 inline long double 00069 pow(long double __x, long double __y) 00070 { return std::pow(__x, __y); } 00071 00072 template<typename _Tp, typename _Up> 00073 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 00074 pow(_Tp __x, _Up __y) 00075 { 00076 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 00077 return std::pow(__type(__x), __type(__y)); 00078 } 00079 } 00080 } 00081 00082 #include <bits/stl_algobase.h> 00083 #include <limits> 00084 #include <tr1/type_traits> 00085 00086 #include <tr1/gamma.tcc> 00087 #include <tr1/bessel_function.tcc> 00088 #include <tr1/beta_function.tcc> 00089 #include <tr1/ell_integral.tcc> 00090 #include <tr1/exp_integral.tcc> 00091 #include <tr1/hypergeometric.tcc> 00092 #include <tr1/legendre_function.tcc> 00093 #include <tr1/modified_bessel_func.tcc> 00094 #include <tr1/poly_hermite.tcc> 00095 #include <tr1/poly_laguerre.tcc> 00096 #include <tr1/riemann_zeta.tcc> 00097 00098 namespace std 00099 { 00100 namespace tr1 00101 { 00102 /** 00103 * @defgroup tr1_math_spec_func Mathematical Special Functions 00104 * @ingroup numerics 00105 * 00106 * A collection of advanced mathematical special functions. 00107 * @{ 00108 */ 00109 00110 inline float 00111 assoc_laguerref(unsigned int __n, unsigned int __m, float __x) 00112 { return __detail::__assoc_laguerre<float>(__n, __m, __x); } 00113 00114 inline long double 00115 assoc_laguerrel(unsigned int __n, unsigned int __m, long double __x) 00116 { 00117 return __detail::__assoc_laguerre<long double>(__n, __m, __x); 00118 } 00119 00120 /// 5.2.1.1 Associated Laguerre polynomials. 00121 template<typename _Tp> 00122 inline typename __gnu_cxx::__promote<_Tp>::__type 00123 assoc_laguerre(unsigned int __n, unsigned int __m, _Tp __x) 00124 { 00125 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 00126 return __detail::__assoc_laguerre<__type>(__n, __m, __x); 00127 } 00128 00129 inline float 00130 assoc_legendref(unsigned int __l, unsigned int __m, float __x) 00131 { return __detail::__assoc_legendre_p<float>(__l, __m, __x); } 00132 00133 inline long double 00134 assoc_legendrel(unsigned int __l, unsigned int __m, long double __x) 00135 { return __detail::__assoc_legendre_p<long double>(__l, __m, __x); } 00136 00137 /// 5.2.1.2 Associated Legendre functions. 00138 template<typename _Tp> 00139 inline typename __gnu_cxx::__promote<_Tp>::__type 00140 assoc_legendre(unsigned int __l, unsigned int __m, _Tp __x) 00141 { 00142 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 00143 return __detail::__assoc_legendre_p<__type>(__l, __m, __x); 00144 } 00145 00146 inline float 00147 betaf(float __x, float __y) 00148 { return __detail::__beta<float>(__x, __y); } 00149 00150 inline long double 00151 betal(long double __x, long double __y) 00152 { return __detail::__beta<long double>(__x, __y); } 00153 00154 /// 5.2.1.3 Beta functions. 00155 template<typename _Tpx, typename _Tpy> 00156 inline typename __gnu_cxx::__promote_2<_Tpx, _Tpy>::__type 00157 beta(_Tpx __x, _Tpy __y) 00158 { 00159 typedef typename __gnu_cxx::__promote_2<_Tpx, _Tpy>::__type __type; 00160 return __detail::__beta<__type>(__x, __y); 00161 } 00162 00163 inline float 00164 comp_ellint_1f(float __k) 00165 { return __detail::__comp_ellint_1<float>(__k); } 00166 00167 inline long double 00168 comp_ellint_1l(long double __k) 00169 { return __detail::__comp_ellint_1<long double>(__k); } 00170 00171 /// 5.2.1.4 Complete elliptic integrals of the first kind. 00172 template<typename _Tp> 00173 inline typename __gnu_cxx::__promote<_Tp>::__type 00174 comp_ellint_1(_Tp __k) 00175 { 00176 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 00177 return __detail::__comp_ellint_1<__type>(__k); 00178 } 00179 00180 inline float 00181 comp_ellint_2f(float __k) 00182 { return __detail::__comp_ellint_2<float>(__k); } 00183 00184 inline long double 00185 comp_ellint_2l(long double __k) 00186 { return __detail::__comp_ellint_2<long double>(__k); } 00187 00188 /// 5.2.1.5 Complete elliptic integrals of the second kind. 00189 template<typename _Tp> 00190 inline typename __gnu_cxx::__promote<_Tp>::__type 00191 comp_ellint_2(_Tp __k) 00192 { 00193 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 00194 return __detail::__comp_ellint_2<__type>(__k); 00195 } 00196 00197 inline float 00198 comp_ellint_3f(float __k, float __nu) 00199 { return __detail::__comp_ellint_3<float>(__k, __nu); } 00200 00201 inline long double 00202 comp_ellint_3l(long double __k, long double __nu) 00203 { return __detail::__comp_ellint_3<long double>(__k, __nu); } 00204 00205 /// 5.2.1.6 Complete elliptic integrals of the third kind. 00206 template<typename _Tp, typename _Tpn> 00207 inline typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type 00208 comp_ellint_3(_Tp __k, _Tpn __nu) 00209 { 00210 typedef typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type __type; 00211 return __detail::__comp_ellint_3<__type>(__k, __nu); 00212 } 00213 00214 inline float 00215 conf_hypergf(float __a, float __c, float __x) 00216 { return __detail::__conf_hyperg<float>(__a, __c, __x); } 00217 00218 inline long double 00219 conf_hypergl(long double __a, long double __c, long double __x) 00220 { return __detail::__conf_hyperg<long double>(__a, __c, __x); } 00221 00222 /// 5.2.1.7 Confluent hypergeometric functions. 00223 template<typename _Tpa, typename _Tpc, typename _Tp> 00224 inline typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type 00225 conf_hyperg(_Tpa __a, _Tpc __c, _Tp __x) 00226 { 00227 typedef typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type __type; 00228 return __detail::__conf_hyperg<__type>(__a, __c, __x); 00229 } 00230 00231 inline float 00232 cyl_bessel_if(float __nu, float __x) 00233 { return __detail::__cyl_bessel_i<float>(__nu, __x); } 00234 00235 inline long double 00236 cyl_bessel_il(long double __nu, long double __x) 00237 { return __detail::__cyl_bessel_i<long double>(__nu, __x); } 00238 00239 /// 5.2.1.8 Regular modified cylindrical Bessel functions. 00240 template<typename _Tpnu, typename _Tp> 00241 inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type 00242 cyl_bessel_i(_Tpnu __nu, _Tp __x) 00243 { 00244 typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type; 00245 return __detail::__cyl_bessel_i<__type>(__nu, __x); 00246 } 00247 00248 inline float 00249 cyl_bessel_jf(float __nu, float __x) 00250 { return __detail::__cyl_bessel_j<float>(__nu, __x); } 00251 00252 inline long double 00253 cyl_bessel_jl(long double __nu, long double __x) 00254 { return __detail::__cyl_bessel_j<long double>(__nu, __x); } 00255 00256 /// 5.2.1.9 Cylindrical Bessel functions (of the first kind). 00257 template<typename _Tpnu, typename _Tp> 00258 inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type 00259 cyl_bessel_j(_Tpnu __nu, _Tp __x) 00260 { 00261 typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type; 00262 return __detail::__cyl_bessel_j<__type>(__nu, __x); 00263 } 00264 00265 inline float 00266 cyl_bessel_kf(float __nu, float __x) 00267 { return __detail::__cyl_bessel_k<float>(__nu, __x); } 00268 00269 inline long double 00270 cyl_bessel_kl(long double __nu, long double __x) 00271 { return __detail::__cyl_bessel_k<long double>(__nu, __x); } 00272 00273 /// 5.2.1.10 Irregular modified cylindrical Bessel functions. 00274 template<typename _Tpnu, typename _Tp> 00275 inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type 00276 cyl_bessel_k(_Tpnu __nu, _Tp __x) 00277 { 00278 typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type; 00279 return __detail::__cyl_bessel_k<__type>(__nu, __x); 00280 } 00281 00282 inline float 00283 cyl_neumannf(float __nu, float __x) 00284 { return __detail::__cyl_neumann_n<float>(__nu, __x); } 00285 00286 inline long double 00287 cyl_neumannl(long double __nu, long double __x) 00288 { return __detail::__cyl_neumann_n<long double>(__nu, __x); } 00289 00290 /// 5.2.1.11 Cylindrical Neumann functions. 00291 template<typename _Tpnu, typename _Tp> 00292 inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type 00293 cyl_neumann(_Tpnu __nu, _Tp __x) 00294 { 00295 typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type; 00296 return __detail::__cyl_neumann_n<__type>(__nu, __x); 00297 } 00298 00299 inline float 00300 ellint_1f(float __k, float __phi) 00301 { return __detail::__ellint_1<float>(__k, __phi); } 00302 00303 inline long double 00304 ellint_1l(long double __k, long double __phi) 00305 { return __detail::__ellint_1<long double>(__k, __phi); } 00306 00307 /// 5.2.1.12 Incomplete elliptic integrals of the first kind. 00308 template<typename _Tp, typename _Tpp> 00309 inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type 00310 ellint_1(_Tp __k, _Tpp __phi) 00311 { 00312 typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type; 00313 return __detail::__ellint_1<__type>(__k, __phi); 00314 } 00315 00316 inline float 00317 ellint_2f(float __k, float __phi) 00318 { return __detail::__ellint_2<float>(__k, __phi); } 00319 00320 inline long double 00321 ellint_2l(long double __k, long double __phi) 00322 { return __detail::__ellint_2<long double>(__k, __phi); } 00323 00324 /// 5.2.1.13 Incomplete elliptic integrals of the second kind. 00325 template<typename _Tp, typename _Tpp> 00326 inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type 00327 ellint_2(_Tp __k, _Tpp __phi) 00328 { 00329 typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type; 00330 return __detail::__ellint_2<__type>(__k, __phi); 00331 } 00332 00333 inline float 00334 ellint_3f(float __k, float __nu, float __phi) 00335 { return __detail::__ellint_3<float>(__k, __nu, __phi); } 00336 00337 inline long double 00338 ellint_3l(long double __k, long double __nu, long double __phi) 00339 { return __detail::__ellint_3<long double>(__k, __nu, __phi); } 00340 00341 /// 5.2.1.14 Incomplete elliptic integrals of the third kind. 00342 template<typename _Tp, typename _Tpn, typename _Tpp> 00343 inline typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type 00344 ellint_3(_Tp __k, _Tpn __nu, _Tpp __phi) 00345 { 00346 typedef typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type __type; 00347 return __detail::__ellint_3<__type>(__k, __nu, __phi); 00348 } 00349 00350 inline float 00351 expintf(float __x) 00352 { return __detail::__expint<float>(__x); } 00353 00354 inline long double 00355 expintl(long double __x) 00356 { return __detail::__expint<long double>(__x); } 00357 00358 /// 5.2.1.15 Exponential integrals. 00359 template<typename _Tp> 00360 inline typename __gnu_cxx::__promote<_Tp>::__type 00361 expint(_Tp __x) 00362 { 00363 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 00364 return __detail::__expint<__type>(__x); 00365 } 00366 00367 inline float 00368 hermitef(unsigned int __n, float __x) 00369 { return __detail::__poly_hermite<float>(__n, __x); } 00370 00371 inline long double 00372 hermitel(unsigned int __n, long double __x) 00373 { return __detail::__poly_hermite<long double>(__n, __x); } 00374 00375 /// 5.2.1.16 Hermite polynomials. 00376 template<typename _Tp> 00377 inline typename __gnu_cxx::__promote<_Tp>::__type 00378 hermite(unsigned int __n, _Tp __x) 00379 { 00380 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 00381 return __detail::__poly_hermite<__type>(__n, __x); 00382 } 00383 00384 inline float 00385 hypergf(float __a, float __b, float __c, float __x) 00386 { return __detail::__hyperg<float>(__a, __b, __c, __x); } 00387 00388 inline long double 00389 hypergl(long double __a, long double __b, long double __c, long double __x) 00390 { return __detail::__hyperg<long double>(__a, __b, __c, __x); } 00391 00392 /// 5.2.1.17 Hypergeometric functions. 00393 template<typename _Tpa, typename _Tpb, typename _Tpc, typename _Tp> 00394 inline typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>::__type 00395 hyperg(_Tpa __a, _Tpb __b, _Tpc __c, _Tp __x) 00396 { 00397 typedef typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>::__type __type; 00398 return __detail::__hyperg<__type>(__a, __b, __c, __x); 00399 } 00400 00401 inline float 00402 laguerref(unsigned int __n, float __x) 00403 { return __detail::__laguerre<float>(__n, __x); } 00404 00405 inline long double 00406 laguerrel(unsigned int __n, long double __x) 00407 { return __detail::__laguerre<long double>(__n, __x); } 00408 00409 /// 5.2.1.18 Laguerre polynomials. 00410 template<typename _Tp> 00411 inline typename __gnu_cxx::__promote<_Tp>::__type 00412 laguerre(unsigned int __n, _Tp __x) 00413 { 00414 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 00415 return __detail::__laguerre<__type>(__n, __x); 00416 } 00417 00418 inline float 00419 legendref(unsigned int __n, float __x) 00420 { return __detail::__poly_legendre_p<float>(__n, __x); } 00421 00422 inline long double 00423 legendrel(unsigned int __n, long double __x) 00424 { return __detail::__poly_legendre_p<long double>(__n, __x); } 00425 00426 /// 5.2.1.19 Legendre polynomials. 00427 template<typename _Tp> 00428 inline typename __gnu_cxx::__promote<_Tp>::__type 00429 legendre(unsigned int __n, _Tp __x) 00430 { 00431 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 00432 return __detail::__poly_legendre_p<__type>(__n, __x); 00433 } 00434 00435 inline float 00436 riemann_zetaf(float __x) 00437 { return __detail::__riemann_zeta<float>(__x); } 00438 00439 inline long double 00440 riemann_zetal(long double __x) 00441 { return __detail::__riemann_zeta<long double>(__x); } 00442 00443 /// 5.2.1.20 Riemann zeta function. 00444 template<typename _Tp> 00445 inline typename __gnu_cxx::__promote<_Tp>::__type 00446 riemann_zeta(_Tp __x) 00447 { 00448 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 00449 return __detail::__riemann_zeta<__type>(__x); 00450 } 00451 00452 inline float 00453 sph_besself(unsigned int __n, float __x) 00454 { return __detail::__sph_bessel<float>(__n, __x); } 00455 00456 inline long double 00457 sph_bessell(unsigned int __n, long double __x) 00458 { return __detail::__sph_bessel<long double>(__n, __x); } 00459 00460 /// 5.2.1.21 Spherical Bessel functions. 00461 template<typename _Tp> 00462 inline typename __gnu_cxx::__promote<_Tp>::__type 00463 sph_bessel(unsigned int __n, _Tp __x) 00464 { 00465 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 00466 return __detail::__sph_bessel<__type>(__n, __x); 00467 } 00468 00469 inline float 00470 sph_legendref(unsigned int __l, unsigned int __m, float __theta) 00471 { return __detail::__sph_legendre<float>(__l, __m, __theta); } 00472 00473 inline long double 00474 sph_legendrel(unsigned int __l, unsigned int __m, long double __theta) 00475 { return __detail::__sph_legendre<long double>(__l, __m, __theta); } 00476 00477 /// 5.2.1.22 Spherical associated Legendre functions. 00478 template<typename _Tp> 00479 inline typename __gnu_cxx::__promote<_Tp>::__type 00480 sph_legendre(unsigned int __l, unsigned int __m, _Tp __theta) 00481 { 00482 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 00483 return __detail::__sph_legendre<__type>(__l, __m, __theta); 00484 } 00485 00486 inline float 00487 sph_neumannf(unsigned int __n, float __x) 00488 { return __detail::__sph_neumann<float>(__n, __x); } 00489 00490 inline long double 00491 sph_neumannl(unsigned int __n, long double __x) 00492 { return __detail::__sph_neumann<long double>(__n, __x); } 00493 00494 /// 5.2.1.23 Spherical Neumann functions. 00495 template<typename _Tp> 00496 inline typename __gnu_cxx::__promote<_Tp>::__type 00497 sph_neumann(unsigned int __n, _Tp __x) 00498 { 00499 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 00500 return __detail::__sph_neumann<__type>(__n, __x); 00501 } 00502 00503 /* @} */ // tr1_math_spec_func 00504 } 00505 } 00506 00507 #endif // _GLIBCXX_TR1_CMATH