Home | History | Annotate | Download | only in tr1
      1 // TR1 cmath -*- C++ -*-
      2 
      3 // Copyright (C) 2006-2013 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 #include <cmath>
     35 
     36 #ifdef _GLIBCXX_USE_C99_MATH_TR1
     37 
     38 #undef acosh
     39 #undef acoshf
     40 #undef acoshl
     41 #undef asinh
     42 #undef asinhf
     43 #undef asinhl
     44 #undef atanh
     45 #undef atanhf
     46 #undef atanhl
     47 #undef cbrt
     48 #undef cbrtf
     49 #undef cbrtl
     50 #undef copysign
     51 #undef copysignf
     52 #undef copysignl
     53 #undef erf
     54 #undef erff
     55 #undef erfl
     56 #undef erfc
     57 #undef erfcf
     58 #undef erfcl
     59 #undef exp2
     60 #undef exp2f
     61 #undef exp2l
     62 #undef expm1
     63 #undef expm1f
     64 #undef expm1l
     65 #undef fdim
     66 #undef fdimf
     67 #undef fdiml
     68 #undef fma
     69 #undef fmaf
     70 #undef fmal
     71 #undef fmax
     72 #undef fmaxf
     73 #undef fmaxl
     74 #undef fmin
     75 #undef fminf
     76 #undef fminl
     77 #undef hypot
     78 #undef hypotf
     79 #undef hypotl
     80 #undef ilogb
     81 #undef ilogbf
     82 #undef ilogbl
     83 #undef lgamma
     84 #undef lgammaf
     85 #undef lgammal
     86 #undef llrint
     87 #undef llrintf
     88 #undef llrintl
     89 #undef llround
     90 #undef llroundf
     91 #undef llroundl
     92 #undef log1p
     93 #undef log1pf
     94 #undef log1pl
     95 #undef log2
     96 #undef log2f
     97 #undef log2l
     98 #undef logb
     99 #undef logbf
    100 #undef logbl
    101 #undef lrint
    102 #undef lrintf
    103 #undef lrintl
    104 #undef lround
    105 #undef lroundf
    106 #undef lroundl
    107 #undef nan
    108 #undef nanf
    109 #undef nanl
    110 #undef nearbyint
    111 #undef nearbyintf
    112 #undef nearbyintl
    113 #undef nextafter
    114 #undef nextafterf
    115 #undef nextafterl
    116 #undef nexttoward
    117 #undef nexttowardf
    118 #undef nexttowardl
    119 #undef remainder
    120 #undef remainderf
    121 #undef remainderl
    122 #undef remquo
    123 #undef remquof
    124 #undef remquol
    125 #undef rint
    126 #undef rintf
    127 #undef rintl
    128 #undef round
    129 #undef roundf
    130 #undef roundl
    131 #undef scalbln
    132 #undef scalblnf
    133 #undef scalblnl
    134 #undef scalbn
    135 #undef scalbnf
    136 #undef scalbnl
    137 #undef tgamma
    138 #undef tgammaf
    139 #undef tgammal
    140 #undef trunc
    141 #undef truncf
    142 #undef truncl
    143 
    144 #endif
    145 
    146 namespace std _GLIBCXX_VISIBILITY(default)
    147 {
    148 namespace tr1
    149 {
    150 _GLIBCXX_BEGIN_NAMESPACE_VERSION
    151 
    152 #if _GLIBCXX_USE_C99_MATH_TR1
    153 
    154   // types
    155   using ::double_t;
    156   using ::float_t;
    157 
    158   // functions
    159   using ::acosh;
    160   using ::acoshf;
    161   using ::acoshl;
    162 
    163   using ::asinh;
    164   using ::asinhf;
    165   using ::asinhl;
    166 
    167   using ::atanh;
    168   using ::atanhf;
    169   using ::atanhl;
    170 
    171   using ::cbrt;
    172   using ::cbrtf;
    173   using ::cbrtl;
    174 
    175   using ::copysign;
    176   using ::copysignf;
    177   using ::copysignl;
    178 
    179   using ::erf;
    180   using ::erff;
    181   using ::erfl;
    182 
    183   using ::erfc;
    184   using ::erfcf;
    185   using ::erfcl;
    186 
    187   using ::exp2;
    188   using ::exp2f;
    189   using ::exp2l;
    190 
    191   using ::expm1;
    192   using ::expm1f;
    193   using ::expm1l;
    194 
    195   using ::fdim;
    196   using ::fdimf;
    197   using ::fdiml;
    198 
    199   using ::fma;
    200   using ::fmaf;
    201   using ::fmal;
    202 
    203   using ::fmax;
    204   using ::fmaxf;
    205   using ::fmaxl;
    206 
    207   using ::fmin;
    208   using ::fminf;
    209   using ::fminl;
    210 
    211   using ::hypot;
    212   using ::hypotf;
    213   using ::hypotl;
    214 
    215   using ::ilogb;
    216   using ::ilogbf;
    217   using ::ilogbl;
    218 
    219   using ::lgamma;
    220   using ::lgammaf;
    221   using ::lgammal;
    222 
    223   using ::llrint;
    224   using ::llrintf;
    225   using ::llrintl;
    226 
    227   using ::llround;
    228   using ::llroundf;
    229   using ::llroundl;
    230 
    231   using ::log1p;
    232   using ::log1pf;
    233   using ::log1pl;
    234 
    235   using ::log2;
    236   using ::log2f;
    237   using ::log2l;
    238 
    239   using ::logb;
    240   using ::logbf;
    241   using ::logbl;
    242 
    243   using ::lrint;
    244   using ::lrintf;
    245   using ::lrintl;
    246 
    247   using ::lround;
    248   using ::lroundf;
    249   using ::lroundl;
    250 
    251   using ::nan;
    252   using ::nanf;
    253   using ::nanl;
    254 
    255   using ::nearbyint;
    256   using ::nearbyintf;
    257   using ::nearbyintl;
    258 
    259   using ::nextafter;
    260   using ::nextafterf;
    261   using ::nextafterl;
    262 
    263   using ::nexttoward;
    264   using ::nexttowardf;
    265   using ::nexttowardl;
    266 
    267   using ::remainder;
    268   using ::remainderf;
    269   using ::remainderl;
    270 
    271   using ::remquo;
    272   using ::remquof;
    273   using ::remquol;
    274 
    275   using ::rint;
    276   using ::rintf;
    277   using ::rintl;
    278 
    279   using ::round;
    280   using ::roundf;
    281   using ::roundl;
    282 
    283   using ::scalbln;
    284   using ::scalblnf;
    285   using ::scalblnl;
    286 
    287   using ::scalbn;
    288   using ::scalbnf;
    289   using ::scalbnl;
    290 
    291   using ::tgamma;
    292   using ::tgammaf;
    293   using ::tgammal;
    294 
    295   using ::trunc;
    296   using ::truncf;
    297   using ::truncl;
    298 
    299 #endif
    300 
    301 #if _GLIBCXX_USE_C99_MATH
    302 #if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
    303 
    304   /// Function template definitions [8.16.3].
    305   template<typename _Tp>
    306     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    307 					   int>::__type
    308     fpclassify(_Tp __f)
    309     {
    310       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    311       return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
    312 				  FP_SUBNORMAL, FP_ZERO, __type(__f));
    313     }
    314 
    315   template<typename _Tp>
    316     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    317 					   int>::__type
    318     isfinite(_Tp __f)
    319     {
    320       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    321       return __builtin_isfinite(__type(__f));
    322     }
    323 
    324   template<typename _Tp>
    325     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    326 					   int>::__type
    327     isinf(_Tp __f)
    328     {
    329       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    330       return __builtin_isinf(__type(__f));
    331     }
    332 
    333   template<typename _Tp>
    334     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    335 					   int>::__type
    336     isnan(_Tp __f)
    337     {
    338       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    339       return __builtin_isnan(__type(__f));
    340     }
    341 
    342   template<typename _Tp>
    343     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    344 					   int>::__type
    345     isnormal(_Tp __f)
    346     {
    347       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    348       return __builtin_isnormal(__type(__f));
    349     }
    350 
    351   template<typename _Tp>
    352     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    353 					   int>::__type
    354     signbit(_Tp __f)
    355     {
    356       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    357       return __builtin_signbit(__type(__f));
    358     }
    359 
    360   template<typename _Tp>
    361     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    362 					   int>::__type
    363     isgreater(_Tp __f1, _Tp __f2)
    364     {
    365       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    366       return __builtin_isgreater(__type(__f1), __type(__f2));
    367     }
    368 
    369   template<typename _Tp>
    370     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    371 					   int>::__type
    372     isgreaterequal(_Tp __f1, _Tp __f2)
    373     {
    374       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    375       return __builtin_isgreaterequal(__type(__f1), __type(__f2));
    376     }
    377 
    378   template<typename _Tp>
    379     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    380 					   int>::__type
    381     isless(_Tp __f1, _Tp __f2)
    382     {
    383       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    384       return __builtin_isless(__type(__f1), __type(__f2));
    385     }
    386 
    387   template<typename _Tp>
    388     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    389 					   int>::__type
    390     islessequal(_Tp __f1, _Tp __f2)
    391     {
    392       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    393       return __builtin_islessequal(__type(__f1), __type(__f2));
    394     }
    395 
    396   template<typename _Tp>
    397     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    398 					   int>::__type
    399     islessgreater(_Tp __f1, _Tp __f2)
    400     {
    401       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    402       return __builtin_islessgreater(__type(__f1), __type(__f2));
    403     }
    404 
    405   template<typename _Tp>
    406     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    407 					   int>::__type
    408     isunordered(_Tp __f1, _Tp __f2)
    409     {
    410       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    411       return __builtin_isunordered(__type(__f1), __type(__f2));
    412     }
    413 
    414 #endif
    415 #endif
    416 
    417 #if _GLIBCXX_USE_C99_MATH_TR1
    418 
    419   /// Additional overloads [8.16.4].
    420   using std::acos;
    421 
    422   inline float
    423   acosh(float __x)
    424   { return __builtin_acoshf(__x); }
    425 
    426   inline long double
    427   acosh(long double __x)
    428   { return __builtin_acoshl(__x); }
    429 
    430   template<typename _Tp>
    431     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    432 					   double>::__type
    433     acosh(_Tp __x)
    434     { return __builtin_acosh(__x); }
    435 
    436   using std::asin;
    437 
    438   inline float
    439   asinh(float __x)
    440   { return __builtin_asinhf(__x); }
    441 
    442   inline long double
    443   asinh(long double __x)
    444   { return __builtin_asinhl(__x); }
    445 
    446   template<typename _Tp>
    447     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    448 					   double>::__type
    449     asinh(_Tp __x)
    450     { return __builtin_asinh(__x); }
    451 
    452   using std::atan;
    453   using std::atan2;
    454 
    455   inline float
    456   atanh(float __x)
    457   { return __builtin_atanhf(__x); }
    458 
    459   inline long double
    460   atanh(long double __x)
    461   { return __builtin_atanhl(__x); }
    462 
    463   template<typename _Tp>
    464     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    465 					   double>::__type
    466     atanh(_Tp __x)
    467     { return __builtin_atanh(__x); }
    468 
    469   inline float
    470   cbrt(float __x)
    471   { return __builtin_cbrtf(__x); }
    472 
    473   inline long double
    474   cbrt(long double __x)
    475   { return __builtin_cbrtl(__x); }
    476 
    477   template<typename _Tp>
    478     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    479 					   double>::__type
    480     cbrt(_Tp __x)
    481     { return __builtin_cbrt(__x); }
    482 
    483   using std::ceil;
    484 
    485   inline float
    486   copysign(float __x, float __y)
    487   { return __builtin_copysignf(__x, __y); }
    488 
    489   inline long double
    490   copysign(long double __x, long double __y)
    491   { return __builtin_copysignl(__x, __y); }
    492 
    493   template<typename _Tp, typename _Up>
    494     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    495     copysign(_Tp __x, _Up __y)
    496     {
    497       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    498       return copysign(__type(__x), __type(__y));
    499     }
    500 
    501   using std::cos;
    502   using std::cosh;  
    503 
    504   inline float
    505   erf(float __x)
    506   { return __builtin_erff(__x); }
    507 
    508   inline long double
    509   erf(long double __x)
    510   { return __builtin_erfl(__x); }
    511 
    512   template<typename _Tp>
    513     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    514 					   double>::__type
    515     erf(_Tp __x)
    516     { return __builtin_erf(__x); }
    517 
    518   inline float
    519   erfc(float __x)
    520   { return __builtin_erfcf(__x); }
    521 
    522   inline long double
    523   erfc(long double __x)
    524   { return __builtin_erfcl(__x); }
    525 
    526   template<typename _Tp>
    527     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    528 					   double>::__type
    529     erfc(_Tp __x)
    530     { return __builtin_erfc(__x); }
    531 
    532   using std::exp;
    533 
    534   inline float
    535   exp2(float __x)
    536   { return __builtin_exp2f(__x); }
    537 
    538   inline long double
    539   exp2(long double __x)
    540   { return __builtin_exp2l(__x); }
    541 
    542   template<typename _Tp>
    543     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    544 					   double>::__type
    545     exp2(_Tp __x)
    546     { return __builtin_exp2(__x); }
    547 
    548   inline float
    549   expm1(float __x)
    550   { return __builtin_expm1f(__x); }
    551 
    552   inline long double
    553   expm1(long double __x)
    554   { return __builtin_expm1l(__x); }
    555 
    556   template<typename _Tp>
    557     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    558 					   double>::__type
    559     expm1(_Tp __x)
    560     { return __builtin_expm1(__x); }
    561 
    562   // Note: we deal with fabs in a special way, because an using std::fabs
    563   // would bring in also the overloads for complex types, which in C++0x
    564   // mode have a different return type.
    565   // With __CORRECT_ISO_CPP_MATH_H_PROTO, math.h imports std::fabs in the
    566   // global namespace after the declarations of the float / double / long
    567   // double overloads but before the std::complex overloads.
    568   using ::fabs;
    569 
    570 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
    571   inline float
    572   fabs(float __x)
    573   { return __builtin_fabsf(__x); }
    574 
    575   inline long double
    576   fabs(long double __x)
    577   { return __builtin_fabsl(__x); }
    578 
    579   template<typename _Tp>
    580     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    581 					   double>::__type
    582     fabs(_Tp __x)
    583     { return __builtin_fabs(__x); }
    584 #endif
    585 
    586   inline float
    587   fdim(float __x, float __y)
    588   { return __builtin_fdimf(__x, __y); }
    589 
    590   inline long double
    591   fdim(long double __x, long double __y)
    592   { return __builtin_fdiml(__x, __y); }
    593 
    594   template<typename _Tp, typename _Up>
    595     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    596     fdim(_Tp __x, _Up __y)
    597     {
    598       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    599       return fdim(__type(__x), __type(__y));
    600     }
    601 
    602   using std::floor;
    603 
    604   inline float
    605   fma(float __x, float __y, float __z)
    606   { return __builtin_fmaf(__x, __y, __z); }
    607 
    608   inline long double
    609   fma(long double __x, long double __y, long double __z)
    610   { return __builtin_fmal(__x, __y, __z); }
    611 
    612   template<typename _Tp, typename _Up, typename _Vp>
    613     inline typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type
    614     fma(_Tp __x, _Up __y, _Vp __z)
    615     {
    616       typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type;
    617       return fma(__type(__x), __type(__y), __type(__z));
    618     }
    619 
    620   inline float
    621   fmax(float __x, float __y)
    622   { return __builtin_fmaxf(__x, __y); }
    623 
    624   inline long double
    625   fmax(long double __x, long double __y)
    626   { return __builtin_fmaxl(__x, __y); }
    627 
    628   template<typename _Tp, typename _Up>
    629     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    630     fmax(_Tp __x, _Up __y)
    631     {
    632       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    633       return fmax(__type(__x), __type(__y));
    634     }
    635 
    636   inline float
    637   fmin(float __x, float __y)
    638   { return __builtin_fminf(__x, __y); }
    639 
    640   inline long double
    641   fmin(long double __x, long double __y)
    642   { return __builtin_fminl(__x, __y); }
    643 
    644   template<typename _Tp, typename _Up>
    645     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    646     fmin(_Tp __x, _Up __y)
    647     {
    648       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    649       return fmin(__type(__x), __type(__y));
    650     }
    651 
    652   using std::fmod;
    653   using std::frexp;
    654 
    655   inline float
    656   hypot(float __x, float __y)
    657   { return __builtin_hypotf(__x, __y); }
    658 
    659   inline long double
    660   hypot(long double __x, long double __y)
    661   { return __builtin_hypotl(__x, __y); }
    662 
    663   template<typename _Tp, typename _Up>
    664     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    665     hypot(_Tp __y, _Up __x)
    666     {
    667       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    668       return hypot(__type(__y), __type(__x));
    669     }
    670 
    671   inline int
    672   ilogb(float __x)
    673   { return __builtin_ilogbf(__x); }
    674 
    675   inline int
    676   ilogb(long double __x)
    677   { return __builtin_ilogbl(__x); }
    678 
    679   template<typename _Tp>
    680     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    681 					   int>::__type
    682     ilogb(_Tp __x)
    683     { return __builtin_ilogb(__x); }
    684 
    685   using std::ldexp;
    686 
    687   inline float
    688   lgamma(float __x)
    689   { return __builtin_lgammaf(__x); }
    690 
    691   inline long double
    692   lgamma(long double __x)
    693   { return __builtin_lgammal(__x); }
    694 
    695   template<typename _Tp>
    696     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    697 					   double>::__type
    698     lgamma(_Tp __x)
    699     { return __builtin_lgamma(__x); }
    700 
    701   inline long long
    702   llrint(float __x)
    703   { return __builtin_llrintf(__x); }
    704 
    705   inline long long
    706   llrint(long double __x)
    707   { return __builtin_llrintl(__x); }
    708 
    709   template<typename _Tp>
    710     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    711 					   long long>::__type
    712     llrint(_Tp __x)
    713     { return __builtin_llrint(__x); }
    714 
    715   inline long long
    716   llround(float __x)
    717   { return __builtin_llroundf(__x); }
    718 
    719   inline long long
    720   llround(long double __x)
    721   { return __builtin_llroundl(__x); }
    722 
    723   template<typename _Tp>
    724     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    725 					   long long>::__type
    726     llround(_Tp __x)
    727     { return __builtin_llround(__x); }
    728 
    729   using std::log;
    730   using std::log10;
    731 
    732   inline float
    733   log1p(float __x)
    734   { return __builtin_log1pf(__x); }
    735 
    736   inline long double
    737   log1p(long double __x)
    738   { return __builtin_log1pl(__x); }
    739 
    740   template<typename _Tp>
    741     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    742 					   double>::__type
    743     log1p(_Tp __x)
    744     { return __builtin_log1p(__x); }
    745 
    746   // DR 568.
    747   inline float
    748   log2(float __x)
    749   { return __builtin_log2f(__x); }
    750 
    751   inline long double
    752   log2(long double __x)
    753   { return __builtin_log2l(__x); }
    754 
    755   template<typename _Tp>
    756     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    757 					   double>::__type
    758     log2(_Tp __x)
    759     { return __builtin_log2(__x); }
    760 
    761   inline float
    762   logb(float __x)
    763   { return __builtin_logbf(__x); }
    764 
    765   inline long double
    766   logb(long double __x)
    767   { return __builtin_logbl(__x); }
    768 
    769   template<typename _Tp>
    770     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    771 					   double>::__type
    772     logb(_Tp __x)
    773     {
    774       return __builtin_logb(__x);
    775     }
    776 
    777   inline long
    778   lrint(float __x)
    779   { return __builtin_lrintf(__x); }
    780 
    781   inline long
    782   lrint(long double __x)
    783   { return __builtin_lrintl(__x); }
    784 
    785   template<typename _Tp>
    786     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    787 					   long>::__type
    788     lrint(_Tp __x)
    789     { return __builtin_lrint(__x); }
    790 
    791   inline long
    792   lround(float __x)
    793   { return __builtin_lroundf(__x); }
    794 
    795   inline long
    796   lround(long double __x)
    797   { return __builtin_lroundl(__x); }
    798 
    799   template<typename _Tp>
    800     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    801 					   long>::__type
    802     lround(_Tp __x)
    803     { return __builtin_lround(__x); }
    804 
    805   inline float
    806   nearbyint(float __x)
    807   { return __builtin_nearbyintf(__x); }
    808 
    809   inline long double
    810   nearbyint(long double __x)
    811   { return __builtin_nearbyintl(__x); }
    812 
    813   template<typename _Tp>
    814     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    815 					   double>::__type
    816     nearbyint(_Tp __x)
    817     { return __builtin_nearbyint(__x); }
    818 
    819   inline float
    820   nextafter(float __x, float __y)
    821   { return __builtin_nextafterf(__x, __y); }
    822 
    823   inline long double
    824   nextafter(long double __x, long double __y)
    825   { return __builtin_nextafterl(__x, __y); }
    826 
    827   template<typename _Tp, typename _Up>
    828     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    829     nextafter(_Tp __x, _Up __y)
    830     {
    831       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    832       return nextafter(__type(__x), __type(__y));
    833     }
    834 
    835   inline float
    836   nexttoward(float __x, long double __y)
    837   { return __builtin_nexttowardf(__x, __y); }
    838 
    839   inline long double
    840   nexttoward(long double __x, long double __y)
    841   { return __builtin_nexttowardl(__x, __y); }
    842 
    843   template<typename _Tp>
    844     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    845 					   double>::__type
    846     nexttoward(_Tp __x, long double __y)
    847     { return __builtin_nexttoward(__x, __y); }
    848 
    849   // DR 550. What should the return type of pow(float,int) be?
    850   // NB: C++0x and TR1 != C++03.
    851   //   using std::pow;
    852 
    853   inline float
    854   remainder(float __x, float __y)
    855   { return __builtin_remainderf(__x, __y); }
    856 
    857   inline long double
    858   remainder(long double __x, long double __y)
    859   { return __builtin_remainderl(__x, __y); }
    860 
    861   template<typename _Tp, typename _Up>
    862     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    863     remainder(_Tp __x, _Up __y)
    864     {
    865       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    866       return remainder(__type(__x), __type(__y));
    867     }
    868 
    869   inline float
    870   remquo(float __x, float __y, int* __pquo)
    871   { return __builtin_remquof(__x, __y, __pquo); }
    872 
    873   inline long double
    874   remquo(long double __x, long double __y, int* __pquo)
    875   { return __builtin_remquol(__x, __y, __pquo); }
    876 
    877   template<typename _Tp, typename _Up>
    878     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    879     remquo(_Tp __x, _Up __y, int* __pquo)
    880     {
    881       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    882       return remquo(__type(__x), __type(__y), __pquo);
    883     }
    884 
    885   inline float
    886   rint(float __x)
    887   { return __builtin_rintf(__x); }
    888 
    889   inline long double
    890   rint(long double __x)
    891   { return __builtin_rintl(__x); }
    892 
    893   template<typename _Tp>
    894     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    895 					   double>::__type
    896     rint(_Tp __x)
    897     { return __builtin_rint(__x); }
    898 
    899   inline float
    900   round(float __x)
    901   { return __builtin_roundf(__x); }
    902 
    903   inline long double
    904   round(long double __x)
    905   { return __builtin_roundl(__x); }
    906 
    907   template<typename _Tp>
    908     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    909 					   double>::__type
    910     round(_Tp __x)
    911     { return __builtin_round(__x); }
    912 
    913   inline float
    914   scalbln(float __x, long __ex)
    915   { return __builtin_scalblnf(__x, __ex); }
    916 
    917   inline long double
    918   scalbln(long double __x, long __ex)
    919   { return __builtin_scalblnl(__x, __ex); }
    920 
    921   template<typename _Tp>
    922     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    923 					   double>::__type
    924     scalbln(_Tp __x, long __ex)
    925     { return __builtin_scalbln(__x, __ex); }
    926  
    927   inline float
    928   scalbn(float __x, int __ex)
    929   { return __builtin_scalbnf(__x, __ex); }
    930 
    931   inline long double
    932   scalbn(long double __x, int __ex)
    933   { return __builtin_scalbnl(__x, __ex); }
    934 
    935   template<typename _Tp>
    936     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    937 					   double>::__type
    938     scalbn(_Tp __x, int __ex)
    939     { return __builtin_scalbn(__x, __ex); }
    940 
    941   using std::sin;
    942   using std::sinh;
    943   using std::sqrt;
    944   using std::tan;
    945   using std::tanh;
    946 
    947   inline float
    948   tgamma(float __x)
    949   { return __builtin_tgammaf(__x); }
    950 
    951   inline long double
    952   tgamma(long double __x)
    953   { return __builtin_tgammal(__x); }
    954 
    955   template<typename _Tp>
    956     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    957 					   double>::__type
    958     tgamma(_Tp __x)
    959     { return __builtin_tgamma(__x); }
    960  
    961   inline float
    962   trunc(float __x)
    963   { return __builtin_truncf(__x); }
    964 
    965   inline long double
    966   trunc(long double __x)
    967   { return __builtin_truncl(__x); }
    968 
    969   template<typename _Tp>
    970     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    971 					   double>::__type
    972     trunc(_Tp __x)
    973     { return __builtin_trunc(__x); }
    974 
    975 #endif
    976 _GLIBCXX_END_NAMESPACE_VERSION
    977 }
    978 }
    979 
    980 namespace std _GLIBCXX_VISIBILITY(default)
    981 {
    982 namespace tr1
    983 {
    984 _GLIBCXX_BEGIN_NAMESPACE_VERSION
    985 
    986   // DR 550. What should the return type of pow(float,int) be?
    987   // NB: C++0x and TR1 != C++03.
    988   inline double
    989   pow(double __x, double __y)
    990   { return std::pow(__x, __y); }
    991 
    992   inline float
    993   pow(float __x, float __y)
    994   { return std::pow(__x, __y); }
    995 
    996   inline long double
    997   pow(long double __x, long double __y)
    998   { return std::pow(__x, __y); }
    999 
   1000   template<typename _Tp, typename _Up>
   1001     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
   1002     pow(_Tp __x, _Up __y)
   1003     {
   1004       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
   1005       return std::pow(__type(__x), __type(__y));
   1006     }
   1007 
   1008 _GLIBCXX_END_NAMESPACE_VERSION
   1009 }
   1010 }
   1011 
   1012 #include <bits/stl_algobase.h>
   1013 #include <limits>
   1014 #include <tr1/type_traits>
   1015 
   1016 #include <tr1/gamma.tcc>
   1017 #include <tr1/bessel_function.tcc>
   1018 #include <tr1/beta_function.tcc>
   1019 #include <tr1/ell_integral.tcc>
   1020 #include <tr1/exp_integral.tcc>
   1021 #include <tr1/hypergeometric.tcc>
   1022 #include <tr1/legendre_function.tcc>
   1023 #include <tr1/modified_bessel_func.tcc>
   1024 #include <tr1/poly_hermite.tcc>
   1025 #include <tr1/poly_laguerre.tcc>
   1026 #include <tr1/riemann_zeta.tcc>
   1027 
   1028 namespace std _GLIBCXX_VISIBILITY(default)
   1029 {
   1030 namespace tr1
   1031 {
   1032 _GLIBCXX_BEGIN_NAMESPACE_VERSION
   1033 
   1034   /**
   1035    * @defgroup tr1_math_spec_func Mathematical Special Functions
   1036    * @ingroup numerics
   1037    *
   1038    * A collection of advanced mathematical special functions.
   1039    * @{
   1040    */
   1041 
   1042   inline float
   1043   assoc_laguerref(unsigned int __n, unsigned int __m, float __x)
   1044   { return __detail::__assoc_laguerre<float>(__n, __m, __x); }
   1045 
   1046   inline long double
   1047   assoc_laguerrel(unsigned int __n, unsigned int __m, long double __x)
   1048   {
   1049     return __detail::__assoc_laguerre<long double>(__n, __m, __x);
   1050   }
   1051 
   1052   ///  5.2.1.1  Associated Laguerre polynomials.
   1053   template<typename _Tp>
   1054     inline typename __gnu_cxx::__promote<_Tp>::__type
   1055     assoc_laguerre(unsigned int __n, unsigned int __m, _Tp __x)
   1056     {
   1057       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   1058       return __detail::__assoc_laguerre<__type>(__n, __m, __x);
   1059     }
   1060 
   1061   inline float
   1062   assoc_legendref(unsigned int __l, unsigned int __m, float __x)
   1063   { return __detail::__assoc_legendre_p<float>(__l, __m, __x); }
   1064 
   1065   inline long double
   1066   assoc_legendrel(unsigned int __l, unsigned int __m, long double __x)
   1067   { return __detail::__assoc_legendre_p<long double>(__l, __m, __x); }
   1068 
   1069   ///  5.2.1.2  Associated Legendre functions.
   1070   template<typename _Tp>
   1071     inline typename __gnu_cxx::__promote<_Tp>::__type
   1072     assoc_legendre(unsigned int __l, unsigned int __m, _Tp __x)
   1073     {
   1074       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   1075       return __detail::__assoc_legendre_p<__type>(__l, __m, __x);
   1076     }
   1077 
   1078   inline float
   1079   betaf(float __x, float __y)
   1080   { return __detail::__beta<float>(__x, __y); }
   1081 
   1082   inline long double
   1083   betal(long double __x, long double __y)
   1084   { return __detail::__beta<long double>(__x, __y); }
   1085 
   1086   ///  5.2.1.3  Beta functions.
   1087   template<typename _Tpx, typename _Tpy>
   1088     inline typename __gnu_cxx::__promote_2<_Tpx, _Tpy>::__type
   1089     beta(_Tpx __x, _Tpy __y)
   1090     {
   1091       typedef typename __gnu_cxx::__promote_2<_Tpx, _Tpy>::__type __type;
   1092       return __detail::__beta<__type>(__x, __y);
   1093     }
   1094 
   1095   inline float
   1096   comp_ellint_1f(float __k)
   1097   { return __detail::__comp_ellint_1<float>(__k); }
   1098 
   1099   inline long double
   1100   comp_ellint_1l(long double __k)
   1101   { return __detail::__comp_ellint_1<long double>(__k); }
   1102 
   1103   ///  5.2.1.4  Complete elliptic integrals of the first kind.
   1104   template<typename _Tp>
   1105     inline typename __gnu_cxx::__promote<_Tp>::__type
   1106     comp_ellint_1(_Tp __k)
   1107     {
   1108       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   1109       return __detail::__comp_ellint_1<__type>(__k);
   1110     }
   1111 
   1112   inline float
   1113   comp_ellint_2f(float __k)
   1114   { return __detail::__comp_ellint_2<float>(__k); }
   1115 
   1116   inline long double
   1117   comp_ellint_2l(long double __k)
   1118   { return __detail::__comp_ellint_2<long double>(__k); }
   1119 
   1120   ///  5.2.1.5  Complete elliptic integrals of the second kind.
   1121   template<typename _Tp>
   1122     inline typename __gnu_cxx::__promote<_Tp>::__type
   1123     comp_ellint_2(_Tp __k)
   1124     {
   1125       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   1126       return __detail::__comp_ellint_2<__type>(__k);
   1127     }
   1128 
   1129   inline float
   1130   comp_ellint_3f(float __k, float __nu)
   1131   { return __detail::__comp_ellint_3<float>(__k, __nu); }
   1132 
   1133   inline long double
   1134   comp_ellint_3l(long double __k, long double __nu)
   1135   { return __detail::__comp_ellint_3<long double>(__k, __nu); }
   1136 
   1137   ///  5.2.1.6  Complete elliptic integrals of the third kind.
   1138   template<typename _Tp, typename _Tpn>
   1139     inline typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type
   1140     comp_ellint_3(_Tp __k, _Tpn __nu)
   1141     {
   1142       typedef typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type __type;
   1143       return __detail::__comp_ellint_3<__type>(__k, __nu);
   1144     }
   1145 
   1146   inline float
   1147   conf_hypergf(float __a, float __c, float __x)
   1148   { return __detail::__conf_hyperg<float>(__a, __c, __x); }
   1149 
   1150   inline long double
   1151   conf_hypergl(long double __a, long double __c, long double __x)
   1152   { return __detail::__conf_hyperg<long double>(__a, __c, __x); }
   1153 
   1154   ///  5.2.1.7  Confluent hypergeometric functions.
   1155   template<typename _Tpa, typename _Tpc, typename _Tp>
   1156     inline typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type
   1157     conf_hyperg(_Tpa __a, _Tpc __c, _Tp __x)
   1158     {
   1159       typedef typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type __type;
   1160       return __detail::__conf_hyperg<__type>(__a, __c, __x);
   1161     }
   1162 
   1163   inline float
   1164   cyl_bessel_if(float __nu, float __x)
   1165   { return __detail::__cyl_bessel_i<float>(__nu, __x); }
   1166 
   1167   inline long double
   1168   cyl_bessel_il(long double __nu, long double __x)
   1169   { return __detail::__cyl_bessel_i<long double>(__nu, __x); }
   1170 
   1171   ///  5.2.1.8  Regular modified cylindrical Bessel functions.
   1172   template<typename _Tpnu, typename _Tp>
   1173     inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
   1174     cyl_bessel_i(_Tpnu __nu, _Tp __x)
   1175     {
   1176       typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
   1177       return __detail::__cyl_bessel_i<__type>(__nu, __x);
   1178     }
   1179 
   1180   inline float
   1181   cyl_bessel_jf(float __nu, float __x)
   1182   { return __detail::__cyl_bessel_j<float>(__nu, __x); }
   1183 
   1184   inline long double
   1185   cyl_bessel_jl(long double __nu, long double __x)
   1186   { return __detail::__cyl_bessel_j<long double>(__nu, __x); }
   1187 
   1188   ///  5.2.1.9  Cylindrical Bessel functions (of the first kind).
   1189   template<typename _Tpnu, typename _Tp>
   1190     inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
   1191     cyl_bessel_j(_Tpnu __nu, _Tp __x)
   1192     {
   1193       typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
   1194       return __detail::__cyl_bessel_j<__type>(__nu, __x);
   1195     }
   1196 
   1197   inline float
   1198   cyl_bessel_kf(float __nu, float __x)
   1199   { return __detail::__cyl_bessel_k<float>(__nu, __x); }
   1200 
   1201   inline long double
   1202   cyl_bessel_kl(long double __nu, long double __x)
   1203   { return __detail::__cyl_bessel_k<long double>(__nu, __x); }
   1204 
   1205   ///  5.2.1.10  Irregular modified cylindrical Bessel functions.
   1206   template<typename _Tpnu, typename _Tp>
   1207     inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
   1208     cyl_bessel_k(_Tpnu __nu, _Tp __x)
   1209     {
   1210       typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
   1211       return __detail::__cyl_bessel_k<__type>(__nu, __x);
   1212     }
   1213 
   1214   inline float
   1215   cyl_neumannf(float __nu, float __x)
   1216   { return __detail::__cyl_neumann_n<float>(__nu, __x); }
   1217 
   1218   inline long double
   1219   cyl_neumannl(long double __nu, long double __x)
   1220   { return __detail::__cyl_neumann_n<long double>(__nu, __x); }
   1221 
   1222   ///  5.2.1.11  Cylindrical Neumann functions.
   1223   template<typename _Tpnu, typename _Tp>
   1224     inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
   1225     cyl_neumann(_Tpnu __nu, _Tp __x)
   1226     {
   1227       typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
   1228       return __detail::__cyl_neumann_n<__type>(__nu, __x);
   1229     }
   1230 
   1231   inline float
   1232   ellint_1f(float __k, float __phi)
   1233   { return __detail::__ellint_1<float>(__k, __phi); }
   1234 
   1235   inline long double
   1236   ellint_1l(long double __k, long double __phi)
   1237   { return __detail::__ellint_1<long double>(__k, __phi); }
   1238 
   1239   ///  5.2.1.12  Incomplete elliptic integrals of the first kind.
   1240   template<typename _Tp, typename _Tpp>
   1241     inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type
   1242     ellint_1(_Tp __k, _Tpp __phi)
   1243     {
   1244       typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type;
   1245       return __detail::__ellint_1<__type>(__k, __phi);
   1246     }
   1247 
   1248   inline float
   1249   ellint_2f(float __k, float __phi)
   1250   { return __detail::__ellint_2<float>(__k, __phi); }
   1251 
   1252   inline long double
   1253   ellint_2l(long double __k, long double __phi)
   1254   { return __detail::__ellint_2<long double>(__k, __phi); }
   1255 
   1256   ///  5.2.1.13  Incomplete elliptic integrals of the second kind.
   1257   template<typename _Tp, typename _Tpp>
   1258     inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type
   1259     ellint_2(_Tp __k, _Tpp __phi)
   1260     {
   1261       typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type;
   1262       return __detail::__ellint_2<__type>(__k, __phi);
   1263     }
   1264 
   1265   inline float
   1266   ellint_3f(float __k, float __nu, float __phi)
   1267   { return __detail::__ellint_3<float>(__k, __nu, __phi); }
   1268 
   1269   inline long double
   1270   ellint_3l(long double __k, long double __nu, long double __phi)
   1271   { return __detail::__ellint_3<long double>(__k, __nu, __phi); }
   1272 
   1273   ///  5.2.1.14  Incomplete elliptic integrals of the third kind.
   1274   template<typename _Tp, typename _Tpn, typename _Tpp>
   1275     inline typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type
   1276     ellint_3(_Tp __k, _Tpn __nu, _Tpp __phi)
   1277     {
   1278       typedef typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type __type;
   1279       return __detail::__ellint_3<__type>(__k, __nu, __phi);
   1280     }
   1281 
   1282   inline float
   1283   expintf(float __x)
   1284   { return __detail::__expint<float>(__x); }
   1285 
   1286   inline long double
   1287   expintl(long double __x)
   1288   { return __detail::__expint<long double>(__x); }
   1289 
   1290   ///  5.2.1.15  Exponential integrals.
   1291   template<typename _Tp>
   1292     inline typename __gnu_cxx::__promote<_Tp>::__type
   1293     expint(_Tp __x)
   1294     {
   1295       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   1296       return __detail::__expint<__type>(__x);
   1297     }
   1298 
   1299   inline float
   1300   hermitef(unsigned int __n, float __x)
   1301   { return __detail::__poly_hermite<float>(__n, __x); }
   1302 
   1303   inline long double
   1304   hermitel(unsigned int __n, long double __x)
   1305   { return __detail::__poly_hermite<long double>(__n, __x); }
   1306 
   1307   ///  5.2.1.16  Hermite polynomials.
   1308   template<typename _Tp>
   1309     inline typename __gnu_cxx::__promote<_Tp>::__type
   1310     hermite(unsigned int __n, _Tp __x)
   1311     {
   1312       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   1313       return __detail::__poly_hermite<__type>(__n, __x);
   1314     }
   1315 
   1316   inline float
   1317   hypergf(float __a, float __b, float __c, float __x)
   1318   { return __detail::__hyperg<float>(__a, __b, __c, __x); }
   1319 
   1320   inline long double
   1321   hypergl(long double __a, long double __b, long double __c, long double __x)
   1322   { return __detail::__hyperg<long double>(__a, __b, __c, __x); }
   1323 
   1324   ///  5.2.1.17  Hypergeometric functions.
   1325   template<typename _Tpa, typename _Tpb, typename _Tpc, typename _Tp>
   1326     inline typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>::__type
   1327     hyperg(_Tpa __a, _Tpb __b, _Tpc __c, _Tp __x)
   1328     {
   1329       typedef typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>::__type __type;
   1330       return __detail::__hyperg<__type>(__a, __b, __c, __x);
   1331     }
   1332 
   1333   inline float
   1334   laguerref(unsigned int __n, float __x)
   1335   { return __detail::__laguerre<float>(__n, __x); }
   1336 
   1337   inline long double
   1338   laguerrel(unsigned int __n, long double __x)
   1339   { return __detail::__laguerre<long double>(__n, __x); }
   1340 
   1341   ///  5.2.1.18  Laguerre polynomials.
   1342   template<typename _Tp>
   1343     inline typename __gnu_cxx::__promote<_Tp>::__type
   1344     laguerre(unsigned int __n, _Tp __x)
   1345     {
   1346       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   1347       return __detail::__laguerre<__type>(__n, __x);
   1348     }
   1349 
   1350   inline float
   1351   legendref(unsigned int __n, float __x)
   1352   { return __detail::__poly_legendre_p<float>(__n, __x); }
   1353 
   1354   inline long double
   1355   legendrel(unsigned int __n, long double __x)
   1356   { return __detail::__poly_legendre_p<long double>(__n, __x); }
   1357 
   1358   ///  5.2.1.19  Legendre polynomials.
   1359   template<typename _Tp>
   1360     inline typename __gnu_cxx::__promote<_Tp>::__type
   1361     legendre(unsigned int __n, _Tp __x)
   1362     {
   1363       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   1364       return __detail::__poly_legendre_p<__type>(__n, __x);
   1365     }
   1366 
   1367   inline float
   1368   riemann_zetaf(float __x)
   1369   { return __detail::__riemann_zeta<float>(__x); }
   1370 
   1371   inline long double
   1372   riemann_zetal(long double __x)
   1373   { return __detail::__riemann_zeta<long double>(__x); }
   1374 
   1375   ///  5.2.1.20  Riemann zeta function.
   1376   template<typename _Tp>
   1377     inline typename __gnu_cxx::__promote<_Tp>::__type
   1378     riemann_zeta(_Tp __x)
   1379     {
   1380       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   1381       return __detail::__riemann_zeta<__type>(__x);
   1382     }
   1383 
   1384   inline float
   1385   sph_besself(unsigned int __n, float __x)
   1386   { return __detail::__sph_bessel<float>(__n, __x); }
   1387 
   1388   inline long double
   1389   sph_bessell(unsigned int __n, long double __x)
   1390   { return __detail::__sph_bessel<long double>(__n, __x); }
   1391 
   1392   ///  5.2.1.21  Spherical Bessel functions.
   1393   template<typename _Tp>
   1394     inline typename __gnu_cxx::__promote<_Tp>::__type
   1395     sph_bessel(unsigned int __n, _Tp __x)
   1396     {
   1397       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   1398       return __detail::__sph_bessel<__type>(__n, __x);
   1399     }
   1400 
   1401   inline float
   1402   sph_legendref(unsigned int __l, unsigned int __m, float __theta)
   1403   { return __detail::__sph_legendre<float>(__l, __m, __theta); }
   1404 
   1405   inline long double
   1406   sph_legendrel(unsigned int __l, unsigned int __m, long double __theta)
   1407   { return __detail::__sph_legendre<long double>(__l, __m, __theta); }
   1408 
   1409   ///  5.2.1.22  Spherical associated Legendre functions.
   1410   template<typename _Tp>
   1411     inline typename __gnu_cxx::__promote<_Tp>::__type
   1412     sph_legendre(unsigned int __l, unsigned int __m, _Tp __theta)
   1413     {
   1414       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   1415       return __detail::__sph_legendre<__type>(__l, __m, __theta);
   1416     }
   1417 
   1418   inline float
   1419   sph_neumannf(unsigned int __n, float __x)
   1420   { return __detail::__sph_neumann<float>(__n, __x); }
   1421 
   1422   inline long double
   1423   sph_neumannl(unsigned int __n, long double __x)
   1424   { return __detail::__sph_neumann<long double>(__n, __x); }
   1425 
   1426   ///  5.2.1.23  Spherical Neumann functions.
   1427   template<typename _Tp>
   1428     inline typename __gnu_cxx::__promote<_Tp>::__type
   1429     sph_neumann(unsigned int __n, _Tp __x)
   1430     {
   1431       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   1432       return __detail::__sph_neumann<__type>(__n, __x);
   1433     }
   1434 
   1435   /* @} */ // tr1_math_spec_func
   1436 _GLIBCXX_END_NAMESPACE_VERSION
   1437 }
   1438 }
   1439 
   1440 #endif // _GLIBCXX_TR1_CMATH
   1441