163d1a8abSmrg// TR1 cmath -*- C++ -*-
263d1a8abSmrg
3*ec02198aSmrg// Copyright (C) 2006-2020 Free Software Foundation, Inc.
463d1a8abSmrg//
563d1a8abSmrg// This file is part of the GNU ISO C++ Library.  This library is free
663d1a8abSmrg// software; you can redistribute it and/or modify it under the
763d1a8abSmrg// terms of the GNU General Public License as published by the
863d1a8abSmrg// Free Software Foundation; either version 3, or (at your option)
963d1a8abSmrg// any later version.
1063d1a8abSmrg
1163d1a8abSmrg// This library is distributed in the hope that it will be useful,
1263d1a8abSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of
1363d1a8abSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1463d1a8abSmrg// GNU General Public License for more details.
1563d1a8abSmrg
1663d1a8abSmrg// Under Section 7 of GPL version 3, you are granted additional
1763d1a8abSmrg// permissions described in the GCC Runtime Library Exception, version
1863d1a8abSmrg// 3.1, as published by the Free Software Foundation.
1963d1a8abSmrg
2063d1a8abSmrg// You should have received a copy of the GNU General Public License and
2163d1a8abSmrg// a copy of the GCC Runtime Library Exception along with this program;
2263d1a8abSmrg// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2363d1a8abSmrg// <http://www.gnu.org/licenses/>.
2463d1a8abSmrg
2563d1a8abSmrg/** @file tr1/cmath
2663d1a8abSmrg *  This is a TR1 C++ Library header.
2763d1a8abSmrg */
2863d1a8abSmrg
2963d1a8abSmrg#ifndef _GLIBCXX_TR1_CMATH
3063d1a8abSmrg#define _GLIBCXX_TR1_CMATH 1
3163d1a8abSmrg
3263d1a8abSmrg#pragma GCC system_header
3363d1a8abSmrg
3463d1a8abSmrg#include <cmath>
3563d1a8abSmrg
3663d1a8abSmrg#ifdef _GLIBCXX_USE_C99_MATH_TR1
3763d1a8abSmrg
3863d1a8abSmrg#undef acosh
3963d1a8abSmrg#undef acoshf
4063d1a8abSmrg#undef acoshl
4163d1a8abSmrg#undef asinh
4263d1a8abSmrg#undef asinhf
4363d1a8abSmrg#undef asinhl
4463d1a8abSmrg#undef atanh
4563d1a8abSmrg#undef atanhf
4663d1a8abSmrg#undef atanhl
4763d1a8abSmrg#undef cbrt
4863d1a8abSmrg#undef cbrtf
4963d1a8abSmrg#undef cbrtl
5063d1a8abSmrg#undef copysign
5163d1a8abSmrg#undef copysignf
5263d1a8abSmrg#undef copysignl
5363d1a8abSmrg#undef erf
5463d1a8abSmrg#undef erff
5563d1a8abSmrg#undef erfl
5663d1a8abSmrg#undef erfc
5763d1a8abSmrg#undef erfcf
5863d1a8abSmrg#undef erfcl
5963d1a8abSmrg#undef exp2
6063d1a8abSmrg#undef exp2f
6163d1a8abSmrg#undef exp2l
6263d1a8abSmrg#undef expm1
6363d1a8abSmrg#undef expm1f
6463d1a8abSmrg#undef expm1l
6563d1a8abSmrg#undef fdim
6663d1a8abSmrg#undef fdimf
6763d1a8abSmrg#undef fdiml
6863d1a8abSmrg#undef fma
6963d1a8abSmrg#undef fmaf
7063d1a8abSmrg#undef fmal
7163d1a8abSmrg#undef fmax
7263d1a8abSmrg#undef fmaxf
7363d1a8abSmrg#undef fmaxl
7463d1a8abSmrg#undef fmin
7563d1a8abSmrg#undef fminf
7663d1a8abSmrg#undef fminl
7763d1a8abSmrg#undef hypot
7863d1a8abSmrg#undef hypotf
7963d1a8abSmrg#undef hypotl
8063d1a8abSmrg#undef ilogb
8163d1a8abSmrg#undef ilogbf
8263d1a8abSmrg#undef ilogbl
8363d1a8abSmrg#undef lgamma
8463d1a8abSmrg#undef lgammaf
8563d1a8abSmrg#undef lgammal
8663d1a8abSmrg#undef llrint
8763d1a8abSmrg#undef llrintf
8863d1a8abSmrg#undef llrintl
8963d1a8abSmrg#undef llround
9063d1a8abSmrg#undef llroundf
9163d1a8abSmrg#undef llroundl
9263d1a8abSmrg#undef log1p
9363d1a8abSmrg#undef log1pf
9463d1a8abSmrg#undef log1pl
9563d1a8abSmrg#undef log2
9663d1a8abSmrg#undef log2f
9763d1a8abSmrg#undef log2l
9863d1a8abSmrg#undef logb
9963d1a8abSmrg#undef logbf
10063d1a8abSmrg#undef logbl
10163d1a8abSmrg#undef lrint
10263d1a8abSmrg#undef lrintf
10363d1a8abSmrg#undef lrintl
10463d1a8abSmrg#undef lround
10563d1a8abSmrg#undef lroundf
10663d1a8abSmrg#undef lroundl
10763d1a8abSmrg#undef nan
10863d1a8abSmrg#undef nanf
10963d1a8abSmrg#undef nanl
11063d1a8abSmrg#undef nearbyint
11163d1a8abSmrg#undef nearbyintf
11263d1a8abSmrg#undef nearbyintl
11363d1a8abSmrg#undef nextafter
11463d1a8abSmrg#undef nextafterf
11563d1a8abSmrg#undef nextafterl
11663d1a8abSmrg#undef nexttoward
11763d1a8abSmrg#undef nexttowardf
11863d1a8abSmrg#undef nexttowardl
11963d1a8abSmrg#undef remainder
12063d1a8abSmrg#undef remainderf
12163d1a8abSmrg#undef remainderl
12263d1a8abSmrg#undef remquo
12363d1a8abSmrg#undef remquof
12463d1a8abSmrg#undef remquol
12563d1a8abSmrg#undef rint
12663d1a8abSmrg#undef rintf
12763d1a8abSmrg#undef rintl
12863d1a8abSmrg#undef round
12963d1a8abSmrg#undef roundf
13063d1a8abSmrg#undef roundl
13163d1a8abSmrg#undef scalbln
13263d1a8abSmrg#undef scalblnf
13363d1a8abSmrg#undef scalblnl
13463d1a8abSmrg#undef scalbn
13563d1a8abSmrg#undef scalbnf
13663d1a8abSmrg#undef scalbnl
13763d1a8abSmrg#undef tgamma
13863d1a8abSmrg#undef tgammaf
13963d1a8abSmrg#undef tgammal
14063d1a8abSmrg#undef trunc
14163d1a8abSmrg#undef truncf
14263d1a8abSmrg#undef truncl
14363d1a8abSmrg
14463d1a8abSmrg#endif
14563d1a8abSmrg
14663d1a8abSmrgnamespace std _GLIBCXX_VISIBILITY(default)
14763d1a8abSmrg{
14863d1a8abSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
14963d1a8abSmrg
150c7a68eb7Smrgnamespace tr1
151c7a68eb7Smrg{
15263d1a8abSmrg#if _GLIBCXX_USE_C99_MATH_TR1
15363d1a8abSmrg
15463d1a8abSmrg  // Using declarations to bring names from libc's <math.h> into std::tr1.
15563d1a8abSmrg
15663d1a8abSmrg  // types
15763d1a8abSmrg  using ::double_t;
15863d1a8abSmrg  using ::float_t;
15963d1a8abSmrg
16063d1a8abSmrg  // functions
16163d1a8abSmrg  using ::acosh;
16263d1a8abSmrg  using ::acoshf;
16363d1a8abSmrg  using ::acoshl;
16463d1a8abSmrg
16563d1a8abSmrg  using ::asinh;
16663d1a8abSmrg  using ::asinhf;
16763d1a8abSmrg  using ::asinhl;
16863d1a8abSmrg
16963d1a8abSmrg  using ::atanh;
17063d1a8abSmrg  using ::atanhf;
17163d1a8abSmrg  using ::atanhl;
17263d1a8abSmrg
17363d1a8abSmrg  using ::cbrt;
17463d1a8abSmrg  using ::cbrtf;
17563d1a8abSmrg  using ::cbrtl;
17663d1a8abSmrg
17763d1a8abSmrg  using ::copysign;
17863d1a8abSmrg  using ::copysignf;
17963d1a8abSmrg  using ::copysignl;
18063d1a8abSmrg
18163d1a8abSmrg  using ::erf;
18263d1a8abSmrg  using ::erff;
18363d1a8abSmrg  using ::erfl;
18463d1a8abSmrg
18563d1a8abSmrg  using ::erfc;
18663d1a8abSmrg  using ::erfcf;
18763d1a8abSmrg  using ::erfcl;
18863d1a8abSmrg
18963d1a8abSmrg  using ::exp2;
19063d1a8abSmrg  using ::exp2f;
19163d1a8abSmrg  using ::exp2l;
19263d1a8abSmrg
19363d1a8abSmrg  using ::expm1;
19463d1a8abSmrg  using ::expm1f;
19563d1a8abSmrg  using ::expm1l;
19663d1a8abSmrg
19763d1a8abSmrg  using ::fdim;
19863d1a8abSmrg  using ::fdimf;
19963d1a8abSmrg  using ::fdiml;
20063d1a8abSmrg
20163d1a8abSmrg  using ::fma;
20263d1a8abSmrg  using ::fmaf;
20363d1a8abSmrg  using ::fmal;
20463d1a8abSmrg
20563d1a8abSmrg  using ::fmax;
20663d1a8abSmrg  using ::fmaxf;
20763d1a8abSmrg  using ::fmaxl;
20863d1a8abSmrg
20963d1a8abSmrg  using ::fmin;
21063d1a8abSmrg  using ::fminf;
21163d1a8abSmrg  using ::fminl;
21263d1a8abSmrg
21363d1a8abSmrg  using ::hypot;
21463d1a8abSmrg  using ::hypotf;
21563d1a8abSmrg  using ::hypotl;
21663d1a8abSmrg
21763d1a8abSmrg  using ::ilogb;
21863d1a8abSmrg  using ::ilogbf;
21963d1a8abSmrg  using ::ilogbl;
22063d1a8abSmrg
22163d1a8abSmrg  using ::lgamma;
22263d1a8abSmrg  using ::lgammaf;
22363d1a8abSmrg  using ::lgammal;
22463d1a8abSmrg
22563d1a8abSmrg  using ::llrint;
22663d1a8abSmrg  using ::llrintf;
22763d1a8abSmrg  using ::llrintl;
22863d1a8abSmrg
22963d1a8abSmrg  using ::llround;
23063d1a8abSmrg  using ::llroundf;
23163d1a8abSmrg  using ::llroundl;
23263d1a8abSmrg
23363d1a8abSmrg  using ::log1p;
23463d1a8abSmrg  using ::log1pf;
23563d1a8abSmrg  using ::log1pl;
23663d1a8abSmrg
23763d1a8abSmrg  using ::log2;
23863d1a8abSmrg  using ::log2f;
23963d1a8abSmrg  using ::log2l;
24063d1a8abSmrg
24163d1a8abSmrg  using ::logb;
24263d1a8abSmrg  using ::logbf;
24363d1a8abSmrg  using ::logbl;
24463d1a8abSmrg
24563d1a8abSmrg  using ::lrint;
24663d1a8abSmrg  using ::lrintf;
24763d1a8abSmrg  using ::lrintl;
24863d1a8abSmrg
24963d1a8abSmrg  using ::lround;
25063d1a8abSmrg  using ::lroundf;
25163d1a8abSmrg  using ::lroundl;
25263d1a8abSmrg
25363d1a8abSmrg  using ::nan;
25463d1a8abSmrg  using ::nanf;
25563d1a8abSmrg  using ::nanl;
25663d1a8abSmrg
25763d1a8abSmrg  using ::nearbyint;
25863d1a8abSmrg  using ::nearbyintf;
25963d1a8abSmrg  using ::nearbyintl;
26063d1a8abSmrg
26163d1a8abSmrg  using ::nextafter;
26263d1a8abSmrg  using ::nextafterf;
26363d1a8abSmrg  using ::nextafterl;
26463d1a8abSmrg
26563d1a8abSmrg  using ::nexttoward;
26663d1a8abSmrg  using ::nexttowardf;
26763d1a8abSmrg  using ::nexttowardl;
26863d1a8abSmrg
26963d1a8abSmrg  using ::remainder;
27063d1a8abSmrg  using ::remainderf;
27163d1a8abSmrg  using ::remainderl;
27263d1a8abSmrg
27363d1a8abSmrg  using ::remquo;
27463d1a8abSmrg  using ::remquof;
27563d1a8abSmrg  using ::remquol;
27663d1a8abSmrg
27763d1a8abSmrg  using ::rint;
27863d1a8abSmrg  using ::rintf;
27963d1a8abSmrg  using ::rintl;
28063d1a8abSmrg
28163d1a8abSmrg  using ::round;
28263d1a8abSmrg  using ::roundf;
28363d1a8abSmrg  using ::roundl;
28463d1a8abSmrg
28563d1a8abSmrg  using ::scalbln;
28663d1a8abSmrg  using ::scalblnf;
28763d1a8abSmrg  using ::scalblnl;
28863d1a8abSmrg
28963d1a8abSmrg  using ::scalbn;
29063d1a8abSmrg  using ::scalbnf;
29163d1a8abSmrg  using ::scalbnl;
29263d1a8abSmrg
29363d1a8abSmrg  using ::tgamma;
29463d1a8abSmrg  using ::tgammaf;
29563d1a8abSmrg  using ::tgammal;
29663d1a8abSmrg
29763d1a8abSmrg  using ::trunc;
29863d1a8abSmrg  using ::truncf;
29963d1a8abSmrg  using ::truncl;
30063d1a8abSmrg
30163d1a8abSmrg#endif
30263d1a8abSmrg
30363d1a8abSmrg#if _GLIBCXX_USE_C99_MATH
30463d1a8abSmrg#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
30563d1a8abSmrg
30663d1a8abSmrg  /// Function template definitions [8.16.3].
30763d1a8abSmrg  template<typename _Tp>
30863d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
30963d1a8abSmrg					   int>::__type
31063d1a8abSmrg    fpclassify(_Tp __f)
31163d1a8abSmrg    {
31263d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
31363d1a8abSmrg      return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
31463d1a8abSmrg				  FP_SUBNORMAL, FP_ZERO, __type(__f));
31563d1a8abSmrg    }
31663d1a8abSmrg
31763d1a8abSmrg  template<typename _Tp>
31863d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
31963d1a8abSmrg					   int>::__type
32063d1a8abSmrg    isfinite(_Tp __f)
32163d1a8abSmrg    {
32263d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
32363d1a8abSmrg      return __builtin_isfinite(__type(__f));
32463d1a8abSmrg    }
32563d1a8abSmrg
32663d1a8abSmrg  template<typename _Tp>
32763d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
32863d1a8abSmrg					   int>::__type
32963d1a8abSmrg    isinf(_Tp __f)
33063d1a8abSmrg    {
33163d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
33263d1a8abSmrg      return __builtin_isinf(__type(__f));
33363d1a8abSmrg    }
33463d1a8abSmrg
33563d1a8abSmrg  template<typename _Tp>
33663d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
33763d1a8abSmrg					   int>::__type
33863d1a8abSmrg    isnan(_Tp __f)
33963d1a8abSmrg    {
34063d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
34163d1a8abSmrg      return __builtin_isnan(__type(__f));
34263d1a8abSmrg    }
34363d1a8abSmrg
34463d1a8abSmrg  template<typename _Tp>
34563d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
34663d1a8abSmrg					   int>::__type
34763d1a8abSmrg    isnormal(_Tp __f)
34863d1a8abSmrg    {
34963d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
35063d1a8abSmrg      return __builtin_isnormal(__type(__f));
35163d1a8abSmrg    }
35263d1a8abSmrg
35363d1a8abSmrg  template<typename _Tp>
35463d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
35563d1a8abSmrg					   int>::__type
35663d1a8abSmrg    signbit(_Tp __f)
35763d1a8abSmrg    {
35863d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
35963d1a8abSmrg      return __builtin_signbit(__type(__f));
36063d1a8abSmrg    }
36163d1a8abSmrg
36263d1a8abSmrg  template<typename _Tp>
36363d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
36463d1a8abSmrg					   int>::__type
36563d1a8abSmrg    isgreater(_Tp __f1, _Tp __f2)
36663d1a8abSmrg    {
36763d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
36863d1a8abSmrg      return __builtin_isgreater(__type(__f1), __type(__f2));
36963d1a8abSmrg    }
37063d1a8abSmrg
37163d1a8abSmrg  template<typename _Tp>
37263d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
37363d1a8abSmrg					   int>::__type
37463d1a8abSmrg    isgreaterequal(_Tp __f1, _Tp __f2)
37563d1a8abSmrg    {
37663d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
37763d1a8abSmrg      return __builtin_isgreaterequal(__type(__f1), __type(__f2));
37863d1a8abSmrg    }
37963d1a8abSmrg
38063d1a8abSmrg  template<typename _Tp>
38163d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
38263d1a8abSmrg					   int>::__type
38363d1a8abSmrg    isless(_Tp __f1, _Tp __f2)
38463d1a8abSmrg    {
38563d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
38663d1a8abSmrg      return __builtin_isless(__type(__f1), __type(__f2));
38763d1a8abSmrg    }
38863d1a8abSmrg
38963d1a8abSmrg  template<typename _Tp>
39063d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
39163d1a8abSmrg					   int>::__type
39263d1a8abSmrg    islessequal(_Tp __f1, _Tp __f2)
39363d1a8abSmrg    {
39463d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
39563d1a8abSmrg      return __builtin_islessequal(__type(__f1), __type(__f2));
39663d1a8abSmrg    }
39763d1a8abSmrg
39863d1a8abSmrg  template<typename _Tp>
39963d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
40063d1a8abSmrg					   int>::__type
40163d1a8abSmrg    islessgreater(_Tp __f1, _Tp __f2)
40263d1a8abSmrg    {
40363d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
40463d1a8abSmrg      return __builtin_islessgreater(__type(__f1), __type(__f2));
40563d1a8abSmrg    }
40663d1a8abSmrg
40763d1a8abSmrg  template<typename _Tp>
40863d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
40963d1a8abSmrg					   int>::__type
41063d1a8abSmrg    isunordered(_Tp __f1, _Tp __f2)
41163d1a8abSmrg    {
41263d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
41363d1a8abSmrg      return __builtin_isunordered(__type(__f1), __type(__f2));
41463d1a8abSmrg    }
41563d1a8abSmrg
41663d1a8abSmrg#endif
41763d1a8abSmrg#endif
41863d1a8abSmrg
41963d1a8abSmrg#if _GLIBCXX_USE_C99_MATH_TR1
42063d1a8abSmrg
42163d1a8abSmrg  /** Additional overloads [8.16.4].
42263d1a8abSmrg   *  @{
42363d1a8abSmrg   */
42463d1a8abSmrg
42563d1a8abSmrg  // For functions defined in C++03 the additional overloads are already
42663d1a8abSmrg  // declared in <cmath> so we can just re-declare them in std::tr1.
42763d1a8abSmrg
42863d1a8abSmrg  using std::acos;
42963d1a8abSmrg  using std::asin;
43063d1a8abSmrg  using std::atan;
43163d1a8abSmrg  using std::atan2;
43263d1a8abSmrg  using std::ceil;
43363d1a8abSmrg  using std::cos;
43463d1a8abSmrg  using std::cosh;
43563d1a8abSmrg  using std::exp;
43663d1a8abSmrg  using std::floor;
43763d1a8abSmrg  using std::fmod;
43863d1a8abSmrg  using std::frexp;
43963d1a8abSmrg  using std::ldexp;
44063d1a8abSmrg  using std::log;
44163d1a8abSmrg  using std::log10;
44263d1a8abSmrg  using std::sin;
44363d1a8abSmrg  using std::sinh;
44463d1a8abSmrg  using std::sqrt;
44563d1a8abSmrg  using std::tan;
44663d1a8abSmrg  using std::tanh;
44763d1a8abSmrg
44863d1a8abSmrg#if __cplusplus >= 201103L
44963d1a8abSmrg
45063d1a8abSmrg  // Since C++11, <cmath> defines additional overloads for these functions
45163d1a8abSmrg  // in namespace std.
45263d1a8abSmrg
45363d1a8abSmrg  using std::acosh;
45463d1a8abSmrg  using std::asinh;
45563d1a8abSmrg  using std::atanh;
45663d1a8abSmrg  using std::cbrt;
45763d1a8abSmrg  using std::copysign;
45863d1a8abSmrg  using std::erf;
45963d1a8abSmrg  using std::erfc;
46063d1a8abSmrg  using std::exp2;
46163d1a8abSmrg  using std::expm1;
46263d1a8abSmrg  using std::fdim;
46363d1a8abSmrg  using std::fma;
46463d1a8abSmrg  using std::fmax;
46563d1a8abSmrg  using std::fmin;
46663d1a8abSmrg  using std::hypot;
46763d1a8abSmrg  using std::ilogb;
46863d1a8abSmrg  using std::lgamma;
46963d1a8abSmrg  using std::llrint;
47063d1a8abSmrg  using std::llround;
47163d1a8abSmrg  using std::log1p;
47263d1a8abSmrg  using std::log2;
47363d1a8abSmrg  using std::logb;
47463d1a8abSmrg  using std::lrint;
47563d1a8abSmrg  using std::lround;
47663d1a8abSmrg  using std::nan;
47763d1a8abSmrg  using std::nearbyint;
47863d1a8abSmrg  using std::nextafter;
47963d1a8abSmrg  using std::nexttoward;
48063d1a8abSmrg  using std::remainder;
48163d1a8abSmrg  using std::remquo;
48263d1a8abSmrg  using std::rint;
48363d1a8abSmrg  using std::round;
48463d1a8abSmrg  using std::scalbln;
48563d1a8abSmrg  using std::scalbn;
48663d1a8abSmrg  using std::tgamma;
48763d1a8abSmrg  using std::trunc;
48863d1a8abSmrg
48963d1a8abSmrg#else // __cplusplus < 201103L
49063d1a8abSmrg
49163d1a8abSmrg  // In C++03 we need to provide the additional overloads.
49263d1a8abSmrg
49363d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
49463d1a8abSmrg  inline float
49563d1a8abSmrg  acosh(float __x)
49663d1a8abSmrg  { return __builtin_acoshf(__x); }
49763d1a8abSmrg
49863d1a8abSmrg  inline long double
49963d1a8abSmrg  acosh(long double __x)
50063d1a8abSmrg  { return __builtin_acoshl(__x); }
50163d1a8abSmrg#endif
50263d1a8abSmrg
50363d1a8abSmrg  template<typename _Tp>
50463d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
50563d1a8abSmrg					   double>::__type
50663d1a8abSmrg    acosh(_Tp __x)
50763d1a8abSmrg    { return __builtin_acosh(__x); }
50863d1a8abSmrg
50963d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
51063d1a8abSmrg  inline float
51163d1a8abSmrg  asinh(float __x)
51263d1a8abSmrg  { return __builtin_asinhf(__x); }
51363d1a8abSmrg
51463d1a8abSmrg  inline long double
51563d1a8abSmrg  asinh(long double __x)
51663d1a8abSmrg  { return __builtin_asinhl(__x); }
51763d1a8abSmrg#endif
51863d1a8abSmrg
51963d1a8abSmrg  template<typename _Tp>
52063d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
52163d1a8abSmrg					   double>::__type
52263d1a8abSmrg    asinh(_Tp __x)
52363d1a8abSmrg    { return __builtin_asinh(__x); }
52463d1a8abSmrg
52563d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
52663d1a8abSmrg  inline float
52763d1a8abSmrg  atanh(float __x)
52863d1a8abSmrg  { return __builtin_atanhf(__x); }
52963d1a8abSmrg
53063d1a8abSmrg  inline long double
53163d1a8abSmrg  atanh(long double __x)
53263d1a8abSmrg  { return __builtin_atanhl(__x); }
53363d1a8abSmrg#endif
53463d1a8abSmrg
53563d1a8abSmrg  template<typename _Tp>
53663d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
53763d1a8abSmrg					   double>::__type
53863d1a8abSmrg    atanh(_Tp __x)
53963d1a8abSmrg    { return __builtin_atanh(__x); }
54063d1a8abSmrg
54163d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
54263d1a8abSmrg  inline float
54363d1a8abSmrg  cbrt(float __x)
54463d1a8abSmrg  { return __builtin_cbrtf(__x); }
54563d1a8abSmrg
54663d1a8abSmrg  inline long double
54763d1a8abSmrg  cbrt(long double __x)
54863d1a8abSmrg  { return __builtin_cbrtl(__x); }
54963d1a8abSmrg#endif
55063d1a8abSmrg
55163d1a8abSmrg  template<typename _Tp>
55263d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
55363d1a8abSmrg					   double>::__type
55463d1a8abSmrg    cbrt(_Tp __x)
55563d1a8abSmrg    { return __builtin_cbrt(__x); }
55663d1a8abSmrg
55763d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
55863d1a8abSmrg  inline float
55963d1a8abSmrg  copysign(float __x, float __y)
56063d1a8abSmrg  { return __builtin_copysignf(__x, __y); }
56163d1a8abSmrg
56263d1a8abSmrg  inline long double
56363d1a8abSmrg  copysign(long double __x, long double __y)
56463d1a8abSmrg  { return __builtin_copysignl(__x, __y); }
56563d1a8abSmrg#endif
56663d1a8abSmrg
56763d1a8abSmrg  template<typename _Tp, typename _Up>
56863d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
56963d1a8abSmrg    copysign(_Tp __x, _Up __y)
57063d1a8abSmrg    {
57163d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
57263d1a8abSmrg      return copysign(__type(__x), __type(__y));
57363d1a8abSmrg    }
57463d1a8abSmrg
57563d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
57663d1a8abSmrg  inline float
57763d1a8abSmrg  erf(float __x)
57863d1a8abSmrg  { return __builtin_erff(__x); }
57963d1a8abSmrg
58063d1a8abSmrg  inline long double
58163d1a8abSmrg  erf(long double __x)
58263d1a8abSmrg  { return __builtin_erfl(__x); }
58363d1a8abSmrg#endif
58463d1a8abSmrg
58563d1a8abSmrg  template<typename _Tp>
58663d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
58763d1a8abSmrg					   double>::__type
58863d1a8abSmrg    erf(_Tp __x)
58963d1a8abSmrg    { return __builtin_erf(__x); }
59063d1a8abSmrg
59163d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
59263d1a8abSmrg  inline float
59363d1a8abSmrg  erfc(float __x)
59463d1a8abSmrg  { return __builtin_erfcf(__x); }
59563d1a8abSmrg
59663d1a8abSmrg  inline long double
59763d1a8abSmrg  erfc(long double __x)
59863d1a8abSmrg  { return __builtin_erfcl(__x); }
59963d1a8abSmrg#endif
60063d1a8abSmrg
60163d1a8abSmrg  template<typename _Tp>
60263d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
60363d1a8abSmrg					   double>::__type
60463d1a8abSmrg    erfc(_Tp __x)
60563d1a8abSmrg    { return __builtin_erfc(__x); }
60663d1a8abSmrg
60763d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
60863d1a8abSmrg  inline float
60963d1a8abSmrg  exp2(float __x)
61063d1a8abSmrg  { return __builtin_exp2f(__x); }
61163d1a8abSmrg
61263d1a8abSmrg  inline long double
61363d1a8abSmrg  exp2(long double __x)
61463d1a8abSmrg  { return __builtin_exp2l(__x); }
61563d1a8abSmrg#endif
61663d1a8abSmrg
61763d1a8abSmrg  template<typename _Tp>
61863d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
61963d1a8abSmrg					   double>::__type
62063d1a8abSmrg    exp2(_Tp __x)
62163d1a8abSmrg    { return __builtin_exp2(__x); }
62263d1a8abSmrg
62363d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
62463d1a8abSmrg  inline float
62563d1a8abSmrg  expm1(float __x)
62663d1a8abSmrg  { return __builtin_expm1f(__x); }
62763d1a8abSmrg
62863d1a8abSmrg  inline long double
62963d1a8abSmrg  expm1(long double __x)
63063d1a8abSmrg  { return __builtin_expm1l(__x); }
63163d1a8abSmrg#endif
63263d1a8abSmrg
63363d1a8abSmrg  template<typename _Tp>
63463d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
63563d1a8abSmrg					   double>::__type
63663d1a8abSmrg    expm1(_Tp __x)
63763d1a8abSmrg    { return __builtin_expm1(__x); }
63863d1a8abSmrg
63963d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
64063d1a8abSmrg  inline float
64163d1a8abSmrg  fdim(float __x, float __y)
64263d1a8abSmrg  { return __builtin_fdimf(__x, __y); }
64363d1a8abSmrg
64463d1a8abSmrg  inline long double
64563d1a8abSmrg  fdim(long double __x, long double __y)
64663d1a8abSmrg  { return __builtin_fdiml(__x, __y); }
64763d1a8abSmrg#endif
64863d1a8abSmrg
64963d1a8abSmrg  template<typename _Tp, typename _Up>
65063d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
65163d1a8abSmrg    fdim(_Tp __x, _Up __y)
65263d1a8abSmrg    {
65363d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
65463d1a8abSmrg      return fdim(__type(__x), __type(__y));
65563d1a8abSmrg    }
65663d1a8abSmrg
65763d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
65863d1a8abSmrg  inline float
65963d1a8abSmrg  fma(float __x, float __y, float __z)
66063d1a8abSmrg  { return __builtin_fmaf(__x, __y, __z); }
66163d1a8abSmrg
66263d1a8abSmrg  inline long double
66363d1a8abSmrg  fma(long double __x, long double __y, long double __z)
66463d1a8abSmrg  { return __builtin_fmal(__x, __y, __z); }
66563d1a8abSmrg#endif
66663d1a8abSmrg
66763d1a8abSmrg  template<typename _Tp, typename _Up, typename _Vp>
66863d1a8abSmrg    inline typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type
66963d1a8abSmrg    fma(_Tp __x, _Up __y, _Vp __z)
67063d1a8abSmrg    {
67163d1a8abSmrg      typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type;
67263d1a8abSmrg      return fma(__type(__x), __type(__y), __type(__z));
67363d1a8abSmrg    }
67463d1a8abSmrg
67563d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
67663d1a8abSmrg  inline float
67763d1a8abSmrg  fmax(float __x, float __y)
67863d1a8abSmrg  { return __builtin_fmaxf(__x, __y); }
67963d1a8abSmrg
68063d1a8abSmrg  inline long double
68163d1a8abSmrg  fmax(long double __x, long double __y)
68263d1a8abSmrg  { return __builtin_fmaxl(__x, __y); }
68363d1a8abSmrg#endif
68463d1a8abSmrg
68563d1a8abSmrg  template<typename _Tp, typename _Up>
68663d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
68763d1a8abSmrg    fmax(_Tp __x, _Up __y)
68863d1a8abSmrg    {
68963d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
69063d1a8abSmrg      return fmax(__type(__x), __type(__y));
69163d1a8abSmrg    }
69263d1a8abSmrg
69363d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
69463d1a8abSmrg  inline float
69563d1a8abSmrg  fmin(float __x, float __y)
69663d1a8abSmrg  { return __builtin_fminf(__x, __y); }
69763d1a8abSmrg
69863d1a8abSmrg  inline long double
69963d1a8abSmrg  fmin(long double __x, long double __y)
70063d1a8abSmrg  { return __builtin_fminl(__x, __y); }
70163d1a8abSmrg#endif
70263d1a8abSmrg
70363d1a8abSmrg  template<typename _Tp, typename _Up>
70463d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
70563d1a8abSmrg    fmin(_Tp __x, _Up __y)
70663d1a8abSmrg    {
70763d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
70863d1a8abSmrg      return fmin(__type(__x), __type(__y));
70963d1a8abSmrg    }
71063d1a8abSmrg
71163d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
71263d1a8abSmrg  inline float
71363d1a8abSmrg  hypot(float __x, float __y)
71463d1a8abSmrg  { return __builtin_hypotf(__x, __y); }
71563d1a8abSmrg
71663d1a8abSmrg  inline long double
71763d1a8abSmrg  hypot(long double __x, long double __y)
71863d1a8abSmrg  { return __builtin_hypotl(__x, __y); }
71963d1a8abSmrg#endif
72063d1a8abSmrg
72163d1a8abSmrg  template<typename _Tp, typename _Up>
72263d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
72363d1a8abSmrg    hypot(_Tp __y, _Up __x)
72463d1a8abSmrg    {
72563d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
72663d1a8abSmrg      return hypot(__type(__y), __type(__x));
72763d1a8abSmrg    }
72863d1a8abSmrg
72963d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
73063d1a8abSmrg  inline int
73163d1a8abSmrg  ilogb(float __x)
73263d1a8abSmrg  { return __builtin_ilogbf(__x); }
73363d1a8abSmrg
73463d1a8abSmrg  inline int
73563d1a8abSmrg  ilogb(long double __x)
73663d1a8abSmrg  { return __builtin_ilogbl(__x); }
73763d1a8abSmrg#endif
73863d1a8abSmrg
73963d1a8abSmrg  template<typename _Tp>
74063d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
74163d1a8abSmrg					   int>::__type
74263d1a8abSmrg    ilogb(_Tp __x)
74363d1a8abSmrg    { return __builtin_ilogb(__x); }
74463d1a8abSmrg
74563d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
74663d1a8abSmrg  inline float
74763d1a8abSmrg  lgamma(float __x)
74863d1a8abSmrg  { return __builtin_lgammaf(__x); }
74963d1a8abSmrg
75063d1a8abSmrg  inline long double
75163d1a8abSmrg  lgamma(long double __x)
75263d1a8abSmrg  { return __builtin_lgammal(__x); }
75363d1a8abSmrg#endif
75463d1a8abSmrg
75563d1a8abSmrg  template<typename _Tp>
75663d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
75763d1a8abSmrg					   double>::__type
75863d1a8abSmrg    lgamma(_Tp __x)
75963d1a8abSmrg    { return __builtin_lgamma(__x); }
76063d1a8abSmrg
76163d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
76263d1a8abSmrg  inline long long
76363d1a8abSmrg  llrint(float __x)
76463d1a8abSmrg  { return __builtin_llrintf(__x); }
76563d1a8abSmrg
76663d1a8abSmrg  inline long long
76763d1a8abSmrg  llrint(long double __x)
76863d1a8abSmrg  { return __builtin_llrintl(__x); }
76963d1a8abSmrg#endif
77063d1a8abSmrg
77163d1a8abSmrg  template<typename _Tp>
77263d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
77363d1a8abSmrg					   long long>::__type
77463d1a8abSmrg    llrint(_Tp __x)
77563d1a8abSmrg    { return __builtin_llrint(__x); }
77663d1a8abSmrg
77763d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
77863d1a8abSmrg  inline long long
77963d1a8abSmrg  llround(float __x)
78063d1a8abSmrg  { return __builtin_llroundf(__x); }
78163d1a8abSmrg
78263d1a8abSmrg  inline long long
78363d1a8abSmrg  llround(long double __x)
78463d1a8abSmrg  { return __builtin_llroundl(__x); }
78563d1a8abSmrg#endif
78663d1a8abSmrg
78763d1a8abSmrg  template<typename _Tp>
78863d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
78963d1a8abSmrg					   long long>::__type
79063d1a8abSmrg    llround(_Tp __x)
79163d1a8abSmrg    { return __builtin_llround(__x); }
79263d1a8abSmrg
79363d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
79463d1a8abSmrg  inline float
79563d1a8abSmrg  log1p(float __x)
79663d1a8abSmrg  { return __builtin_log1pf(__x); }
79763d1a8abSmrg
79863d1a8abSmrg  inline long double
79963d1a8abSmrg  log1p(long double __x)
80063d1a8abSmrg  { return __builtin_log1pl(__x); }
80163d1a8abSmrg#endif
80263d1a8abSmrg
80363d1a8abSmrg  template<typename _Tp>
80463d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
80563d1a8abSmrg					   double>::__type
80663d1a8abSmrg    log1p(_Tp __x)
80763d1a8abSmrg    { return __builtin_log1p(__x); }
80863d1a8abSmrg
80963d1a8abSmrg  // DR 568.
81063d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
81163d1a8abSmrg  inline float
81263d1a8abSmrg  log2(float __x)
81363d1a8abSmrg  { return __builtin_log2f(__x); }
81463d1a8abSmrg
81563d1a8abSmrg  inline long double
81663d1a8abSmrg  log2(long double __x)
81763d1a8abSmrg  { return __builtin_log2l(__x); }
81863d1a8abSmrg#endif
81963d1a8abSmrg
82063d1a8abSmrg  template<typename _Tp>
82163d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
82263d1a8abSmrg					   double>::__type
82363d1a8abSmrg    log2(_Tp __x)
82463d1a8abSmrg    { return __builtin_log2(__x); }
82563d1a8abSmrg
82663d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
82763d1a8abSmrg  inline float
82863d1a8abSmrg  logb(float __x)
82963d1a8abSmrg  { return __builtin_logbf(__x); }
83063d1a8abSmrg
83163d1a8abSmrg  inline long double
83263d1a8abSmrg  logb(long double __x)
83363d1a8abSmrg  { return __builtin_logbl(__x); }
83463d1a8abSmrg#endif
83563d1a8abSmrg
83663d1a8abSmrg  template<typename _Tp>
83763d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
83863d1a8abSmrg					   double>::__type
83963d1a8abSmrg    logb(_Tp __x)
84063d1a8abSmrg    {
84163d1a8abSmrg      return __builtin_logb(__x);
84263d1a8abSmrg    }
84363d1a8abSmrg
84463d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
84563d1a8abSmrg  inline long
84663d1a8abSmrg  lrint(float __x)
84763d1a8abSmrg  { return __builtin_lrintf(__x); }
84863d1a8abSmrg
84963d1a8abSmrg  inline long
85063d1a8abSmrg  lrint(long double __x)
85163d1a8abSmrg  { return __builtin_lrintl(__x); }
85263d1a8abSmrg#endif
85363d1a8abSmrg
85463d1a8abSmrg  template<typename _Tp>
85563d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
85663d1a8abSmrg					   long>::__type
85763d1a8abSmrg    lrint(_Tp __x)
85863d1a8abSmrg    { return __builtin_lrint(__x); }
85963d1a8abSmrg
86063d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
86163d1a8abSmrg  inline long
86263d1a8abSmrg  lround(float __x)
86363d1a8abSmrg  { return __builtin_lroundf(__x); }
86463d1a8abSmrg
86563d1a8abSmrg  inline long
86663d1a8abSmrg  lround(long double __x)
86763d1a8abSmrg  { return __builtin_lroundl(__x); }
86863d1a8abSmrg#endif
86963d1a8abSmrg
87063d1a8abSmrg  template<typename _Tp>
87163d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
87263d1a8abSmrg					   long>::__type
87363d1a8abSmrg    lround(_Tp __x)
87463d1a8abSmrg    { return __builtin_lround(__x); }
87563d1a8abSmrg
87663d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
87763d1a8abSmrg  inline float
87863d1a8abSmrg  nearbyint(float __x)
87963d1a8abSmrg  { return __builtin_nearbyintf(__x); }
88063d1a8abSmrg
88163d1a8abSmrg  inline long double
88263d1a8abSmrg  nearbyint(long double __x)
88363d1a8abSmrg  { return __builtin_nearbyintl(__x); }
88463d1a8abSmrg#endif
88563d1a8abSmrg
88663d1a8abSmrg  template<typename _Tp>
88763d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
88863d1a8abSmrg					   double>::__type
88963d1a8abSmrg    nearbyint(_Tp __x)
89063d1a8abSmrg    { return __builtin_nearbyint(__x); }
89163d1a8abSmrg
89263d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
89363d1a8abSmrg  inline float
89463d1a8abSmrg  nextafter(float __x, float __y)
89563d1a8abSmrg  { return __builtin_nextafterf(__x, __y); }
89663d1a8abSmrg
89763d1a8abSmrg  inline long double
89863d1a8abSmrg  nextafter(long double __x, long double __y)
89963d1a8abSmrg  { return __builtin_nextafterl(__x, __y); }
90063d1a8abSmrg#endif
90163d1a8abSmrg
90263d1a8abSmrg  template<typename _Tp, typename _Up>
90363d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
90463d1a8abSmrg    nextafter(_Tp __x, _Up __y)
90563d1a8abSmrg    {
90663d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
90763d1a8abSmrg      return nextafter(__type(__x), __type(__y));
90863d1a8abSmrg    }
90963d1a8abSmrg
91063d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
91163d1a8abSmrg  inline float
91263d1a8abSmrg  nexttoward(float __x, long double __y)
91363d1a8abSmrg  { return __builtin_nexttowardf(__x, __y); }
91463d1a8abSmrg
91563d1a8abSmrg  inline long double
91663d1a8abSmrg  nexttoward(long double __x, long double __y)
91763d1a8abSmrg  { return __builtin_nexttowardl(__x, __y); }
91863d1a8abSmrg#endif
91963d1a8abSmrg
92063d1a8abSmrg  template<typename _Tp>
92163d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
92263d1a8abSmrg					   double>::__type
92363d1a8abSmrg    nexttoward(_Tp __x, long double __y)
92463d1a8abSmrg    { return __builtin_nexttoward(__x, __y); }
92563d1a8abSmrg
92663d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
92763d1a8abSmrg  inline float
92863d1a8abSmrg  remainder(float __x, float __y)
92963d1a8abSmrg  { return __builtin_remainderf(__x, __y); }
93063d1a8abSmrg
93163d1a8abSmrg  inline long double
93263d1a8abSmrg  remainder(long double __x, long double __y)
93363d1a8abSmrg  { return __builtin_remainderl(__x, __y); }
93463d1a8abSmrg#endif
93563d1a8abSmrg
93663d1a8abSmrg  template<typename _Tp, typename _Up>
93763d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
93863d1a8abSmrg    remainder(_Tp __x, _Up __y)
93963d1a8abSmrg    {
94063d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
94163d1a8abSmrg      return remainder(__type(__x), __type(__y));
94263d1a8abSmrg    }
94363d1a8abSmrg
94463d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
94563d1a8abSmrg  inline float
94663d1a8abSmrg  remquo(float __x, float __y, int* __pquo)
94763d1a8abSmrg  { return __builtin_remquof(__x, __y, __pquo); }
94863d1a8abSmrg
94963d1a8abSmrg  inline long double
95063d1a8abSmrg  remquo(long double __x, long double __y, int* __pquo)
95163d1a8abSmrg  { return __builtin_remquol(__x, __y, __pquo); }
95263d1a8abSmrg#endif
95363d1a8abSmrg
95463d1a8abSmrg  template<typename _Tp, typename _Up>
95563d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
95663d1a8abSmrg    remquo(_Tp __x, _Up __y, int* __pquo)
95763d1a8abSmrg    {
95863d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
95963d1a8abSmrg      return remquo(__type(__x), __type(__y), __pquo);
96063d1a8abSmrg    }
96163d1a8abSmrg
96263d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
96363d1a8abSmrg  inline float
96463d1a8abSmrg  rint(float __x)
96563d1a8abSmrg  { return __builtin_rintf(__x); }
96663d1a8abSmrg
96763d1a8abSmrg  inline long double
96863d1a8abSmrg  rint(long double __x)
96963d1a8abSmrg  { return __builtin_rintl(__x); }
97063d1a8abSmrg#endif
97163d1a8abSmrg
97263d1a8abSmrg  template<typename _Tp>
97363d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
97463d1a8abSmrg					   double>::__type
97563d1a8abSmrg    rint(_Tp __x)
97663d1a8abSmrg    { return __builtin_rint(__x); }
97763d1a8abSmrg
97863d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
97963d1a8abSmrg  inline float
98063d1a8abSmrg  round(float __x)
98163d1a8abSmrg  { return __builtin_roundf(__x); }
98263d1a8abSmrg
98363d1a8abSmrg  inline long double
98463d1a8abSmrg  round(long double __x)
98563d1a8abSmrg  { return __builtin_roundl(__x); }
98663d1a8abSmrg#endif
98763d1a8abSmrg
98863d1a8abSmrg  template<typename _Tp>
98963d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
99063d1a8abSmrg					   double>::__type
99163d1a8abSmrg    round(_Tp __x)
99263d1a8abSmrg    { return __builtin_round(__x); }
99363d1a8abSmrg
99463d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
99563d1a8abSmrg  inline float
99663d1a8abSmrg  scalbln(float __x, long __ex)
99763d1a8abSmrg  { return __builtin_scalblnf(__x, __ex); }
99863d1a8abSmrg
99963d1a8abSmrg  inline long double
100063d1a8abSmrg  scalbln(long double __x, long __ex)
100163d1a8abSmrg  { return __builtin_scalblnl(__x, __ex); }
100263d1a8abSmrg#endif
100363d1a8abSmrg
100463d1a8abSmrg  template<typename _Tp>
100563d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
100663d1a8abSmrg					   double>::__type
100763d1a8abSmrg    scalbln(_Tp __x, long __ex)
100863d1a8abSmrg    { return __builtin_scalbln(__x, __ex); }
100963d1a8abSmrg
101063d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
101163d1a8abSmrg  inline float
101263d1a8abSmrg  scalbn(float __x, int __ex)
101363d1a8abSmrg  { return __builtin_scalbnf(__x, __ex); }
101463d1a8abSmrg
101563d1a8abSmrg  inline long double
101663d1a8abSmrg  scalbn(long double __x, int __ex)
101763d1a8abSmrg  { return __builtin_scalbnl(__x, __ex); }
101863d1a8abSmrg#endif
101963d1a8abSmrg
102063d1a8abSmrg  template<typename _Tp>
102163d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
102263d1a8abSmrg					   double>::__type
102363d1a8abSmrg    scalbn(_Tp __x, int __ex)
102463d1a8abSmrg    { return __builtin_scalbn(__x, __ex); }
102563d1a8abSmrg
102663d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
102763d1a8abSmrg  inline float
102863d1a8abSmrg  tgamma(float __x)
102963d1a8abSmrg  { return __builtin_tgammaf(__x); }
103063d1a8abSmrg
103163d1a8abSmrg  inline long double
103263d1a8abSmrg  tgamma(long double __x)
103363d1a8abSmrg  { return __builtin_tgammal(__x); }
103463d1a8abSmrg#endif
103563d1a8abSmrg
103663d1a8abSmrg  template<typename _Tp>
103763d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
103863d1a8abSmrg					   double>::__type
103963d1a8abSmrg    tgamma(_Tp __x)
104063d1a8abSmrg    { return __builtin_tgamma(__x); }
104163d1a8abSmrg
104263d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
104363d1a8abSmrg  inline float
104463d1a8abSmrg  trunc(float __x)
104563d1a8abSmrg  { return __builtin_truncf(__x); }
104663d1a8abSmrg
104763d1a8abSmrg  inline long double
104863d1a8abSmrg  trunc(long double __x)
104963d1a8abSmrg  { return __builtin_truncl(__x); }
105063d1a8abSmrg#endif
105163d1a8abSmrg
105263d1a8abSmrg  template<typename _Tp>
105363d1a8abSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
105463d1a8abSmrg					   double>::__type
105563d1a8abSmrg    trunc(_Tp __x)
105663d1a8abSmrg    { return __builtin_trunc(__x); }
105763d1a8abSmrg
105863d1a8abSmrg#endif // __cplusplus < 201103L
105963d1a8abSmrg
1060*ec02198aSmrg  /// @}
106163d1a8abSmrg
1062c7a68eb7Smrg#endif /* _GLIBCXX_USE_C99_MATH_TR1 */
106363d1a8abSmrg
106463d1a8abSmrg  // DR 550. What should the return type of pow(float,int) be?
106563d1a8abSmrg  // NB: C++11 and TR1 != C++03.
106663d1a8abSmrg
106763d1a8abSmrg  // We cannot do "using std::pow;" because that would bring in unwanted
106863d1a8abSmrg  // pow(*, int) overloads in C++03, with the wrong return type. Instead we
106963d1a8abSmrg  // define all the necessary overloads, but the std::tr1::pow(double, double)
107063d1a8abSmrg  // overload cannot be provided here, because <tr1/math.h> would add it to
107163d1a8abSmrg  // the global namespace where it would clash with ::pow(double,double) from
107263d1a8abSmrg  // libc (revealed by the fix of PR c++/54537).
107363d1a8abSmrg  // The solution is to forward std::tr1::pow(double,double) to
107463d1a8abSmrg  // std::pow(double,double) via the function template below. See
107563d1a8abSmrg  // the discussion about this issue here:
107663d1a8abSmrg  // http://gcc.gnu.org/ml/gcc-patches/2012-09/msg01278.html
107763d1a8abSmrg
107863d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
107963d1a8abSmrg  inline float
108063d1a8abSmrg  pow(float __x, float __y)
108163d1a8abSmrg  { return std::pow(__x, __y); }
108263d1a8abSmrg
108363d1a8abSmrg  inline long double
108463d1a8abSmrg  pow(long double __x, long double __y)
108563d1a8abSmrg  { return std::pow(__x, __y); }
108663d1a8abSmrg#endif
108763d1a8abSmrg
108863d1a8abSmrg  template<typename _Tp, typename _Up>
108963d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
109063d1a8abSmrg    pow(_Tp __x, _Up __y)
109163d1a8abSmrg    {
109263d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
109363d1a8abSmrg      return std::pow(__type(__x), __type(__y));
109463d1a8abSmrg    }
109563d1a8abSmrg
109663d1a8abSmrg#if __cplusplus >= 201103L
109763d1a8abSmrg  // We also deal with fabs in a special way, because "using std::fabs;"
109863d1a8abSmrg  // could bring in C++11's std::fabs<T>(const std::complex<T>&) with a
109963d1a8abSmrg  // different return type from std::tr1::fabs<T>(const std::complex<T>&).
110063d1a8abSmrg  // We define the necessary overloads, except std::tr1::fabs(double) which
110163d1a8abSmrg  // could clash with ::fabs(double) from libc.
110263d1a8abSmrg  // The function template handles double as well as integers, forwarding
110363d1a8abSmrg  // to std::fabs.
110463d1a8abSmrg
110563d1a8abSmrg#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
110663d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
110763d1a8abSmrg  inline float
110863d1a8abSmrg  fabs(float __x)
110963d1a8abSmrg  { return __builtin_fabsf(__x); }
111063d1a8abSmrg
111163d1a8abSmrg  inline long double
111263d1a8abSmrg  fabs(long double __x)
111363d1a8abSmrg  { return __builtin_fabsl(__x); }
111463d1a8abSmrg#endif
111563d1a8abSmrg#endif
111663d1a8abSmrg
111763d1a8abSmrg  template<typename _Tp>
111863d1a8abSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
111963d1a8abSmrg    fabs(_Tp __x)
112063d1a8abSmrg    { return std::fabs(__x); }
112163d1a8abSmrg
112263d1a8abSmrg#else  // ! C++11
112363d1a8abSmrg
112463d1a8abSmrg  // For C++03 just use std::fabs as there is no overload for std::complex<>.
112563d1a8abSmrg  using std::fabs;
112663d1a8abSmrg
112763d1a8abSmrg#endif // C++11
112863d1a8abSmrg
1129*ec02198aSmrg} // namespace tr1
1130*ec02198aSmrg_GLIBCXX_END_NAMESPACE_VERSION
1131*ec02198aSmrg} // namespace std
113263d1a8abSmrg
113363d1a8abSmrg/**
1134*ec02198aSmrg * @defgroup tr1_math_spec_func TR1 Mathematical Special Functions
113563d1a8abSmrg * @ingroup numerics
113663d1a8abSmrg *
113763d1a8abSmrg * A collection of advanced mathematical special functions.
113863d1a8abSmrg */
113963d1a8abSmrg
1140*ec02198aSmrg#if _GLIBCXX_USE_STD_SPEC_FUNCS
1141*ec02198aSmrg
1142*ec02198aSmrgnamespace std _GLIBCXX_VISIBILITY(default)
1143*ec02198aSmrg{
1144*ec02198aSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
1145*ec02198aSmrg
1146*ec02198aSmrgnamespace tr1
1147*ec02198aSmrg{
114863d1a8abSmrg  using std::assoc_laguerref;
114963d1a8abSmrg  using std::assoc_laguerrel;
115063d1a8abSmrg  using std::assoc_laguerre;
115163d1a8abSmrg
115263d1a8abSmrg  using std::assoc_legendref;
115363d1a8abSmrg  using std::assoc_legendrel;
115463d1a8abSmrg  using std::assoc_legendre;
115563d1a8abSmrg
115663d1a8abSmrg  using std::betaf;
115763d1a8abSmrg  using std::betal;
115863d1a8abSmrg  using std::beta;
115963d1a8abSmrg
116063d1a8abSmrg  using std::comp_ellint_1f;
116163d1a8abSmrg  using std::comp_ellint_1l;
116263d1a8abSmrg  using std::comp_ellint_1;
116363d1a8abSmrg
116463d1a8abSmrg  using std::comp_ellint_2f;
116563d1a8abSmrg  using std::comp_ellint_2l;
116663d1a8abSmrg  using std::comp_ellint_2;
116763d1a8abSmrg
116863d1a8abSmrg  using std::comp_ellint_3f;
116963d1a8abSmrg  using std::comp_ellint_3l;
117063d1a8abSmrg  using std::comp_ellint_3;
117163d1a8abSmrg
117263d1a8abSmrg  using std::cyl_bessel_if;
117363d1a8abSmrg  using std::cyl_bessel_il;
117463d1a8abSmrg  using std::cyl_bessel_i;
117563d1a8abSmrg
117663d1a8abSmrg  using std::cyl_bessel_jf;
117763d1a8abSmrg  using std::cyl_bessel_jl;
117863d1a8abSmrg  using std::cyl_bessel_j;
117963d1a8abSmrg
118063d1a8abSmrg  using std::cyl_bessel_kf;
118163d1a8abSmrg  using std::cyl_bessel_kl;
118263d1a8abSmrg  using std::cyl_bessel_k;
118363d1a8abSmrg
118463d1a8abSmrg  using std::cyl_neumannf;
118563d1a8abSmrg  using std::cyl_neumannl;
118663d1a8abSmrg  using std::cyl_neumann;
118763d1a8abSmrg
118863d1a8abSmrg  using std::ellint_1f;
118963d1a8abSmrg  using std::ellint_1l;
119063d1a8abSmrg  using std::ellint_1;
119163d1a8abSmrg
119263d1a8abSmrg  using std::ellint_2f;
119363d1a8abSmrg  using std::ellint_2l;
119463d1a8abSmrg  using std::ellint_2;
119563d1a8abSmrg
119663d1a8abSmrg  using std::ellint_3f;
119763d1a8abSmrg  using std::ellint_3l;
119863d1a8abSmrg  using std::ellint_3;
119963d1a8abSmrg
120063d1a8abSmrg  using std::expintf;
120163d1a8abSmrg  using std::expintl;
120263d1a8abSmrg  using std::expint;
120363d1a8abSmrg
120463d1a8abSmrg  using std::hermitef;
120563d1a8abSmrg  using std::hermitel;
120663d1a8abSmrg  using std::hermite;
120763d1a8abSmrg
120863d1a8abSmrg  using std::laguerref;
120963d1a8abSmrg  using std::laguerrel;
121063d1a8abSmrg  using std::laguerre;
121163d1a8abSmrg
121263d1a8abSmrg  using std::legendref;
121363d1a8abSmrg  using std::legendrel;
121463d1a8abSmrg  using std::legendre;
121563d1a8abSmrg
121663d1a8abSmrg  using std::riemann_zetaf;
121763d1a8abSmrg  using std::riemann_zetal;
121863d1a8abSmrg  using std::riemann_zeta;
121963d1a8abSmrg
122063d1a8abSmrg  using std::sph_besself;
122163d1a8abSmrg  using std::sph_bessell;
122263d1a8abSmrg  using std::sph_bessel;
122363d1a8abSmrg
122463d1a8abSmrg  using std::sph_legendref;
122563d1a8abSmrg  using std::sph_legendrel;
122663d1a8abSmrg  using std::sph_legendre;
122763d1a8abSmrg
122863d1a8abSmrg  using std::sph_neumannf;
122963d1a8abSmrg  using std::sph_neumannl;
123063d1a8abSmrg  using std::sph_neumann;
123163d1a8abSmrg
1232c7a68eb7Smrg} // namespace tr1
1233c7a68eb7Smrg_GLIBCXX_END_NAMESPACE_VERSION
1234c7a68eb7Smrg} // namespace std
1235c7a68eb7Smrg
1236*ec02198aSmrg#else // ! _GLIBCXX_USE_STD_SPEC_FUNCS
1237*ec02198aSmrg
123863d1a8abSmrg#include <bits/stl_algobase.h>
123963d1a8abSmrg#include <limits>
124063d1a8abSmrg#include <tr1/type_traits>
124163d1a8abSmrg
124263d1a8abSmrg#include <tr1/gamma.tcc>
124363d1a8abSmrg#include <tr1/bessel_function.tcc>
124463d1a8abSmrg#include <tr1/beta_function.tcc>
124563d1a8abSmrg#include <tr1/ell_integral.tcc>
124663d1a8abSmrg#include <tr1/exp_integral.tcc>
124763d1a8abSmrg#include <tr1/legendre_function.tcc>
124863d1a8abSmrg#include <tr1/modified_bessel_func.tcc>
124963d1a8abSmrg#include <tr1/poly_hermite.tcc>
125063d1a8abSmrg#include <tr1/poly_laguerre.tcc>
125163d1a8abSmrg#include <tr1/riemann_zeta.tcc>
125263d1a8abSmrg
125363d1a8abSmrgnamespace std _GLIBCXX_VISIBILITY(default)
125463d1a8abSmrg{
125563d1a8abSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
1256c7a68eb7Smrgnamespace tr1
1257c7a68eb7Smrg  {
1258*ec02198aSmrg  /** @addtogroup tr1_math_spec_func
125963d1a8abSmrg   *  @{
126063d1a8abSmrg   */
126163d1a8abSmrg
126263d1a8abSmrg  inline float
126363d1a8abSmrg  assoc_laguerref(unsigned int __n, unsigned int __m, float __x)
126463d1a8abSmrg  { return __detail::__assoc_laguerre<float>(__n, __m, __x); }
126563d1a8abSmrg
126663d1a8abSmrg  inline long double
126763d1a8abSmrg  assoc_laguerrel(unsigned int __n, unsigned int __m, long double __x)
126863d1a8abSmrg  {
126963d1a8abSmrg    return __detail::__assoc_laguerre<long double>(__n, __m, __x);
127063d1a8abSmrg  }
127163d1a8abSmrg
127263d1a8abSmrg  ///  5.2.1.1  Associated Laguerre polynomials.
127363d1a8abSmrg  template<typename _Tp>
127463d1a8abSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
127563d1a8abSmrg    assoc_laguerre(unsigned int __n, unsigned int __m, _Tp __x)
127663d1a8abSmrg    {
127763d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
127863d1a8abSmrg      return __detail::__assoc_laguerre<__type>(__n, __m, __x);
127963d1a8abSmrg    }
128063d1a8abSmrg
128163d1a8abSmrg  inline float
128263d1a8abSmrg  assoc_legendref(unsigned int __l, unsigned int __m, float __x)
128363d1a8abSmrg  { return __detail::__assoc_legendre_p<float>(__l, __m, __x); }
128463d1a8abSmrg
128563d1a8abSmrg  inline long double
128663d1a8abSmrg  assoc_legendrel(unsigned int __l, unsigned int __m, long double __x)
128763d1a8abSmrg  { return __detail::__assoc_legendre_p<long double>(__l, __m, __x); }
128863d1a8abSmrg
128963d1a8abSmrg  ///  5.2.1.2  Associated Legendre functions.
129063d1a8abSmrg  template<typename _Tp>
129163d1a8abSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
129263d1a8abSmrg    assoc_legendre(unsigned int __l, unsigned int __m, _Tp __x)
129363d1a8abSmrg    {
129463d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
129563d1a8abSmrg      return __detail::__assoc_legendre_p<__type>(__l, __m, __x);
129663d1a8abSmrg    }
129763d1a8abSmrg
129863d1a8abSmrg  inline float
129963d1a8abSmrg  betaf(float __x, float __y)
130063d1a8abSmrg  { return __detail::__beta<float>(__x, __y); }
130163d1a8abSmrg
130263d1a8abSmrg  inline long double
130363d1a8abSmrg  betal(long double __x, long double __y)
130463d1a8abSmrg  { return __detail::__beta<long double>(__x, __y); }
130563d1a8abSmrg
130663d1a8abSmrg  ///  5.2.1.3  Beta functions.
130763d1a8abSmrg  template<typename _Tpx, typename _Tpy>
130863d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tpx, _Tpy>::__type
130963d1a8abSmrg    beta(_Tpx __x, _Tpy __y)
131063d1a8abSmrg    {
131163d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tpx, _Tpy>::__type __type;
131263d1a8abSmrg      return __detail::__beta<__type>(__x, __y);
131363d1a8abSmrg    }
131463d1a8abSmrg
131563d1a8abSmrg  inline float
131663d1a8abSmrg  comp_ellint_1f(float __k)
131763d1a8abSmrg  { return __detail::__comp_ellint_1<float>(__k); }
131863d1a8abSmrg
131963d1a8abSmrg  inline long double
132063d1a8abSmrg  comp_ellint_1l(long double __k)
132163d1a8abSmrg  { return __detail::__comp_ellint_1<long double>(__k); }
132263d1a8abSmrg
132363d1a8abSmrg  ///  5.2.1.4  Complete elliptic integrals of the first kind.
132463d1a8abSmrg  template<typename _Tp>
132563d1a8abSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
132663d1a8abSmrg    comp_ellint_1(_Tp __k)
132763d1a8abSmrg    {
132863d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
132963d1a8abSmrg      return __detail::__comp_ellint_1<__type>(__k);
133063d1a8abSmrg    }
133163d1a8abSmrg
133263d1a8abSmrg  inline float
133363d1a8abSmrg  comp_ellint_2f(float __k)
133463d1a8abSmrg  { return __detail::__comp_ellint_2<float>(__k); }
133563d1a8abSmrg
133663d1a8abSmrg  inline long double
133763d1a8abSmrg  comp_ellint_2l(long double __k)
133863d1a8abSmrg  { return __detail::__comp_ellint_2<long double>(__k); }
133963d1a8abSmrg
134063d1a8abSmrg  ///  5.2.1.5  Complete elliptic integrals of the second kind.
134163d1a8abSmrg  template<typename _Tp>
134263d1a8abSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
134363d1a8abSmrg    comp_ellint_2(_Tp __k)
134463d1a8abSmrg    {
134563d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
134663d1a8abSmrg      return __detail::__comp_ellint_2<__type>(__k);
134763d1a8abSmrg    }
134863d1a8abSmrg
134963d1a8abSmrg  inline float
135063d1a8abSmrg  comp_ellint_3f(float __k, float __nu)
135163d1a8abSmrg  { return __detail::__comp_ellint_3<float>(__k, __nu); }
135263d1a8abSmrg
135363d1a8abSmrg  inline long double
135463d1a8abSmrg  comp_ellint_3l(long double __k, long double __nu)
135563d1a8abSmrg  { return __detail::__comp_ellint_3<long double>(__k, __nu); }
135663d1a8abSmrg
135763d1a8abSmrg  ///  5.2.1.6  Complete elliptic integrals of the third kind.
135863d1a8abSmrg  template<typename _Tp, typename _Tpn>
135963d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type
136063d1a8abSmrg    comp_ellint_3(_Tp __k, _Tpn __nu)
136163d1a8abSmrg    {
136263d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type __type;
136363d1a8abSmrg      return __detail::__comp_ellint_3<__type>(__k, __nu);
136463d1a8abSmrg    }
136563d1a8abSmrg
136663d1a8abSmrg  inline float
136763d1a8abSmrg  cyl_bessel_if(float __nu, float __x)
136863d1a8abSmrg  { return __detail::__cyl_bessel_i<float>(__nu, __x); }
136963d1a8abSmrg
137063d1a8abSmrg  inline long double
137163d1a8abSmrg  cyl_bessel_il(long double __nu, long double __x)
137263d1a8abSmrg  { return __detail::__cyl_bessel_i<long double>(__nu, __x); }
137363d1a8abSmrg
137463d1a8abSmrg  ///  5.2.1.8  Regular modified cylindrical Bessel functions.
137563d1a8abSmrg  template<typename _Tpnu, typename _Tp>
137663d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
137763d1a8abSmrg    cyl_bessel_i(_Tpnu __nu, _Tp __x)
137863d1a8abSmrg    {
137963d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
138063d1a8abSmrg      return __detail::__cyl_bessel_i<__type>(__nu, __x);
138163d1a8abSmrg    }
138263d1a8abSmrg
138363d1a8abSmrg  inline float
138463d1a8abSmrg  cyl_bessel_jf(float __nu, float __x)
138563d1a8abSmrg  { return __detail::__cyl_bessel_j<float>(__nu, __x); }
138663d1a8abSmrg
138763d1a8abSmrg  inline long double
138863d1a8abSmrg  cyl_bessel_jl(long double __nu, long double __x)
138963d1a8abSmrg  { return __detail::__cyl_bessel_j<long double>(__nu, __x); }
139063d1a8abSmrg
139163d1a8abSmrg  ///  5.2.1.9  Cylindrical Bessel functions (of the first kind).
139263d1a8abSmrg  template<typename _Tpnu, typename _Tp>
139363d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
139463d1a8abSmrg    cyl_bessel_j(_Tpnu __nu, _Tp __x)
139563d1a8abSmrg    {
139663d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
139763d1a8abSmrg      return __detail::__cyl_bessel_j<__type>(__nu, __x);
139863d1a8abSmrg    }
139963d1a8abSmrg
140063d1a8abSmrg  inline float
140163d1a8abSmrg  cyl_bessel_kf(float __nu, float __x)
140263d1a8abSmrg  { return __detail::__cyl_bessel_k<float>(__nu, __x); }
140363d1a8abSmrg
140463d1a8abSmrg  inline long double
140563d1a8abSmrg  cyl_bessel_kl(long double __nu, long double __x)
140663d1a8abSmrg  { return __detail::__cyl_bessel_k<long double>(__nu, __x); }
140763d1a8abSmrg
140863d1a8abSmrg  ///  5.2.1.10  Irregular modified cylindrical Bessel functions.
140963d1a8abSmrg  template<typename _Tpnu, typename _Tp>
141063d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
141163d1a8abSmrg    cyl_bessel_k(_Tpnu __nu, _Tp __x)
141263d1a8abSmrg    {
141363d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
141463d1a8abSmrg      return __detail::__cyl_bessel_k<__type>(__nu, __x);
141563d1a8abSmrg    }
141663d1a8abSmrg
141763d1a8abSmrg  inline float
141863d1a8abSmrg  cyl_neumannf(float __nu, float __x)
141963d1a8abSmrg  { return __detail::__cyl_neumann_n<float>(__nu, __x); }
142063d1a8abSmrg
142163d1a8abSmrg  inline long double
142263d1a8abSmrg  cyl_neumannl(long double __nu, long double __x)
142363d1a8abSmrg  { return __detail::__cyl_neumann_n<long double>(__nu, __x); }
142463d1a8abSmrg
142563d1a8abSmrg  ///  5.2.1.11  Cylindrical Neumann functions.
142663d1a8abSmrg  template<typename _Tpnu, typename _Tp>
142763d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type
142863d1a8abSmrg    cyl_neumann(_Tpnu __nu, _Tp __x)
142963d1a8abSmrg    {
143063d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type;
143163d1a8abSmrg      return __detail::__cyl_neumann_n<__type>(__nu, __x);
143263d1a8abSmrg    }
143363d1a8abSmrg
143463d1a8abSmrg  inline float
143563d1a8abSmrg  ellint_1f(float __k, float __phi)
143663d1a8abSmrg  { return __detail::__ellint_1<float>(__k, __phi); }
143763d1a8abSmrg
143863d1a8abSmrg  inline long double
143963d1a8abSmrg  ellint_1l(long double __k, long double __phi)
144063d1a8abSmrg  { return __detail::__ellint_1<long double>(__k, __phi); }
144163d1a8abSmrg
144263d1a8abSmrg  ///  5.2.1.12  Incomplete elliptic integrals of the first kind.
144363d1a8abSmrg  template<typename _Tp, typename _Tpp>
144463d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type
144563d1a8abSmrg    ellint_1(_Tp __k, _Tpp __phi)
144663d1a8abSmrg    {
144763d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type;
144863d1a8abSmrg      return __detail::__ellint_1<__type>(__k, __phi);
144963d1a8abSmrg    }
145063d1a8abSmrg
145163d1a8abSmrg  inline float
145263d1a8abSmrg  ellint_2f(float __k, float __phi)
145363d1a8abSmrg  { return __detail::__ellint_2<float>(__k, __phi); }
145463d1a8abSmrg
145563d1a8abSmrg  inline long double
145663d1a8abSmrg  ellint_2l(long double __k, long double __phi)
145763d1a8abSmrg  { return __detail::__ellint_2<long double>(__k, __phi); }
145863d1a8abSmrg
145963d1a8abSmrg  ///  5.2.1.13  Incomplete elliptic integrals of the second kind.
146063d1a8abSmrg  template<typename _Tp, typename _Tpp>
146163d1a8abSmrg    inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type
146263d1a8abSmrg    ellint_2(_Tp __k, _Tpp __phi)
146363d1a8abSmrg    {
146463d1a8abSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type;
146563d1a8abSmrg      return __detail::__ellint_2<__type>(__k, __phi);
146663d1a8abSmrg    }
146763d1a8abSmrg
146863d1a8abSmrg  inline float
146963d1a8abSmrg  ellint_3f(float __k, float __nu, float __phi)
147063d1a8abSmrg  { return __detail::__ellint_3<float>(__k, __nu, __phi); }
147163d1a8abSmrg
147263d1a8abSmrg  inline long double
147363d1a8abSmrg  ellint_3l(long double __k, long double __nu, long double __phi)
147463d1a8abSmrg  { return __detail::__ellint_3<long double>(__k, __nu, __phi); }
147563d1a8abSmrg
147663d1a8abSmrg  ///  5.2.1.14  Incomplete elliptic integrals of the third kind.
147763d1a8abSmrg  template<typename _Tp, typename _Tpn, typename _Tpp>
147863d1a8abSmrg    inline typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type
147963d1a8abSmrg    ellint_3(_Tp __k, _Tpn __nu, _Tpp __phi)
148063d1a8abSmrg    {
148163d1a8abSmrg      typedef typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type __type;
148263d1a8abSmrg      return __detail::__ellint_3<__type>(__k, __nu, __phi);
148363d1a8abSmrg    }
148463d1a8abSmrg
148563d1a8abSmrg  inline float
148663d1a8abSmrg  expintf(float __x)
148763d1a8abSmrg  { return __detail::__expint<float>(__x); }
148863d1a8abSmrg
148963d1a8abSmrg  inline long double
149063d1a8abSmrg  expintl(long double __x)
149163d1a8abSmrg  { return __detail::__expint<long double>(__x); }
149263d1a8abSmrg
149363d1a8abSmrg  ///  5.2.1.15  Exponential integrals.
149463d1a8abSmrg  template<typename _Tp>
149563d1a8abSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
149663d1a8abSmrg    expint(_Tp __x)
149763d1a8abSmrg    {
149863d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
149963d1a8abSmrg      return __detail::__expint<__type>(__x);
150063d1a8abSmrg    }
150163d1a8abSmrg
150263d1a8abSmrg  inline float
150363d1a8abSmrg  hermitef(unsigned int __n, float __x)
150463d1a8abSmrg  { return __detail::__poly_hermite<float>(__n, __x); }
150563d1a8abSmrg
150663d1a8abSmrg  inline long double
150763d1a8abSmrg  hermitel(unsigned int __n, long double __x)
150863d1a8abSmrg  { return __detail::__poly_hermite<long double>(__n, __x); }
150963d1a8abSmrg
151063d1a8abSmrg  ///  5.2.1.16  Hermite polynomials.
151163d1a8abSmrg  template<typename _Tp>
151263d1a8abSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
151363d1a8abSmrg    hermite(unsigned int __n, _Tp __x)
151463d1a8abSmrg    {
151563d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
151663d1a8abSmrg      return __detail::__poly_hermite<__type>(__n, __x);
151763d1a8abSmrg    }
151863d1a8abSmrg
151963d1a8abSmrg  inline float
152063d1a8abSmrg  laguerref(unsigned int __n, float __x)
152163d1a8abSmrg  { return __detail::__laguerre<float>(__n, __x); }
152263d1a8abSmrg
152363d1a8abSmrg  inline long double
152463d1a8abSmrg  laguerrel(unsigned int __n, long double __x)
152563d1a8abSmrg  { return __detail::__laguerre<long double>(__n, __x); }
152663d1a8abSmrg
152763d1a8abSmrg  ///  5.2.1.18  Laguerre polynomials.
152863d1a8abSmrg  template<typename _Tp>
152963d1a8abSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
153063d1a8abSmrg    laguerre(unsigned int __n, _Tp __x)
153163d1a8abSmrg    {
153263d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
153363d1a8abSmrg      return __detail::__laguerre<__type>(__n, __x);
153463d1a8abSmrg    }
153563d1a8abSmrg
153663d1a8abSmrg  inline float
153763d1a8abSmrg  legendref(unsigned int __n, float __x)
153863d1a8abSmrg  { return __detail::__poly_legendre_p<float>(__n, __x); }
153963d1a8abSmrg
154063d1a8abSmrg  inline long double
154163d1a8abSmrg  legendrel(unsigned int __n, long double __x)
154263d1a8abSmrg  { return __detail::__poly_legendre_p<long double>(__n, __x); }
154363d1a8abSmrg
154463d1a8abSmrg  ///  5.2.1.19  Legendre polynomials.
154563d1a8abSmrg  template<typename _Tp>
154663d1a8abSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
154763d1a8abSmrg    legendre(unsigned int __n, _Tp __x)
154863d1a8abSmrg    {
154963d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
155063d1a8abSmrg      return __detail::__poly_legendre_p<__type>(__n, __x);
155163d1a8abSmrg    }
155263d1a8abSmrg
155363d1a8abSmrg  inline float
155463d1a8abSmrg  riemann_zetaf(float __x)
155563d1a8abSmrg  { return __detail::__riemann_zeta<float>(__x); }
155663d1a8abSmrg
155763d1a8abSmrg  inline long double
155863d1a8abSmrg  riemann_zetal(long double __x)
155963d1a8abSmrg  { return __detail::__riemann_zeta<long double>(__x); }
156063d1a8abSmrg
156163d1a8abSmrg  ///  5.2.1.20  Riemann zeta function.
156263d1a8abSmrg  template<typename _Tp>
156363d1a8abSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
156463d1a8abSmrg    riemann_zeta(_Tp __x)
156563d1a8abSmrg    {
156663d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
156763d1a8abSmrg      return __detail::__riemann_zeta<__type>(__x);
156863d1a8abSmrg    }
156963d1a8abSmrg
157063d1a8abSmrg  inline float
157163d1a8abSmrg  sph_besself(unsigned int __n, float __x)
157263d1a8abSmrg  { return __detail::__sph_bessel<float>(__n, __x); }
157363d1a8abSmrg
157463d1a8abSmrg  inline long double
157563d1a8abSmrg  sph_bessell(unsigned int __n, long double __x)
157663d1a8abSmrg  { return __detail::__sph_bessel<long double>(__n, __x); }
157763d1a8abSmrg
157863d1a8abSmrg  ///  5.2.1.21  Spherical Bessel functions.
157963d1a8abSmrg  template<typename _Tp>
158063d1a8abSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
158163d1a8abSmrg    sph_bessel(unsigned int __n, _Tp __x)
158263d1a8abSmrg    {
158363d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
158463d1a8abSmrg      return __detail::__sph_bessel<__type>(__n, __x);
158563d1a8abSmrg    }
158663d1a8abSmrg
158763d1a8abSmrg  inline float
158863d1a8abSmrg  sph_legendref(unsigned int __l, unsigned int __m, float __theta)
158963d1a8abSmrg  { return __detail::__sph_legendre<float>(__l, __m, __theta); }
159063d1a8abSmrg
159163d1a8abSmrg  inline long double
159263d1a8abSmrg  sph_legendrel(unsigned int __l, unsigned int __m, long double __theta)
159363d1a8abSmrg  { return __detail::__sph_legendre<long double>(__l, __m, __theta); }
159463d1a8abSmrg
159563d1a8abSmrg  ///  5.2.1.22  Spherical associated Legendre functions.
159663d1a8abSmrg  template<typename _Tp>
159763d1a8abSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
159863d1a8abSmrg    sph_legendre(unsigned int __l, unsigned int __m, _Tp __theta)
159963d1a8abSmrg    {
160063d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
160163d1a8abSmrg      return __detail::__sph_legendre<__type>(__l, __m, __theta);
160263d1a8abSmrg    }
160363d1a8abSmrg
160463d1a8abSmrg  inline float
160563d1a8abSmrg  sph_neumannf(unsigned int __n, float __x)
160663d1a8abSmrg  { return __detail::__sph_neumann<float>(__n, __x); }
160763d1a8abSmrg
160863d1a8abSmrg  inline long double
160963d1a8abSmrg  sph_neumannl(unsigned int __n, long double __x)
161063d1a8abSmrg  { return __detail::__sph_neumann<long double>(__n, __x); }
161163d1a8abSmrg
161263d1a8abSmrg  ///  5.2.1.23  Spherical Neumann functions.
161363d1a8abSmrg  template<typename _Tp>
161463d1a8abSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
161563d1a8abSmrg    sph_neumann(unsigned int __n, _Tp __x)
161663d1a8abSmrg    {
161763d1a8abSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
161863d1a8abSmrg      return __detail::__sph_neumann<__type>(__n, __x);
161963d1a8abSmrg    }
162063d1a8abSmrg
1621*ec02198aSmrg  /// @} tr1_math_spec_func
162263d1a8abSmrg
1623c7a68eb7Smrg} // namespace tr1
1624c7a68eb7Smrg
1625c7a68eb7Smrg_GLIBCXX_END_NAMESPACE_VERSION
1626c7a68eb7Smrg} // namespace std
1627c7a68eb7Smrg
1628*ec02198aSmrg#endif // _GLIBCXX_USE_STD_SPEC_FUNCS
1629*ec02198aSmrg
1630c7a68eb7Smrg#if _GLIBCXX_USE_STD_SPEC_FUNCS && !defined(__STRICT_ANSI__)
1631c7a68eb7Smrgnamespace std _GLIBCXX_VISIBILITY(default)
1632c7a68eb7Smrg{
1633c7a68eb7Smrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
1634c7a68eb7Smrg
1635c7a68eb7Smrgnamespace tr1
1636c7a68eb7Smrg{
1637c7a68eb7Smrg  using __gnu_cxx::conf_hypergf;
1638c7a68eb7Smrg  using __gnu_cxx::conf_hypergl;
1639c7a68eb7Smrg  using __gnu_cxx::conf_hyperg;
1640c7a68eb7Smrg
1641c7a68eb7Smrg  using __gnu_cxx::hypergf;
1642c7a68eb7Smrg  using __gnu_cxx::hypergl;
1643c7a68eb7Smrg  using __gnu_cxx::hyperg;
1644c7a68eb7Smrg} // namespace tr1
1645c7a68eb7Smrg
1646c7a68eb7Smrg_GLIBCXX_END_NAMESPACE_VERSION
1647c7a68eb7Smrg} // namespace std
1648c7a68eb7Smrg
1649c7a68eb7Smrg#else // ! (_GLIBCXX_USE_STD_SPEC_FUNCS && !defined(__STRICT_ANSI__))
1650c7a68eb7Smrg
1651c7a68eb7Smrg#include <bits/stl_algobase.h>
1652c7a68eb7Smrg#include <limits>
1653c7a68eb7Smrg#include <tr1/type_traits>
1654c7a68eb7Smrg
1655c7a68eb7Smrg#include <tr1/hypergeometric.tcc>
1656c7a68eb7Smrg
1657c7a68eb7Smrgnamespace std _GLIBCXX_VISIBILITY(default)
1658c7a68eb7Smrg{
1659c7a68eb7Smrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
1660c7a68eb7Smrg
1661c7a68eb7Smrgnamespace tr1
1662c7a68eb7Smrg{
1663*ec02198aSmrg  /** @addtogroup tr1_math_spec_func
1664*ec02198aSmrg   *  @{
1665*ec02198aSmrg   */
1666*ec02198aSmrg
1667c7a68eb7Smrg  inline float
1668c7a68eb7Smrg  conf_hypergf(float __a, float __c, float __x)
1669c7a68eb7Smrg  { return __detail::__conf_hyperg<float>(__a, __c, __x); }
1670c7a68eb7Smrg
1671c7a68eb7Smrg  inline long double
1672c7a68eb7Smrg  conf_hypergl(long double __a, long double __c, long double __x)
1673c7a68eb7Smrg  { return __detail::__conf_hyperg<long double>(__a, __c, __x); }
1674c7a68eb7Smrg
1675c7a68eb7Smrg  ///  5.2.1.7  Confluent hypergeometric functions.
1676c7a68eb7Smrg  template<typename _Tpa, typename _Tpc, typename _Tp>
1677c7a68eb7Smrg    inline typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type
1678c7a68eb7Smrg    conf_hyperg(_Tpa __a, _Tpc __c, _Tp __x)
1679c7a68eb7Smrg    {
1680c7a68eb7Smrg      typedef typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type __type;
1681c7a68eb7Smrg      return __detail::__conf_hyperg<__type>(__a, __c, __x);
1682c7a68eb7Smrg    }
1683c7a68eb7Smrg
1684c7a68eb7Smrg  inline float
1685c7a68eb7Smrg  hypergf(float __a, float __b, float __c, float __x)
1686c7a68eb7Smrg  { return __detail::__hyperg<float>(__a, __b, __c, __x); }
1687c7a68eb7Smrg
1688c7a68eb7Smrg  inline long double
1689c7a68eb7Smrg  hypergl(long double __a, long double __b, long double __c, long double __x)
1690c7a68eb7Smrg  { return __detail::__hyperg<long double>(__a, __b, __c, __x); }
1691c7a68eb7Smrg
1692c7a68eb7Smrg  ///  5.2.1.17  Hypergeometric functions.
1693c7a68eb7Smrg  template<typename _Tpa, typename _Tpb, typename _Tpc, typename _Tp>
1694c7a68eb7Smrg    inline typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>::__type
1695c7a68eb7Smrg    hyperg(_Tpa __a, _Tpb __b, _Tpc __c, _Tp __x)
1696c7a68eb7Smrg    {
1697c7a68eb7Smrg      typedef typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>::__type __type;
1698c7a68eb7Smrg      return __detail::__hyperg<__type>(__a, __b, __c, __x);
1699c7a68eb7Smrg    }
1700c7a68eb7Smrg
1701*ec02198aSmrg  /// @} tr1_math_spec_func
1702*ec02198aSmrg
1703c7a68eb7Smrg} // namespace tr1
1704c7a68eb7Smrg
1705c7a68eb7Smrg_GLIBCXX_END_NAMESPACE_VERSION
1706c7a68eb7Smrg} // namespace std
1707c7a68eb7Smrg#endif // _GLIBCXX_USE_STD_SPEC_FUNCS && !defined(__STRICT_ANSI__)
1708c7a68eb7Smrg
170963d1a8abSmrg#endif // _GLIBCXX_TR1_CMATH
1710