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