100db7afdSDavid E. O'Brien // -*- C++ -*- C forwarding header.
200db7afdSDavid E. O'Brien 
3f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
400db7afdSDavid E. O'Brien // Free Software Foundation, Inc.
500db7afdSDavid E. O'Brien //
600db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library.  This library is free
700db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
800db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
900db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
1000db7afdSDavid E. O'Brien // any later version.
1100db7afdSDavid E. O'Brien 
1200db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1300db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1400db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1500db7afdSDavid E. O'Brien // GNU General Public License for more details.
1600db7afdSDavid E. O'Brien 
1700db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1800db7afdSDavid E. O'Brien // with this library; see the file COPYING.  If not, write to the Free
19f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2000db7afdSDavid E. O'Brien // USA.
2100db7afdSDavid E. O'Brien 
2200db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2300db7afdSDavid E. O'Brien // library without restriction.  Specifically, if other files instantiate
2400db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2500db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2600db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2700db7afdSDavid E. O'Brien // the GNU General Public License.  This exception does not however
2800db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
2900db7afdSDavid E. O'Brien // the GNU General Public License.
3000db7afdSDavid E. O'Brien 
31f8a1b7d9SAlexander Kabaev /** @file include/cmath
3200db7afdSDavid E. O'Brien  *  This is a Standard C++ Library file.  You should @c #include this file
3300db7afdSDavid E. O'Brien  *  in your programs, rather than any of the "*.h" implementation files.
3400db7afdSDavid E. O'Brien  *
3500db7afdSDavid E. O'Brien  *  This is the C++ version of the Standard C Library header @c math.h,
3600db7afdSDavid E. O'Brien  *  and its contents are (mostly) the same as that header, but are all
37f8a1b7d9SAlexander Kabaev  *  contained in the namespace @c std (except for names which are defined
38f8a1b7d9SAlexander Kabaev  *  as macros in C).
3900db7afdSDavid E. O'Brien  */
4000db7afdSDavid E. O'Brien 
41f8a1b7d9SAlexander Kabaev //
42f8a1b7d9SAlexander Kabaev // ISO C++ 14882: 26.5  C library
43f8a1b7d9SAlexander Kabaev //
44f8a1b7d9SAlexander Kabaev 
45ffeaf689SAlexander Kabaev #ifndef _GLIBCXX_CMATH
46ffeaf689SAlexander Kabaev #define _GLIBCXX_CMATH 1
4700db7afdSDavid E. O'Brien 
4800db7afdSDavid E. O'Brien #pragma GCC system_header
4900db7afdSDavid E. O'Brien 
5000db7afdSDavid E. O'Brien #include <bits/c++config.h>
51ffeaf689SAlexander Kabaev #include <bits/cpp_type_traits.h>
52f8a1b7d9SAlexander Kabaev #include <ext/type_traits.h>
5300db7afdSDavid E. O'Brien 
5400db7afdSDavid E. O'Brien #include <math.h>
5500db7afdSDavid E. O'Brien 
5600db7afdSDavid E. O'Brien // Get rid of those macros defined in <math.h> in lieu of real functions.
5700db7afdSDavid E. O'Brien #undef abs
5800db7afdSDavid E. O'Brien #undef div
5900db7afdSDavid E. O'Brien #undef acos
6000db7afdSDavid E. O'Brien #undef asin
6100db7afdSDavid E. O'Brien #undef atan
6200db7afdSDavid E. O'Brien #undef atan2
6300db7afdSDavid E. O'Brien #undef ceil
6400db7afdSDavid E. O'Brien #undef cos
6500db7afdSDavid E. O'Brien #undef cosh
6600db7afdSDavid E. O'Brien #undef exp
6700db7afdSDavid E. O'Brien #undef fabs
6800db7afdSDavid E. O'Brien #undef floor
6900db7afdSDavid E. O'Brien #undef fmod
7000db7afdSDavid E. O'Brien #undef frexp
7100db7afdSDavid E. O'Brien #undef ldexp
7200db7afdSDavid E. O'Brien #undef log
7300db7afdSDavid E. O'Brien #undef log10
7400db7afdSDavid E. O'Brien #undef modf
7500db7afdSDavid E. O'Brien #undef pow
7600db7afdSDavid E. O'Brien #undef sin
7700db7afdSDavid E. O'Brien #undef sinh
7800db7afdSDavid E. O'Brien #undef sqrt
7900db7afdSDavid E. O'Brien #undef tan
8000db7afdSDavid E. O'Brien #undef tanh
8100db7afdSDavid E. O'Brien 
82f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
831b86b14eSAlexander Kabaev 
8400db7afdSDavid E. O'Brien   // Forward declaration of a helper function.  This really should be
8500db7afdSDavid E. O'Brien   // an `exported' forward declaration.
8600db7afdSDavid E. O'Brien   template<typename _Tp> _Tp __cmath_power(_Tp, unsigned int);
8700db7afdSDavid E. O'Brien 
8800db7afdSDavid E. O'Brien   inline double
abs(double __x)8900db7afdSDavid E. O'Brien   abs(double __x)
9000db7afdSDavid E. O'Brien   { return __builtin_fabs(__x); }
9100db7afdSDavid E. O'Brien 
9200db7afdSDavid E. O'Brien   inline float
abs(float __x)9300db7afdSDavid E. O'Brien   abs(float __x)
9400db7afdSDavid E. O'Brien   { return __builtin_fabsf(__x); }
9500db7afdSDavid E. O'Brien 
9600db7afdSDavid E. O'Brien   inline long double
abs(long double __x)9700db7afdSDavid E. O'Brien   abs(long double __x)
9800db7afdSDavid E. O'Brien   { return __builtin_fabsl(__x); }
9900db7afdSDavid E. O'Brien 
10000db7afdSDavid E. O'Brien   using ::acos;
10100db7afdSDavid E. O'Brien 
102ffeaf689SAlexander Kabaev   inline float
acos(float __x)103ffeaf689SAlexander Kabaev   acos(float __x)
104ffeaf689SAlexander Kabaev   { return __builtin_acosf(__x); }
105ffeaf689SAlexander Kabaev 
10600db7afdSDavid E. O'Brien   inline long double
acos(long double __x)107ffeaf689SAlexander Kabaev   acos(long double __x)
108ffeaf689SAlexander Kabaev   { return __builtin_acosl(__x); }
109ffeaf689SAlexander Kabaev 
110ffeaf689SAlexander Kabaev   template<typename _Tp>
111f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
112f8a1b7d9SAlexander Kabaev 					   double>::__type
acos(_Tp __x)113ffeaf689SAlexander Kabaev     acos(_Tp __x)
114f8a1b7d9SAlexander Kabaev     { return __builtin_acos(__x); }
11500db7afdSDavid E. O'Brien 
11600db7afdSDavid E. O'Brien   using ::asin;
11700db7afdSDavid E. O'Brien 
11800db7afdSDavid E. O'Brien   inline float
asin(float __x)119ffeaf689SAlexander Kabaev   asin(float __x)
120ffeaf689SAlexander Kabaev   { return __builtin_asinf(__x); }
12100db7afdSDavid E. O'Brien 
12200db7afdSDavid E. O'Brien   inline long double
asin(long double __x)123ffeaf689SAlexander Kabaev   asin(long double __x)
124ffeaf689SAlexander Kabaev   { return __builtin_asinl(__x); }
125ffeaf689SAlexander Kabaev 
126ffeaf689SAlexander Kabaev   template<typename _Tp>
127f8a1b7d9SAlexander Kabaev   inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
128f8a1b7d9SAlexander Kabaev 					 double>::__type
asin(_Tp __x)129ffeaf689SAlexander Kabaev     asin(_Tp __x)
130ffeaf689SAlexander Kabaev     { return __builtin_asin(__x); }
13100db7afdSDavid E. O'Brien 
13200db7afdSDavid E. O'Brien   using ::atan;
13300db7afdSDavid E. O'Brien 
13400db7afdSDavid E. O'Brien   inline float
atan(float __x)135ffeaf689SAlexander Kabaev   atan(float __x)
136ffeaf689SAlexander Kabaev   { return __builtin_atanf(__x); }
13700db7afdSDavid E. O'Brien 
13800db7afdSDavid E. O'Brien   inline long double
atan(long double __x)139ffeaf689SAlexander Kabaev   atan(long double __x)
140ffeaf689SAlexander Kabaev   { return __builtin_atanl(__x); }
141ffeaf689SAlexander Kabaev 
142ffeaf689SAlexander Kabaev   template<typename _Tp>
143f8a1b7d9SAlexander Kabaev   inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
144f8a1b7d9SAlexander Kabaev 					 double>::__type
atan(_Tp __x)145ffeaf689SAlexander Kabaev     atan(_Tp __x)
146ffeaf689SAlexander Kabaev     { return __builtin_atan(__x); }
14700db7afdSDavid E. O'Brien 
14800db7afdSDavid E. O'Brien   using ::atan2;
14900db7afdSDavid E. O'Brien 
15000db7afdSDavid E. O'Brien   inline float
atan2(float __y,float __x)15100db7afdSDavid E. O'Brien   atan2(float __y, float __x)
152ffeaf689SAlexander Kabaev   { return __builtin_atan2f(__y, __x); }
15300db7afdSDavid E. O'Brien 
15400db7afdSDavid E. O'Brien   inline long double
atan2(long double __y,long double __x)15500db7afdSDavid E. O'Brien   atan2(long double __y, long double __x)
156ffeaf689SAlexander Kabaev   { return __builtin_atan2l(__y, __x); }
157ffeaf689SAlexander Kabaev 
158ffeaf689SAlexander Kabaev   template<typename _Tp, typename _Up>
159f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value
160f8a1b7d9SAlexander Kabaev     					   && __is_integer<_Up>::__value,
161f8a1b7d9SAlexander Kabaev 					   double>::__type
atan2(_Tp __y,_Up __x)162ffeaf689SAlexander Kabaev     atan2(_Tp __y, _Up __x)
163ffeaf689SAlexander Kabaev     { return __builtin_atan2(__y, __x); }
16400db7afdSDavid E. O'Brien 
16500db7afdSDavid E. O'Brien   using ::ceil;
16600db7afdSDavid E. O'Brien 
16700db7afdSDavid E. O'Brien   inline float
ceil(float __x)168ffeaf689SAlexander Kabaev   ceil(float __x)
169ffeaf689SAlexander Kabaev   { return __builtin_ceilf(__x); }
17000db7afdSDavid E. O'Brien 
17100db7afdSDavid E. O'Brien   inline long double
ceil(long double __x)172ffeaf689SAlexander Kabaev   ceil(long double __x)
173ffeaf689SAlexander Kabaev   { return __builtin_ceill(__x); }
174ffeaf689SAlexander Kabaev 
175ffeaf689SAlexander Kabaev   template<typename _Tp>
176f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
177f8a1b7d9SAlexander Kabaev 					   double>::__type
ceil(_Tp __x)178ffeaf689SAlexander Kabaev     ceil(_Tp __x)
179ffeaf689SAlexander Kabaev     { return __builtin_ceil(__x); }
18000db7afdSDavid E. O'Brien 
18100db7afdSDavid E. O'Brien   using ::cos;
18200db7afdSDavid E. O'Brien 
18300db7afdSDavid E. O'Brien   inline float
cos(float __x)18400db7afdSDavid E. O'Brien   cos(float __x)
18500db7afdSDavid E. O'Brien   { return __builtin_cosf(__x); }
18600db7afdSDavid E. O'Brien 
18700db7afdSDavid E. O'Brien   inline long double
cos(long double __x)18800db7afdSDavid E. O'Brien   cos(long double __x)
18900db7afdSDavid E. O'Brien   { return __builtin_cosl(__x); }
19000db7afdSDavid E. O'Brien 
191ffeaf689SAlexander Kabaev   template<typename _Tp>
192f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
193f8a1b7d9SAlexander Kabaev 					   double>::__type
cos(_Tp __x)194ffeaf689SAlexander Kabaev     cos(_Tp __x)
195ffeaf689SAlexander Kabaev     { return __builtin_cos(__x); }
196ffeaf689SAlexander Kabaev 
19700db7afdSDavid E. O'Brien   using ::cosh;
19800db7afdSDavid E. O'Brien 
19900db7afdSDavid E. O'Brien   inline float
cosh(float __x)200ffeaf689SAlexander Kabaev   cosh(float __x)
201ffeaf689SAlexander Kabaev   { return __builtin_coshf(__x); }
20200db7afdSDavid E. O'Brien 
20300db7afdSDavid E. O'Brien   inline long double
cosh(long double __x)204ffeaf689SAlexander Kabaev   cosh(long double __x)
205ffeaf689SAlexander Kabaev   { return __builtin_coshl(__x); }
206ffeaf689SAlexander Kabaev 
207ffeaf689SAlexander Kabaev   template<typename _Tp>
208f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
209f8a1b7d9SAlexander Kabaev 					   double>::__type
cosh(_Tp __x)210ffeaf689SAlexander Kabaev     cosh(_Tp __x)
211ffeaf689SAlexander Kabaev     { return __builtin_cosh(__x); }
21200db7afdSDavid E. O'Brien 
21300db7afdSDavid E. O'Brien   using ::exp;
21400db7afdSDavid E. O'Brien 
21500db7afdSDavid E. O'Brien   inline float
exp(float __x)216ffeaf689SAlexander Kabaev   exp(float __x)
217ffeaf689SAlexander Kabaev   { return __builtin_expf(__x); }
21800db7afdSDavid E. O'Brien 
21900db7afdSDavid E. O'Brien   inline long double
exp(long double __x)220ffeaf689SAlexander Kabaev   exp(long double __x)
221ffeaf689SAlexander Kabaev   { return __builtin_expl(__x); }
222ffeaf689SAlexander Kabaev 
223ffeaf689SAlexander Kabaev   template<typename _Tp>
224f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
225f8a1b7d9SAlexander Kabaev 					   double>::__type
exp(_Tp __x)226ffeaf689SAlexander Kabaev     exp(_Tp __x)
227ffeaf689SAlexander Kabaev     { return __builtin_exp(__x); }
22800db7afdSDavid E. O'Brien 
22900db7afdSDavid E. O'Brien   using ::fabs;
23000db7afdSDavid E. O'Brien 
23100db7afdSDavid E. O'Brien   inline float
fabs(float __x)23200db7afdSDavid E. O'Brien   fabs(float __x)
23300db7afdSDavid E. O'Brien   { return __builtin_fabsf(__x); }
23400db7afdSDavid E. O'Brien 
23500db7afdSDavid E. O'Brien   inline long double
fabs(long double __x)23600db7afdSDavid E. O'Brien   fabs(long double __x)
23700db7afdSDavid E. O'Brien   { return __builtin_fabsl(__x); }
23800db7afdSDavid E. O'Brien 
239ffeaf689SAlexander Kabaev   template<typename _Tp>
240f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
241f8a1b7d9SAlexander Kabaev 					   double>::__type
fabs(_Tp __x)242ffeaf689SAlexander Kabaev     fabs(_Tp __x)
243ffeaf689SAlexander Kabaev     { return __builtin_fabs(__x); }
244ffeaf689SAlexander Kabaev 
24500db7afdSDavid E. O'Brien   using ::floor;
24600db7afdSDavid E. O'Brien 
24700db7afdSDavid E. O'Brien   inline float
floor(float __x)248ffeaf689SAlexander Kabaev   floor(float __x)
249ffeaf689SAlexander Kabaev   { return __builtin_floorf(__x); }
25000db7afdSDavid E. O'Brien 
25100db7afdSDavid E. O'Brien   inline long double
floor(long double __x)252ffeaf689SAlexander Kabaev   floor(long double __x)
253ffeaf689SAlexander Kabaev   { return __builtin_floorl(__x); }
254ffeaf689SAlexander Kabaev 
255ffeaf689SAlexander Kabaev   template<typename _Tp>
256f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
257f8a1b7d9SAlexander Kabaev 					   double>::__type
floor(_Tp __x)258ffeaf689SAlexander Kabaev     floor(_Tp __x)
259ffeaf689SAlexander Kabaev     { return __builtin_floor(__x); }
26000db7afdSDavid E. O'Brien 
26100db7afdSDavid E. O'Brien   using ::fmod;
26200db7afdSDavid E. O'Brien 
26300db7afdSDavid E. O'Brien   inline float
fmod(float __x,float __y)26400db7afdSDavid E. O'Brien   fmod(float __x, float __y)
265ffeaf689SAlexander Kabaev   { return __builtin_fmodf(__x, __y); }
26600db7afdSDavid E. O'Brien 
26700db7afdSDavid E. O'Brien   inline long double
fmod(long double __x,long double __y)26800db7afdSDavid E. O'Brien   fmod(long double __x, long double __y)
269ffeaf689SAlexander Kabaev   { return __builtin_fmodl(__x, __y); }
27000db7afdSDavid E. O'Brien 
27100db7afdSDavid E. O'Brien   using ::frexp;
27200db7afdSDavid E. O'Brien 
27300db7afdSDavid E. O'Brien   inline float
frexp(float __x,int * __exp)274ffeaf689SAlexander Kabaev   frexp(float __x, int* __exp)
275ffeaf689SAlexander Kabaev   { return __builtin_frexpf(__x, __exp); }
27600db7afdSDavid E. O'Brien 
27700db7afdSDavid E. O'Brien   inline long double
frexp(long double __x,int * __exp)27800db7afdSDavid E. O'Brien   frexp(long double __x, int* __exp)
279ffeaf689SAlexander Kabaev   { return __builtin_frexpl(__x, __exp); }
280ffeaf689SAlexander Kabaev 
281ffeaf689SAlexander Kabaev   template<typename _Tp>
282f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
283f8a1b7d9SAlexander Kabaev 					   double>::__type
frexp(_Tp __x,int * __exp)284ffeaf689SAlexander Kabaev     frexp(_Tp __x, int* __exp)
285ffeaf689SAlexander Kabaev     { return __builtin_frexp(__x, __exp); }
28600db7afdSDavid E. O'Brien 
28700db7afdSDavid E. O'Brien   using ::ldexp;
28800db7afdSDavid E. O'Brien 
28900db7afdSDavid E. O'Brien   inline float
ldexp(float __x,int __exp)29000db7afdSDavid E. O'Brien   ldexp(float __x, int __exp)
291ffeaf689SAlexander Kabaev   { return __builtin_ldexpf(__x, __exp); }
29200db7afdSDavid E. O'Brien 
29300db7afdSDavid E. O'Brien   inline long double
ldexp(long double __x,int __exp)29400db7afdSDavid E. O'Brien   ldexp(long double __x, int __exp)
295ffeaf689SAlexander Kabaev   { return __builtin_ldexpl(__x, __exp); }
296ffeaf689SAlexander Kabaev 
297ffeaf689SAlexander Kabaev   template<typename _Tp>
298f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
299f8a1b7d9SAlexander Kabaev 					   double>::__type
ldexp(_Tp __x,int __exp)300ffeaf689SAlexander Kabaev   ldexp(_Tp __x, int __exp)
301ffeaf689SAlexander Kabaev   { return __builtin_ldexp(__x, __exp); }
30200db7afdSDavid E. O'Brien 
30300db7afdSDavid E. O'Brien   using ::log;
30400db7afdSDavid E. O'Brien 
30500db7afdSDavid E. O'Brien   inline float
log(float __x)306ffeaf689SAlexander Kabaev   log(float __x)
307ffeaf689SAlexander Kabaev   { return __builtin_logf(__x); }
30800db7afdSDavid E. O'Brien 
30900db7afdSDavid E. O'Brien   inline long double
log(long double __x)310ffeaf689SAlexander Kabaev   log(long double __x)
311ffeaf689SAlexander Kabaev   { return __builtin_logl(__x); }
312ffeaf689SAlexander Kabaev 
313ffeaf689SAlexander Kabaev   template<typename _Tp>
314f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
315f8a1b7d9SAlexander Kabaev 					   double>::__type
log(_Tp __x)316ffeaf689SAlexander Kabaev     log(_Tp __x)
317ffeaf689SAlexander Kabaev     { return __builtin_log(__x); }
31800db7afdSDavid E. O'Brien 
31900db7afdSDavid E. O'Brien   using ::log10;
32000db7afdSDavid E. O'Brien 
32100db7afdSDavid E. O'Brien   inline float
log10(float __x)322ffeaf689SAlexander Kabaev   log10(float __x)
323ffeaf689SAlexander Kabaev   { return __builtin_log10f(__x); }
32400db7afdSDavid E. O'Brien 
32500db7afdSDavid E. O'Brien   inline long double
log10(long double __x)326ffeaf689SAlexander Kabaev   log10(long double __x)
327ffeaf689SAlexander Kabaev   { return __builtin_log10l(__x); }
328ffeaf689SAlexander Kabaev 
329ffeaf689SAlexander Kabaev   template<typename _Tp>
330f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
331f8a1b7d9SAlexander Kabaev 					   double>::__type
log10(_Tp __x)332ffeaf689SAlexander Kabaev     log10(_Tp __x)
333ffeaf689SAlexander Kabaev     { return __builtin_log10(__x); }
33400db7afdSDavid E. O'Brien 
33500db7afdSDavid E. O'Brien   using ::modf;
33600db7afdSDavid E. O'Brien 
33700db7afdSDavid E. O'Brien   inline float
modf(float __x,float * __iptr)33800db7afdSDavid E. O'Brien   modf(float __x, float* __iptr)
339ffeaf689SAlexander Kabaev   { return __builtin_modff(__x, __iptr); }
34000db7afdSDavid E. O'Brien 
34100db7afdSDavid E. O'Brien   inline long double
modf(long double __x,long double * __iptr)34200db7afdSDavid E. O'Brien   modf(long double __x, long double* __iptr)
343ffeaf689SAlexander Kabaev   { return __builtin_modfl(__x, __iptr); }
34400db7afdSDavid E. O'Brien 
34500db7afdSDavid E. O'Brien   template<typename _Tp>
34600db7afdSDavid E. O'Brien     inline _Tp
__pow_helper(_Tp __x,int __n)34700db7afdSDavid E. O'Brien     __pow_helper(_Tp __x, int __n)
34800db7afdSDavid E. O'Brien     {
34900db7afdSDavid E. O'Brien       return __n < 0
35000db7afdSDavid E. O'Brien         ? _Tp(1)/__cmath_power(__x, -__n)
35100db7afdSDavid E. O'Brien         : __cmath_power(__x, __n);
35200db7afdSDavid E. O'Brien     }
35300db7afdSDavid E. O'Brien 
35400db7afdSDavid E. O'Brien   using ::pow;
35500db7afdSDavid E. O'Brien 
35600db7afdSDavid E. O'Brien   inline float
pow(float __x,float __y)35700db7afdSDavid E. O'Brien   pow(float __x, float __y)
358ffeaf689SAlexander Kabaev   { return __builtin_powf(__x, __y); }
35900db7afdSDavid E. O'Brien 
36000db7afdSDavid E. O'Brien   inline long double
pow(long double __x,long double __y)36100db7afdSDavid E. O'Brien   pow(long double __x, long double __y)
362ffeaf689SAlexander Kabaev   { return __builtin_powl(__x, __y); }
36300db7afdSDavid E. O'Brien 
36400db7afdSDavid E. O'Brien   inline double
pow(double __x,int __i)36500db7afdSDavid E. O'Brien   pow(double __x, int __i)
366f8a1b7d9SAlexander Kabaev   { return __builtin_powi(__x, __i); }
36700db7afdSDavid E. O'Brien 
36800db7afdSDavid E. O'Brien   inline float
pow(float __x,int __n)36900db7afdSDavid E. O'Brien   pow(float __x, int __n)
370f8a1b7d9SAlexander Kabaev   { return __builtin_powif(__x, __n); }
37100db7afdSDavid E. O'Brien 
37200db7afdSDavid E. O'Brien   inline long double
pow(long double __x,int __n)37300db7afdSDavid E. O'Brien   pow(long double __x, int __n)
374f8a1b7d9SAlexander Kabaev   { return __builtin_powil(__x, __n); }
37500db7afdSDavid E. O'Brien 
37600db7afdSDavid E. O'Brien   using ::sin;
37700db7afdSDavid E. O'Brien 
37800db7afdSDavid E. O'Brien   inline float
sin(float __x)37900db7afdSDavid E. O'Brien   sin(float __x)
38000db7afdSDavid E. O'Brien   { return __builtin_sinf(__x); }
38100db7afdSDavid E. O'Brien 
38200db7afdSDavid E. O'Brien   inline long double
sin(long double __x)38300db7afdSDavid E. O'Brien   sin(long double __x)
38400db7afdSDavid E. O'Brien   { return __builtin_sinl(__x); }
38500db7afdSDavid E. O'Brien 
386ffeaf689SAlexander Kabaev   template<typename _Tp>
387f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
388f8a1b7d9SAlexander Kabaev 					   double>::__type
sin(_Tp __x)389ffeaf689SAlexander Kabaev     sin(_Tp __x)
390ffeaf689SAlexander Kabaev     { return __builtin_sin(__x); }
391ffeaf689SAlexander Kabaev 
39200db7afdSDavid E. O'Brien   using ::sinh;
39300db7afdSDavid E. O'Brien 
39400db7afdSDavid E. O'Brien   inline float
sinh(float __x)395ffeaf689SAlexander Kabaev   sinh(float __x)
396ffeaf689SAlexander Kabaev   { return __builtin_sinhf(__x); }
39700db7afdSDavid E. O'Brien 
39800db7afdSDavid E. O'Brien   inline long double
sinh(long double __x)399ffeaf689SAlexander Kabaev   sinh(long double __x)
400ffeaf689SAlexander Kabaev   { return __builtin_sinhl(__x); }
401ffeaf689SAlexander Kabaev 
402ffeaf689SAlexander Kabaev   template<typename _Tp>
403f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
404f8a1b7d9SAlexander Kabaev 					   double>::__type
sinh(_Tp __x)405ffeaf689SAlexander Kabaev     sinh(_Tp __x)
406ffeaf689SAlexander Kabaev     { return __builtin_sinh(__x); }
40700db7afdSDavid E. O'Brien 
40800db7afdSDavid E. O'Brien   using ::sqrt;
40900db7afdSDavid E. O'Brien 
41000db7afdSDavid E. O'Brien   inline float
sqrt(float __x)41100db7afdSDavid E. O'Brien   sqrt(float __x)
41200db7afdSDavid E. O'Brien   { return __builtin_sqrtf(__x); }
41300db7afdSDavid E. O'Brien 
41400db7afdSDavid E. O'Brien   inline long double
sqrt(long double __x)41500db7afdSDavid E. O'Brien   sqrt(long double __x)
41600db7afdSDavid E. O'Brien   { return __builtin_sqrtl(__x); }
41700db7afdSDavid E. O'Brien 
418ffeaf689SAlexander Kabaev   template<typename _Tp>
419f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
420f8a1b7d9SAlexander Kabaev 					   double>::__type
sqrt(_Tp __x)421ffeaf689SAlexander Kabaev     sqrt(_Tp __x)
422ffeaf689SAlexander Kabaev     { return __builtin_sqrt(__x); }
423ffeaf689SAlexander Kabaev 
42400db7afdSDavid E. O'Brien   using ::tan;
42500db7afdSDavid E. O'Brien 
42600db7afdSDavid E. O'Brien   inline float
tan(float __x)427ffeaf689SAlexander Kabaev   tan(float __x)
428ffeaf689SAlexander Kabaev   { return __builtin_tanf(__x); }
42900db7afdSDavid E. O'Brien 
43000db7afdSDavid E. O'Brien   inline long double
tan(long double __x)431ffeaf689SAlexander Kabaev   tan(long double __x)
432ffeaf689SAlexander Kabaev   { return __builtin_tanl(__x); }
433ffeaf689SAlexander Kabaev 
434ffeaf689SAlexander Kabaev   template<typename _Tp>
435f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
436f8a1b7d9SAlexander Kabaev 					   double>::__type
tan(_Tp __x)437ffeaf689SAlexander Kabaev     tan(_Tp __x)
438ffeaf689SAlexander Kabaev     { return __builtin_tan(__x); }
43900db7afdSDavid E. O'Brien 
44000db7afdSDavid E. O'Brien   using ::tanh;
44100db7afdSDavid E. O'Brien 
44200db7afdSDavid E. O'Brien   inline float
tanh(float __x)443ffeaf689SAlexander Kabaev   tanh(float __x)
444ffeaf689SAlexander Kabaev   { return __builtin_tanhf(__x); }
44500db7afdSDavid E. O'Brien 
44600db7afdSDavid E. O'Brien   inline long double
tanh(long double __x)447ffeaf689SAlexander Kabaev   tanh(long double __x)
448ffeaf689SAlexander Kabaev   { return __builtin_tanhl(__x); }
449ffeaf689SAlexander Kabaev 
450ffeaf689SAlexander Kabaev   template<typename _Tp>
451f8a1b7d9SAlexander Kabaev     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
452f8a1b7d9SAlexander Kabaev 					   double>::__type
tanh(_Tp __x)453ffeaf689SAlexander Kabaev     tanh(_Tp __x)
454ffeaf689SAlexander Kabaev     { return __builtin_tanh(__x); }
455f8a1b7d9SAlexander Kabaev 
456f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
45700db7afdSDavid E. O'Brien 
458ffeaf689SAlexander Kabaev #if _GLIBCXX_USE_C99_MATH
459ffeaf689SAlexander Kabaev #if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
46000db7afdSDavid E. O'Brien // These are possible macros imported from C99-land. For strict
46100db7afdSDavid E. O'Brien // conformance, remove possible C99-injected names from the global
46200db7afdSDavid E. O'Brien // namespace, and sequester them in the __gnu_cxx extension namespace.
463f8a1b7d9SAlexander Kabaev 
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)464f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
465f8a1b7d9SAlexander Kabaev 
46600db7afdSDavid E. O'Brien   template<typename _Tp>
467f482ed05SAlexander Kabaev     inline int
46800db7afdSDavid E. O'Brien     __capture_fpclassify(_Tp __f) { return fpclassify(__f); }
46900db7afdSDavid E. O'Brien 
47000db7afdSDavid E. O'Brien   template<typename _Tp>
471f482ed05SAlexander Kabaev     inline int
__capture_isfinite(_Tp __f)47200db7afdSDavid E. O'Brien     __capture_isfinite(_Tp __f) { return isfinite(__f); }
47300db7afdSDavid E. O'Brien 
47400db7afdSDavid E. O'Brien   template<typename _Tp>
475f482ed05SAlexander Kabaev     inline int
__capture_isinf(_Tp __f)47600db7afdSDavid E. O'Brien     __capture_isinf(_Tp __f) { return isinf(__f); }
47700db7afdSDavid E. O'Brien 
47800db7afdSDavid E. O'Brien   template<typename _Tp>
479f482ed05SAlexander Kabaev     inline int
__capture_isnan(_Tp __f)48000db7afdSDavid E. O'Brien     __capture_isnan(_Tp __f) { return isnan(__f); }
48100db7afdSDavid E. O'Brien 
48200db7afdSDavid E. O'Brien   template<typename _Tp>
483f482ed05SAlexander Kabaev     inline int
__capture_isnormal(_Tp __f)48400db7afdSDavid E. O'Brien     __capture_isnormal(_Tp __f) { return isnormal(__f); }
48500db7afdSDavid E. O'Brien 
48600db7afdSDavid E. O'Brien   template<typename _Tp>
487f482ed05SAlexander Kabaev     inline int
__capture_signbit(_Tp __f)48800db7afdSDavid E. O'Brien     __capture_signbit(_Tp __f) { return signbit(__f); }
48900db7afdSDavid E. O'Brien 
49000db7afdSDavid E. O'Brien   template<typename _Tp>
491f482ed05SAlexander Kabaev     inline int
__capture_isgreater(_Tp __f1,_Tp __f2)49200db7afdSDavid E. O'Brien     __capture_isgreater(_Tp __f1, _Tp __f2)
49300db7afdSDavid E. O'Brien     { return isgreater(__f1, __f2); }
49400db7afdSDavid E. O'Brien 
49500db7afdSDavid E. O'Brien   template<typename _Tp>
496f482ed05SAlexander Kabaev     inline int
__capture_isgreaterequal(_Tp __f1,_Tp __f2)49700db7afdSDavid E. O'Brien     __capture_isgreaterequal(_Tp __f1, _Tp __f2)
49800db7afdSDavid E. O'Brien     { return isgreaterequal(__f1, __f2); }
49900db7afdSDavid E. O'Brien 
50000db7afdSDavid E. O'Brien   template<typename _Tp>
501f482ed05SAlexander Kabaev     inline int
__capture_isless(_Tp __f1,_Tp __f2)50200db7afdSDavid E. O'Brien     __capture_isless(_Tp __f1, _Tp __f2) { return isless(__f1, __f2); }
50300db7afdSDavid E. O'Brien 
50400db7afdSDavid E. O'Brien   template<typename _Tp>
505f482ed05SAlexander Kabaev     inline int
__capture_islessequal(_Tp __f1,_Tp __f2)50600db7afdSDavid E. O'Brien     __capture_islessequal(_Tp __f1, _Tp __f2)
50700db7afdSDavid E. O'Brien     { return islessequal(__f1, __f2); }
50800db7afdSDavid E. O'Brien 
50900db7afdSDavid E. O'Brien   template<typename _Tp>
510f482ed05SAlexander Kabaev     inline int
__capture_islessgreater(_Tp __f1,_Tp __f2)51100db7afdSDavid E. O'Brien     __capture_islessgreater(_Tp __f1, _Tp __f2)
51200db7afdSDavid E. O'Brien     { return islessgreater(__f1, __f2); }
51300db7afdSDavid E. O'Brien 
51400db7afdSDavid E. O'Brien   template<typename _Tp>
515f482ed05SAlexander Kabaev     inline int
__capture_isunordered(_Tp __f1,_Tp __f2)51600db7afdSDavid E. O'Brien     __capture_isunordered(_Tp __f1, _Tp __f2)
51700db7afdSDavid E. O'Brien     { return isunordered(__f1, __f2); }
518f8a1b7d9SAlexander Kabaev 
519f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
52000db7afdSDavid E. O'Brien 
521ffeaf689SAlexander Kabaev // Only undefine the C99 FP macros, if actually captured for namespace movement
52200db7afdSDavid E. O'Brien #undef fpclassify
52300db7afdSDavid E. O'Brien #undef isfinite
52400db7afdSDavid E. O'Brien #undef isinf
52500db7afdSDavid E. O'Brien #undef isnan
52600db7afdSDavid E. O'Brien #undef isnormal
52700db7afdSDavid E. O'Brien #undef signbit
52800db7afdSDavid E. O'Brien #undef isgreater
52900db7afdSDavid E. O'Brien #undef isgreaterequal
53000db7afdSDavid E. O'Brien #undef isless
53100db7afdSDavid E. O'Brien #undef islessequal
53200db7afdSDavid E. O'Brien #undef islessgreater
53300db7afdSDavid E. O'Brien #undef isunordered
53400db7afdSDavid E. O'Brien 
_GLIBCXX_BEGIN_NAMESPACE(std)535f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
53600db7afdSDavid E. O'Brien 
53700db7afdSDavid E. O'Brien   template<typename _Tp>
538f482ed05SAlexander Kabaev     inline int
539f8a1b7d9SAlexander Kabaev     fpclassify(_Tp __f) { return ::__gnu_cxx::__capture_fpclassify(__f); }
54000db7afdSDavid E. O'Brien 
54100db7afdSDavid E. O'Brien   template<typename _Tp>
542f482ed05SAlexander Kabaev     inline int
isfinite(_Tp __f)543f8a1b7d9SAlexander Kabaev     isfinite(_Tp __f) { return ::__gnu_cxx::__capture_isfinite(__f); }
54400db7afdSDavid E. O'Brien 
54500db7afdSDavid E. O'Brien   template<typename _Tp>
546f482ed05SAlexander Kabaev     inline int
isinf(_Tp __f)547f8a1b7d9SAlexander Kabaev     isinf(_Tp __f) { return ::__gnu_cxx::__capture_isinf(__f); }
54800db7afdSDavid E. O'Brien 
54900db7afdSDavid E. O'Brien   template<typename _Tp>
550f482ed05SAlexander Kabaev     inline int
isnan(_Tp __f)551f8a1b7d9SAlexander Kabaev     isnan(_Tp __f) { return ::__gnu_cxx::__capture_isnan(__f); }
55200db7afdSDavid E. O'Brien 
55300db7afdSDavid E. O'Brien   template<typename _Tp>
554f482ed05SAlexander Kabaev     inline int
isnormal(_Tp __f)555f8a1b7d9SAlexander Kabaev     isnormal(_Tp __f) { return ::__gnu_cxx::__capture_isnormal(__f); }
55600db7afdSDavid E. O'Brien 
55700db7afdSDavid E. O'Brien   template<typename _Tp>
558f482ed05SAlexander Kabaev     inline int
signbit(_Tp __f)559f8a1b7d9SAlexander Kabaev     signbit(_Tp __f) { return ::__gnu_cxx::__capture_signbit(__f); }
560f8a1b7d9SAlexander Kabaev 
561f8a1b7d9SAlexander Kabaev   template<typename _Tp>
562f8a1b7d9SAlexander Kabaev     inline int
isgreater(_Tp __f1,_Tp __f2)563f8a1b7d9SAlexander Kabaev     isgreater(_Tp __f1, _Tp __f2)
564f8a1b7d9SAlexander Kabaev     { return ::__gnu_cxx::__capture_isgreater(__f1, __f2); }
56500db7afdSDavid E. O'Brien 
56600db7afdSDavid E. O'Brien   template<typename _Tp>
567f482ed05SAlexander Kabaev     inline int
isgreaterequal(_Tp __f1,_Tp __f2)56800db7afdSDavid E. O'Brien     isgreaterequal(_Tp __f1, _Tp __f2)
569f8a1b7d9SAlexander Kabaev     { return ::__gnu_cxx::__capture_isgreaterequal(__f1, __f2); }
57000db7afdSDavid E. O'Brien 
57100db7afdSDavid E. O'Brien   template<typename _Tp>
572f482ed05SAlexander Kabaev     inline int
isless(_Tp __f1,_Tp __f2)573f8a1b7d9SAlexander Kabaev     isless(_Tp __f1, _Tp __f2)
574f8a1b7d9SAlexander Kabaev     { return ::__gnu_cxx::__capture_isless(__f1, __f2); }
57500db7afdSDavid E. O'Brien 
57600db7afdSDavid E. O'Brien   template<typename _Tp>
577f482ed05SAlexander Kabaev     inline int
islessequal(_Tp __f1,_Tp __f2)57800db7afdSDavid E. O'Brien     islessequal(_Tp __f1, _Tp __f2)
579f8a1b7d9SAlexander Kabaev     { return ::__gnu_cxx::__capture_islessequal(__f1, __f2); }
58000db7afdSDavid E. O'Brien 
58100db7afdSDavid E. O'Brien   template<typename _Tp>
582f482ed05SAlexander Kabaev     inline int
islessgreater(_Tp __f1,_Tp __f2)58300db7afdSDavid E. O'Brien     islessgreater(_Tp __f1, _Tp __f2)
584f8a1b7d9SAlexander Kabaev     { return ::__gnu_cxx::__capture_islessgreater(__f1, __f2); }
58500db7afdSDavid E. O'Brien 
58600db7afdSDavid E. O'Brien   template<typename _Tp>
587f482ed05SAlexander Kabaev     inline int
isunordered(_Tp __f1,_Tp __f2)58800db7afdSDavid E. O'Brien     isunordered(_Tp __f1, _Tp __f2)
589f8a1b7d9SAlexander Kabaev     { return ::__gnu_cxx::__capture_isunordered(__f1, __f2); }
59000db7afdSDavid E. O'Brien 
591f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
592*e2a74d72SDavid Chisnall using std::isnan;
593*e2a74d72SDavid Chisnall using std::isinf;
594f8a1b7d9SAlexander Kabaev 
595ffeaf689SAlexander Kabaev #endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
59600db7afdSDavid E. O'Brien #endif
59700db7afdSDavid E. O'Brien 
598ffeaf689SAlexander Kabaev #ifndef _GLIBCXX_EXPORT_TEMPLATE
59900db7afdSDavid E. O'Brien # include <bits/cmath.tcc>
60000db7afdSDavid E. O'Brien #endif
60100db7afdSDavid E. O'Brien 
60200db7afdSDavid E. O'Brien #endif
603