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