xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/c_std/cmath (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino// -*- C++ -*- C forwarding header.
2*e4b17023SJohn Marino
3*e4b17023SJohn Marino// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
4*e4b17023SJohn Marino// 2006, 2007, 2008, 2009, 2010
5*e4b17023SJohn Marino// Free Software Foundation, Inc.
6*e4b17023SJohn Marino//
7*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library.  This library is free
8*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the
9*e4b17023SJohn Marino// terms of the GNU General Public License as published by the
10*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option)
11*e4b17023SJohn Marino// any later version.
12*e4b17023SJohn Marino
13*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful,
14*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of
15*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*e4b17023SJohn Marino// GNU General Public License for more details.
17*e4b17023SJohn Marino
18*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional
19*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version
20*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation.
21*e4b17023SJohn Marino
22*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License and
23*e4b17023SJohn Marino// a copy of the GCC Runtime Library Exception along with this program;
24*e4b17023SJohn Marino// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
25*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>.
26*e4b17023SJohn Marino
27*e4b17023SJohn Marino/** @file include/cmath
28*e4b17023SJohn Marino *  This is a Standard C++ Library file.  You should @c #include this file
29*e4b17023SJohn Marino *  in your programs, rather than any of the @a *.h implementation files.
30*e4b17023SJohn Marino *
31*e4b17023SJohn Marino *  This is the C++ version of the Standard C Library header @c math.h,
32*e4b17023SJohn Marino *  and its contents are (mostly) the same as that header, but are all
33*e4b17023SJohn Marino *  contained in the namespace @c std (except for names which are defined
34*e4b17023SJohn Marino *  as macros in C).
35*e4b17023SJohn Marino */
36*e4b17023SJohn Marino
37*e4b17023SJohn Marino//
38*e4b17023SJohn Marino// ISO C++ 14882: 26.5  C library
39*e4b17023SJohn Marino//
40*e4b17023SJohn Marino
41*e4b17023SJohn Marino#ifndef _GLIBCXX_CMATH
42*e4b17023SJohn Marino#define _GLIBCXX_CMATH 1
43*e4b17023SJohn Marino
44*e4b17023SJohn Marino#pragma GCC system_header
45*e4b17023SJohn Marino
46*e4b17023SJohn Marino#include <bits/c++config.h>
47*e4b17023SJohn Marino#include <bits/cpp_type_traits.h>
48*e4b17023SJohn Marino#include <ext/type_traits.h>
49*e4b17023SJohn Marino
50*e4b17023SJohn Marino#include <math.h>
51*e4b17023SJohn Marino
52*e4b17023SJohn Marino// Get rid of those macros defined in <math.h> in lieu of real functions.
53*e4b17023SJohn Marino#undef abs
54*e4b17023SJohn Marino#undef div
55*e4b17023SJohn Marino#undef acos
56*e4b17023SJohn Marino#undef asin
57*e4b17023SJohn Marino#undef atan
58*e4b17023SJohn Marino#undef atan2
59*e4b17023SJohn Marino#undef ceil
60*e4b17023SJohn Marino#undef cos
61*e4b17023SJohn Marino#undef cosh
62*e4b17023SJohn Marino#undef exp
63*e4b17023SJohn Marino#undef fabs
64*e4b17023SJohn Marino#undef floor
65*e4b17023SJohn Marino#undef fmod
66*e4b17023SJohn Marino#undef frexp
67*e4b17023SJohn Marino#undef ldexp
68*e4b17023SJohn Marino#undef log
69*e4b17023SJohn Marino#undef log10
70*e4b17023SJohn Marino#undef modf
71*e4b17023SJohn Marino#undef pow
72*e4b17023SJohn Marino#undef sin
73*e4b17023SJohn Marino#undef sinh
74*e4b17023SJohn Marino#undef sqrt
75*e4b17023SJohn Marino#undef tan
76*e4b17023SJohn Marino#undef tanh
77*e4b17023SJohn Marino
78*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default)
79*e4b17023SJohn Marino{
80*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION
81*e4b17023SJohn Marino
82*e4b17023SJohn Marino  inline double
83*e4b17023SJohn Marino  abs(double __x)
84*e4b17023SJohn Marino  { return __builtin_fabs(__x); }
85*e4b17023SJohn Marino
86*e4b17023SJohn Marino  inline float
87*e4b17023SJohn Marino  abs(float __x)
88*e4b17023SJohn Marino  { return __builtin_fabsf(__x); }
89*e4b17023SJohn Marino
90*e4b17023SJohn Marino  inline long double
91*e4b17023SJohn Marino  abs(long double __x)
92*e4b17023SJohn Marino  { return __builtin_fabsl(__x); }
93*e4b17023SJohn Marino
94*e4b17023SJohn Marino  template<typename _Tp>
95*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
96*e4b17023SJohn Marino					   double>::__type
97*e4b17023SJohn Marino    abs(_Tp __x)
98*e4b17023SJohn Marino    { return __builtin_fabs(__x); }
99*e4b17023SJohn Marino
100*e4b17023SJohn Marino  using ::acos;
101*e4b17023SJohn Marino
102*e4b17023SJohn Marino  inline float
103*e4b17023SJohn Marino  acos(float __x)
104*e4b17023SJohn Marino  { return __builtin_acosf(__x); }
105*e4b17023SJohn Marino
106*e4b17023SJohn Marino  inline long double
107*e4b17023SJohn Marino  acos(long double __x)
108*e4b17023SJohn Marino  { return __builtin_acosl(__x); }
109*e4b17023SJohn Marino
110*e4b17023SJohn Marino  template<typename _Tp>
111*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
112*e4b17023SJohn Marino					   double>::__type
113*e4b17023SJohn Marino    acos(_Tp __x)
114*e4b17023SJohn Marino    { return __builtin_acos(__x); }
115*e4b17023SJohn Marino
116*e4b17023SJohn Marino  using ::asin;
117*e4b17023SJohn Marino
118*e4b17023SJohn Marino  inline float
119*e4b17023SJohn Marino  asin(float __x)
120*e4b17023SJohn Marino  { return __builtin_asinf(__x); }
121*e4b17023SJohn Marino
122*e4b17023SJohn Marino  inline long double
123*e4b17023SJohn Marino  asin(long double __x)
124*e4b17023SJohn Marino  { return __builtin_asinl(__x); }
125*e4b17023SJohn Marino
126*e4b17023SJohn Marino  template<typename _Tp>
127*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
128*e4b17023SJohn Marino					   double>::__type
129*e4b17023SJohn Marino    asin(_Tp __x)
130*e4b17023SJohn Marino    { return __builtin_asin(__x); }
131*e4b17023SJohn Marino
132*e4b17023SJohn Marino  using ::atan;
133*e4b17023SJohn Marino
134*e4b17023SJohn Marino  inline float
135*e4b17023SJohn Marino  atan(float __x)
136*e4b17023SJohn Marino  { return __builtin_atanf(__x); }
137*e4b17023SJohn Marino
138*e4b17023SJohn Marino  inline long double
139*e4b17023SJohn Marino  atan(long double __x)
140*e4b17023SJohn Marino  { return __builtin_atanl(__x); }
141*e4b17023SJohn Marino
142*e4b17023SJohn Marino  template<typename _Tp>
143*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
144*e4b17023SJohn Marino					   double>::__type
145*e4b17023SJohn Marino    atan(_Tp __x)
146*e4b17023SJohn Marino    { return __builtin_atan(__x); }
147*e4b17023SJohn Marino
148*e4b17023SJohn Marino  using ::atan2;
149*e4b17023SJohn Marino
150*e4b17023SJohn Marino  inline float
151*e4b17023SJohn Marino  atan2(float __y, float __x)
152*e4b17023SJohn Marino  { return __builtin_atan2f(__y, __x); }
153*e4b17023SJohn Marino
154*e4b17023SJohn Marino  inline long double
155*e4b17023SJohn Marino  atan2(long double __y, long double __x)
156*e4b17023SJohn Marino  { return __builtin_atan2l(__y, __x); }
157*e4b17023SJohn Marino
158*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
159*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value
160*e4b17023SJohn Marino    					   && __is_integer<_Up>::__value,
161*e4b17023SJohn Marino					   double>::__type
162*e4b17023SJohn Marino    atan2(_Tp __y, _Up __x)
163*e4b17023SJohn Marino    { return __builtin_atan2(__y, __x); }
164*e4b17023SJohn Marino
165*e4b17023SJohn Marino  using ::ceil;
166*e4b17023SJohn Marino
167*e4b17023SJohn Marino  inline float
168*e4b17023SJohn Marino  ceil(float __x)
169*e4b17023SJohn Marino  { return __builtin_ceilf(__x); }
170*e4b17023SJohn Marino
171*e4b17023SJohn Marino  inline long double
172*e4b17023SJohn Marino  ceil(long double __x)
173*e4b17023SJohn Marino  { return __builtin_ceill(__x); }
174*e4b17023SJohn Marino
175*e4b17023SJohn Marino  template<typename _Tp>
176*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
177*e4b17023SJohn Marino					   double>::__type
178*e4b17023SJohn Marino    ceil(_Tp __x)
179*e4b17023SJohn Marino    { return __builtin_ceil(__x); }
180*e4b17023SJohn Marino
181*e4b17023SJohn Marino  using ::cos;
182*e4b17023SJohn Marino
183*e4b17023SJohn Marino  inline float
184*e4b17023SJohn Marino  cos(float __x)
185*e4b17023SJohn Marino  { return __builtin_cosf(__x); }
186*e4b17023SJohn Marino
187*e4b17023SJohn Marino  inline long double
188*e4b17023SJohn Marino  cos(long double __x)
189*e4b17023SJohn Marino  { return __builtin_cosl(__x); }
190*e4b17023SJohn Marino
191*e4b17023SJohn Marino  template<typename _Tp>
192*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
193*e4b17023SJohn Marino					   double>::__type
194*e4b17023SJohn Marino    cos(_Tp __x)
195*e4b17023SJohn Marino    { return __builtin_cos(__x); }
196*e4b17023SJohn Marino
197*e4b17023SJohn Marino  using ::cosh;
198*e4b17023SJohn Marino
199*e4b17023SJohn Marino  inline float
200*e4b17023SJohn Marino  cosh(float __x)
201*e4b17023SJohn Marino  { return __builtin_coshf(__x); }
202*e4b17023SJohn Marino
203*e4b17023SJohn Marino  inline long double
204*e4b17023SJohn Marino  cosh(long double __x)
205*e4b17023SJohn Marino  { return __builtin_coshl(__x); }
206*e4b17023SJohn Marino
207*e4b17023SJohn Marino  template<typename _Tp>
208*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
209*e4b17023SJohn Marino					   double>::__type
210*e4b17023SJohn Marino    cosh(_Tp __x)
211*e4b17023SJohn Marino    { return __builtin_cosh(__x); }
212*e4b17023SJohn Marino
213*e4b17023SJohn Marino  using ::exp;
214*e4b17023SJohn Marino
215*e4b17023SJohn Marino  inline float
216*e4b17023SJohn Marino  exp(float __x)
217*e4b17023SJohn Marino  { return __builtin_expf(__x); }
218*e4b17023SJohn Marino
219*e4b17023SJohn Marino  inline long double
220*e4b17023SJohn Marino  exp(long double __x)
221*e4b17023SJohn Marino  { return __builtin_expl(__x); }
222*e4b17023SJohn Marino
223*e4b17023SJohn Marino  template<typename _Tp>
224*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
225*e4b17023SJohn Marino					   double>::__type
226*e4b17023SJohn Marino    exp(_Tp __x)
227*e4b17023SJohn Marino    { return __builtin_exp(__x); }
228*e4b17023SJohn Marino
229*e4b17023SJohn Marino  using ::fabs;
230*e4b17023SJohn Marino
231*e4b17023SJohn Marino  inline float
232*e4b17023SJohn Marino  fabs(float __x)
233*e4b17023SJohn Marino  { return __builtin_fabsf(__x); }
234*e4b17023SJohn Marino
235*e4b17023SJohn Marino  inline long double
236*e4b17023SJohn Marino  fabs(long double __x)
237*e4b17023SJohn Marino  { return __builtin_fabsl(__x); }
238*e4b17023SJohn Marino
239*e4b17023SJohn Marino  template<typename _Tp>
240*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
241*e4b17023SJohn Marino					   double>::__type
242*e4b17023SJohn Marino    fabs(_Tp __x)
243*e4b17023SJohn Marino    { return __builtin_fabs(__x); }
244*e4b17023SJohn Marino
245*e4b17023SJohn Marino  using ::floor;
246*e4b17023SJohn Marino
247*e4b17023SJohn Marino  inline float
248*e4b17023SJohn Marino  floor(float __x)
249*e4b17023SJohn Marino  { return __builtin_floorf(__x); }
250*e4b17023SJohn Marino
251*e4b17023SJohn Marino  inline long double
252*e4b17023SJohn Marino  floor(long double __x)
253*e4b17023SJohn Marino  { return __builtin_floorl(__x); }
254*e4b17023SJohn Marino
255*e4b17023SJohn Marino  template<typename _Tp>
256*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
257*e4b17023SJohn Marino					   double>::__type
258*e4b17023SJohn Marino    floor(_Tp __x)
259*e4b17023SJohn Marino    { return __builtin_floor(__x); }
260*e4b17023SJohn Marino
261*e4b17023SJohn Marino  using ::fmod;
262*e4b17023SJohn Marino
263*e4b17023SJohn Marino  inline float
264*e4b17023SJohn Marino  fmod(float __x, float __y)
265*e4b17023SJohn Marino  { return __builtin_fmodf(__x, __y); }
266*e4b17023SJohn Marino
267*e4b17023SJohn Marino  inline long double
268*e4b17023SJohn Marino  fmod(long double __x, long double __y)
269*e4b17023SJohn Marino  { return __builtin_fmodl(__x, __y); }
270*e4b17023SJohn Marino
271*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
272*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value
273*e4b17023SJohn Marino    					   && __is_integer<_Up>::__value,
274*e4b17023SJohn Marino					   double>::__type
275*e4b17023SJohn Marino    fmod(_Tp __x, _Up __y)
276*e4b17023SJohn Marino    { return __builtin_fmod(__x, __y); }
277*e4b17023SJohn Marino
278*e4b17023SJohn Marino  using ::frexp;
279*e4b17023SJohn Marino
280*e4b17023SJohn Marino  inline float
281*e4b17023SJohn Marino  frexp(float __x, int* __exp)
282*e4b17023SJohn Marino  { return __builtin_frexpf(__x, __exp); }
283*e4b17023SJohn Marino
284*e4b17023SJohn Marino  inline long double
285*e4b17023SJohn Marino  frexp(long double __x, int* __exp)
286*e4b17023SJohn Marino  { return __builtin_frexpl(__x, __exp); }
287*e4b17023SJohn Marino
288*e4b17023SJohn Marino  template<typename _Tp>
289*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
290*e4b17023SJohn Marino					   double>::__type
291*e4b17023SJohn Marino    frexp(_Tp __x, int* __exp)
292*e4b17023SJohn Marino    { return __builtin_frexp(__x, __exp); }
293*e4b17023SJohn Marino
294*e4b17023SJohn Marino  using ::ldexp;
295*e4b17023SJohn Marino
296*e4b17023SJohn Marino  inline float
297*e4b17023SJohn Marino  ldexp(float __x, int __exp)
298*e4b17023SJohn Marino  { return __builtin_ldexpf(__x, __exp); }
299*e4b17023SJohn Marino
300*e4b17023SJohn Marino  inline long double
301*e4b17023SJohn Marino  ldexp(long double __x, int __exp)
302*e4b17023SJohn Marino  { return __builtin_ldexpl(__x, __exp); }
303*e4b17023SJohn Marino
304*e4b17023SJohn Marino  template<typename _Tp>
305*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
306*e4b17023SJohn Marino					   double>::__type
307*e4b17023SJohn Marino    ldexp(_Tp __x, int __exp)
308*e4b17023SJohn Marino    { return __builtin_ldexp(__x, __exp); }
309*e4b17023SJohn Marino
310*e4b17023SJohn Marino  using ::log;
311*e4b17023SJohn Marino
312*e4b17023SJohn Marino  inline float
313*e4b17023SJohn Marino  log(float __x)
314*e4b17023SJohn Marino  { return __builtin_logf(__x); }
315*e4b17023SJohn Marino
316*e4b17023SJohn Marino  inline long double
317*e4b17023SJohn Marino  log(long double __x)
318*e4b17023SJohn Marino  { return __builtin_logl(__x); }
319*e4b17023SJohn Marino
320*e4b17023SJohn Marino  template<typename _Tp>
321*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
322*e4b17023SJohn Marino					   double>::__type
323*e4b17023SJohn Marino    log(_Tp __x)
324*e4b17023SJohn Marino    { return __builtin_log(__x); }
325*e4b17023SJohn Marino
326*e4b17023SJohn Marino  using ::log10;
327*e4b17023SJohn Marino
328*e4b17023SJohn Marino  inline float
329*e4b17023SJohn Marino  log10(float __x)
330*e4b17023SJohn Marino  { return __builtin_log10f(__x); }
331*e4b17023SJohn Marino
332*e4b17023SJohn Marino  inline long double
333*e4b17023SJohn Marino  log10(long double __x)
334*e4b17023SJohn Marino  { return __builtin_log10l(__x); }
335*e4b17023SJohn Marino
336*e4b17023SJohn Marino  template<typename _Tp>
337*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
338*e4b17023SJohn Marino					   double>::__type
339*e4b17023SJohn Marino    log10(_Tp __x)
340*e4b17023SJohn Marino    { return __builtin_log10(__x); }
341*e4b17023SJohn Marino
342*e4b17023SJohn Marino  using ::modf;
343*e4b17023SJohn Marino
344*e4b17023SJohn Marino  inline float
345*e4b17023SJohn Marino  modf(float __x, float* __iptr)
346*e4b17023SJohn Marino  { return __builtin_modff(__x, __iptr); }
347*e4b17023SJohn Marino
348*e4b17023SJohn Marino  inline long double
349*e4b17023SJohn Marino  modf(long double __x, long double* __iptr)
350*e4b17023SJohn Marino  { return __builtin_modfl(__x, __iptr); }
351*e4b17023SJohn Marino
352*e4b17023SJohn Marino  using ::pow;
353*e4b17023SJohn Marino
354*e4b17023SJohn Marino  inline float
355*e4b17023SJohn Marino  pow(float __x, float __y)
356*e4b17023SJohn Marino  { return __builtin_powf(__x, __y); }
357*e4b17023SJohn Marino
358*e4b17023SJohn Marino  inline long double
359*e4b17023SJohn Marino  pow(long double __x, long double __y)
360*e4b17023SJohn Marino  { return __builtin_powl(__x, __y); }
361*e4b17023SJohn Marino
362*e4b17023SJohn Marino  inline double
363*e4b17023SJohn Marino  pow(double __x, int __i)
364*e4b17023SJohn Marino  { return __builtin_powi(__x, __i); }
365*e4b17023SJohn Marino
366*e4b17023SJohn Marino  inline float
367*e4b17023SJohn Marino  pow(float __x, int __n)
368*e4b17023SJohn Marino  { return __builtin_powif(__x, __n); }
369*e4b17023SJohn Marino
370*e4b17023SJohn Marino  inline long double
371*e4b17023SJohn Marino  pow(long double __x, int __n)
372*e4b17023SJohn Marino  { return __builtin_powil(__x, __n); }
373*e4b17023SJohn Marino
374*e4b17023SJohn Marino  using ::sin;
375*e4b17023SJohn Marino
376*e4b17023SJohn Marino  inline float
377*e4b17023SJohn Marino  sin(float __x)
378*e4b17023SJohn Marino  { return __builtin_sinf(__x); }
379*e4b17023SJohn Marino
380*e4b17023SJohn Marino  inline long double
381*e4b17023SJohn Marino  sin(long double __x)
382*e4b17023SJohn Marino  { return __builtin_sinl(__x); }
383*e4b17023SJohn Marino
384*e4b17023SJohn Marino  template<typename _Tp>
385*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
386*e4b17023SJohn Marino					   double>::__type
387*e4b17023SJohn Marino    sin(_Tp __x)
388*e4b17023SJohn Marino    { return __builtin_sin(__x); }
389*e4b17023SJohn Marino
390*e4b17023SJohn Marino  using ::sinh;
391*e4b17023SJohn Marino
392*e4b17023SJohn Marino  inline float
393*e4b17023SJohn Marino  sinh(float __x)
394*e4b17023SJohn Marino  { return __builtin_sinhf(__x); }
395*e4b17023SJohn Marino
396*e4b17023SJohn Marino  inline long double
397*e4b17023SJohn Marino  sinh(long double __x)
398*e4b17023SJohn Marino  { return __builtin_sinhl(__x); }
399*e4b17023SJohn Marino
400*e4b17023SJohn Marino  template<typename _Tp>
401*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
402*e4b17023SJohn Marino					   double>::__type
403*e4b17023SJohn Marino    sinh(_Tp __x)
404*e4b17023SJohn Marino    { return __builtin_sinh(__x); }
405*e4b17023SJohn Marino
406*e4b17023SJohn Marino  using ::sqrt;
407*e4b17023SJohn Marino
408*e4b17023SJohn Marino  inline float
409*e4b17023SJohn Marino  sqrt(float __x)
410*e4b17023SJohn Marino  { return __builtin_sqrtf(__x); }
411*e4b17023SJohn Marino
412*e4b17023SJohn Marino  inline long double
413*e4b17023SJohn Marino  sqrt(long double __x)
414*e4b17023SJohn Marino  { return __builtin_sqrtl(__x); }
415*e4b17023SJohn Marino
416*e4b17023SJohn Marino  template<typename _Tp>
417*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
418*e4b17023SJohn Marino					   double>::__type
419*e4b17023SJohn Marino    sqrt(_Tp __x)
420*e4b17023SJohn Marino    { return __builtin_sqrt(__x); }
421*e4b17023SJohn Marino
422*e4b17023SJohn Marino  using ::tan;
423*e4b17023SJohn Marino
424*e4b17023SJohn Marino  inline float
425*e4b17023SJohn Marino  tan(float __x)
426*e4b17023SJohn Marino  { return __builtin_tanf(__x); }
427*e4b17023SJohn Marino
428*e4b17023SJohn Marino  inline long double
429*e4b17023SJohn Marino  tan(long double __x)
430*e4b17023SJohn Marino  { return __builtin_tanl(__x); }
431*e4b17023SJohn Marino
432*e4b17023SJohn Marino  template<typename _Tp>
433*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
434*e4b17023SJohn Marino					   double>::__type
435*e4b17023SJohn Marino    tan(_Tp __x)
436*e4b17023SJohn Marino    { return __builtin_tan(__x); }
437*e4b17023SJohn Marino
438*e4b17023SJohn Marino  using ::tanh;
439*e4b17023SJohn Marino
440*e4b17023SJohn Marino  inline float
441*e4b17023SJohn Marino  tanh(float __x)
442*e4b17023SJohn Marino  { return __builtin_tanhf(__x); }
443*e4b17023SJohn Marino
444*e4b17023SJohn Marino  inline long double
445*e4b17023SJohn Marino  tanh(long double __x)
446*e4b17023SJohn Marino  { return __builtin_tanhl(__x); }
447*e4b17023SJohn Marino
448*e4b17023SJohn Marino  template<typename _Tp>
449*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
450*e4b17023SJohn Marino					   double>::__type
451*e4b17023SJohn Marino    tanh(_Tp __x)
452*e4b17023SJohn Marino    { return __builtin_tanh(__x); }
453*e4b17023SJohn Marino
454*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION
455*e4b17023SJohn Marino} // namespace
456*e4b17023SJohn Marino
457*e4b17023SJohn Marino#if _GLIBCXX_USE_C99_MATH
458*e4b17023SJohn Marino#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
459*e4b17023SJohn Marino
460*e4b17023SJohn Marino// These are possible macros imported from C99-land.
461*e4b17023SJohn Marino#undef fpclassify
462*e4b17023SJohn Marino#undef isfinite
463*e4b17023SJohn Marino#undef isinf
464*e4b17023SJohn Marino#undef isnan
465*e4b17023SJohn Marino#undef isnormal
466*e4b17023SJohn Marino#undef signbit
467*e4b17023SJohn Marino#undef isgreater
468*e4b17023SJohn Marino#undef isgreaterequal
469*e4b17023SJohn Marino#undef isless
470*e4b17023SJohn Marino#undef islessequal
471*e4b17023SJohn Marino#undef islessgreater
472*e4b17023SJohn Marino#undef isunordered
473*e4b17023SJohn Marino
474*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default)
475*e4b17023SJohn Marino{
476*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION
477*e4b17023SJohn Marino
478*e4b17023SJohn Marino  template<typename _Tp>
479*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
480*e4b17023SJohn Marino					   int>::__type
481*e4b17023SJohn Marino    fpclassify(_Tp __f)
482*e4b17023SJohn Marino    {
483*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
484*e4b17023SJohn Marino      return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
485*e4b17023SJohn Marino				  FP_SUBNORMAL, FP_ZERO, __type(__f));
486*e4b17023SJohn Marino    }
487*e4b17023SJohn Marino
488*e4b17023SJohn Marino  template<typename _Tp>
489*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
490*e4b17023SJohn Marino					   int>::__type
491*e4b17023SJohn Marino    isfinite(_Tp __f)
492*e4b17023SJohn Marino    {
493*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
494*e4b17023SJohn Marino      return __builtin_isfinite(__type(__f));
495*e4b17023SJohn Marino    }
496*e4b17023SJohn Marino
497*e4b17023SJohn Marino  template<typename _Tp>
498*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
499*e4b17023SJohn Marino					   int>::__type
500*e4b17023SJohn Marino    isinf(_Tp __f)
501*e4b17023SJohn Marino    {
502*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
503*e4b17023SJohn Marino      return __builtin_isinf(__type(__f));
504*e4b17023SJohn Marino    }
505*e4b17023SJohn Marino
506*e4b17023SJohn Marino  template<typename _Tp>
507*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
508*e4b17023SJohn Marino					   int>::__type
509*e4b17023SJohn Marino    isnan(_Tp __f)
510*e4b17023SJohn Marino    {
511*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
512*e4b17023SJohn Marino      return __builtin_isnan(__type(__f));
513*e4b17023SJohn Marino    }
514*e4b17023SJohn Marino
515*e4b17023SJohn Marino  template<typename _Tp>
516*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
517*e4b17023SJohn Marino					   int>::__type
518*e4b17023SJohn Marino    isnormal(_Tp __f)
519*e4b17023SJohn Marino    {
520*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
521*e4b17023SJohn Marino      return __builtin_isnormal(__type(__f));
522*e4b17023SJohn Marino    }
523*e4b17023SJohn Marino
524*e4b17023SJohn Marino  template<typename _Tp>
525*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
526*e4b17023SJohn Marino					   int>::__type
527*e4b17023SJohn Marino    signbit(_Tp __f)
528*e4b17023SJohn Marino    {
529*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
530*e4b17023SJohn Marino      return __builtin_signbit(__type(__f));
531*e4b17023SJohn Marino    }
532*e4b17023SJohn Marino
533*e4b17023SJohn Marino  template<typename _Tp>
534*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
535*e4b17023SJohn Marino					   int>::__type
536*e4b17023SJohn Marino    isgreater(_Tp __f1, _Tp __f2)
537*e4b17023SJohn Marino    {
538*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
539*e4b17023SJohn Marino      return __builtin_isgreater(__type(__f1), __type(__f2));
540*e4b17023SJohn Marino    }
541*e4b17023SJohn Marino
542*e4b17023SJohn Marino  template<typename _Tp>
543*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
544*e4b17023SJohn Marino					   int>::__type
545*e4b17023SJohn Marino    isgreaterequal(_Tp __f1, _Tp __f2)
546*e4b17023SJohn Marino    {
547*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
548*e4b17023SJohn Marino      return __builtin_isgreaterequal(__type(__f1), __type(__f2));
549*e4b17023SJohn Marino    }
550*e4b17023SJohn Marino
551*e4b17023SJohn Marino  template<typename _Tp>
552*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
553*e4b17023SJohn Marino					   int>::__type
554*e4b17023SJohn Marino    isless(_Tp __f1, _Tp __f2)
555*e4b17023SJohn Marino    {
556*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
557*e4b17023SJohn Marino      return __builtin_isless(__type(__f1), __type(__f2));
558*e4b17023SJohn Marino    }
559*e4b17023SJohn Marino
560*e4b17023SJohn Marino  template<typename _Tp>
561*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
562*e4b17023SJohn Marino					   int>::__type
563*e4b17023SJohn Marino    islessequal(_Tp __f1, _Tp __f2)
564*e4b17023SJohn Marino    {
565*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
566*e4b17023SJohn Marino      return __builtin_islessequal(__type(__f1), __type(__f2));
567*e4b17023SJohn Marino    }
568*e4b17023SJohn Marino
569*e4b17023SJohn Marino  template<typename _Tp>
570*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
571*e4b17023SJohn Marino					   int>::__type
572*e4b17023SJohn Marino    islessgreater(_Tp __f1, _Tp __f2)
573*e4b17023SJohn Marino    {
574*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
575*e4b17023SJohn Marino      return __builtin_islessgreater(__type(__f1), __type(__f2));
576*e4b17023SJohn Marino    }
577*e4b17023SJohn Marino
578*e4b17023SJohn Marino  template<typename _Tp>
579*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
580*e4b17023SJohn Marino					   int>::__type
581*e4b17023SJohn Marino    isunordered(_Tp __f1, _Tp __f2)
582*e4b17023SJohn Marino    {
583*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
584*e4b17023SJohn Marino      return __builtin_isunordered(__type(__f1), __type(__f2));
585*e4b17023SJohn Marino    }
586*e4b17023SJohn Marino
587*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION
588*e4b17023SJohn Marino} // namespace std
589*e4b17023SJohn Marino
590*e4b17023SJohn Marino#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
591*e4b17023SJohn Marino#endif
592*e4b17023SJohn Marino
593*e4b17023SJohn Marino#endif
594