xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/c_global/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, 2011
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#pragma GCC system_header
42*e4b17023SJohn Marino
43*e4b17023SJohn Marino#include <bits/c++config.h>
44*e4b17023SJohn Marino#include <bits/cpp_type_traits.h>
45*e4b17023SJohn Marino#include <ext/type_traits.h>
46*e4b17023SJohn Marino#include <math.h>
47*e4b17023SJohn Marino
48*e4b17023SJohn Marino#ifndef _GLIBCXX_CMATH
49*e4b17023SJohn Marino#define _GLIBCXX_CMATH 1
50*e4b17023SJohn Marino
51*e4b17023SJohn Marino// Get rid of those macros defined in <math.h> in lieu of real functions.
52*e4b17023SJohn Marino#undef abs
53*e4b17023SJohn Marino#undef div
54*e4b17023SJohn Marino#undef acos
55*e4b17023SJohn Marino#undef asin
56*e4b17023SJohn Marino#undef atan
57*e4b17023SJohn Marino#undef atan2
58*e4b17023SJohn Marino#undef ceil
59*e4b17023SJohn Marino#undef cos
60*e4b17023SJohn Marino#undef cosh
61*e4b17023SJohn Marino#undef exp
62*e4b17023SJohn Marino#undef fabs
63*e4b17023SJohn Marino#undef floor
64*e4b17023SJohn Marino#undef fmod
65*e4b17023SJohn Marino#undef frexp
66*e4b17023SJohn Marino#undef ldexp
67*e4b17023SJohn Marino#undef log
68*e4b17023SJohn Marino#undef log10
69*e4b17023SJohn Marino#undef modf
70*e4b17023SJohn Marino#undef pow
71*e4b17023SJohn Marino#undef sin
72*e4b17023SJohn Marino#undef sinh
73*e4b17023SJohn Marino#undef sqrt
74*e4b17023SJohn Marino#undef tan
75*e4b17023SJohn Marino#undef tanh
76*e4b17023SJohn Marino
77*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default)
78*e4b17023SJohn Marino{
79*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION
80*e4b17023SJohn Marino
81*e4b17023SJohn Marino#if !defined(__CORRECT_ISO_CPP_MATH_H_PROTO1) \
82*e4b17023SJohn Marino  && !defined(__CORRECT_ISO_CPP_MATH_H_PROTO2)
83*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR double
84*e4b17023SJohn Marino  abs(double __x)
85*e4b17023SJohn Marino  { return __builtin_fabs(__x); }
86*e4b17023SJohn Marino#endif
87*e4b17023SJohn Marino
88*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
89*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
90*e4b17023SJohn Marino  abs(float __x)
91*e4b17023SJohn Marino  { return __builtin_fabsf(__x); }
92*e4b17023SJohn Marino
93*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
94*e4b17023SJohn Marino  abs(long double __x)
95*e4b17023SJohn Marino  { return __builtin_fabsl(__x); }
96*e4b17023SJohn Marino#endif
97*e4b17023SJohn Marino
98*e4b17023SJohn Marino  template<typename _Tp>
99*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
100*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
101*e4b17023SJohn Marino                                    double>::__type
102*e4b17023SJohn Marino    abs(_Tp __x)
103*e4b17023SJohn Marino    { return __builtin_fabs(__x); }
104*e4b17023SJohn Marino
105*e4b17023SJohn Marino  using ::acos;
106*e4b17023SJohn Marino
107*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
108*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
109*e4b17023SJohn Marino  acos(float __x)
110*e4b17023SJohn Marino  { return __builtin_acosf(__x); }
111*e4b17023SJohn Marino
112*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
113*e4b17023SJohn Marino  acos(long double __x)
114*e4b17023SJohn Marino  { return __builtin_acosl(__x); }
115*e4b17023SJohn Marino#endif
116*e4b17023SJohn Marino
117*e4b17023SJohn Marino  template<typename _Tp>
118*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
119*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
120*e4b17023SJohn Marino                                    double>::__type
121*e4b17023SJohn Marino    acos(_Tp __x)
122*e4b17023SJohn Marino    { return __builtin_acos(__x); }
123*e4b17023SJohn Marino
124*e4b17023SJohn Marino  using ::asin;
125*e4b17023SJohn Marino
126*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
127*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
128*e4b17023SJohn Marino  asin(float __x)
129*e4b17023SJohn Marino  { return __builtin_asinf(__x); }
130*e4b17023SJohn Marino
131*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
132*e4b17023SJohn Marino  asin(long double __x)
133*e4b17023SJohn Marino  { return __builtin_asinl(__x); }
134*e4b17023SJohn Marino#endif
135*e4b17023SJohn Marino
136*e4b17023SJohn Marino  template<typename _Tp>
137*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
138*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
139*e4b17023SJohn Marino                                    double>::__type
140*e4b17023SJohn Marino    asin(_Tp __x)
141*e4b17023SJohn Marino    { return __builtin_asin(__x); }
142*e4b17023SJohn Marino
143*e4b17023SJohn Marino  using ::atan;
144*e4b17023SJohn Marino
145*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
146*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
147*e4b17023SJohn Marino  atan(float __x)
148*e4b17023SJohn Marino  { return __builtin_atanf(__x); }
149*e4b17023SJohn Marino
150*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
151*e4b17023SJohn Marino  atan(long double __x)
152*e4b17023SJohn Marino  { return __builtin_atanl(__x); }
153*e4b17023SJohn Marino#endif
154*e4b17023SJohn Marino
155*e4b17023SJohn Marino  template<typename _Tp>
156*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
157*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
158*e4b17023SJohn Marino                                    double>::__type
159*e4b17023SJohn Marino    atan(_Tp __x)
160*e4b17023SJohn Marino    { return __builtin_atan(__x); }
161*e4b17023SJohn Marino
162*e4b17023SJohn Marino  using ::atan2;
163*e4b17023SJohn Marino
164*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
165*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
166*e4b17023SJohn Marino  atan2(float __y, float __x)
167*e4b17023SJohn Marino  { return __builtin_atan2f(__y, __x); }
168*e4b17023SJohn Marino
169*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
170*e4b17023SJohn Marino  atan2(long double __y, long double __x)
171*e4b17023SJohn Marino  { return __builtin_atan2l(__y, __x); }
172*e4b17023SJohn Marino#endif
173*e4b17023SJohn Marino
174*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
175*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
176*e4b17023SJohn Marino    typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
177*e4b17023SJohn Marino    atan2(_Tp __y, _Up __x)
178*e4b17023SJohn Marino    {
179*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
180*e4b17023SJohn Marino      return atan2(__type(__y), __type(__x));
181*e4b17023SJohn Marino    }
182*e4b17023SJohn Marino
183*e4b17023SJohn Marino  using ::ceil;
184*e4b17023SJohn Marino
185*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
186*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
187*e4b17023SJohn Marino  ceil(float __x)
188*e4b17023SJohn Marino  { return __builtin_ceilf(__x); }
189*e4b17023SJohn Marino
190*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
191*e4b17023SJohn Marino  ceil(long double __x)
192*e4b17023SJohn Marino  { return __builtin_ceill(__x); }
193*e4b17023SJohn Marino#endif
194*e4b17023SJohn Marino
195*e4b17023SJohn Marino  template<typename _Tp>
196*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
197*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
198*e4b17023SJohn Marino                                    double>::__type
199*e4b17023SJohn Marino    ceil(_Tp __x)
200*e4b17023SJohn Marino    { return __builtin_ceil(__x); }
201*e4b17023SJohn Marino
202*e4b17023SJohn Marino  using ::cos;
203*e4b17023SJohn Marino
204*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
205*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
206*e4b17023SJohn Marino  cos(float __x)
207*e4b17023SJohn Marino  { return __builtin_cosf(__x); }
208*e4b17023SJohn Marino
209*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
210*e4b17023SJohn Marino  cos(long double __x)
211*e4b17023SJohn Marino  { return __builtin_cosl(__x); }
212*e4b17023SJohn Marino#endif
213*e4b17023SJohn Marino
214*e4b17023SJohn Marino  template<typename _Tp>
215*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
216*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
217*e4b17023SJohn Marino                                    double>::__type
218*e4b17023SJohn Marino    cos(_Tp __x)
219*e4b17023SJohn Marino    { return __builtin_cos(__x); }
220*e4b17023SJohn Marino
221*e4b17023SJohn Marino  using ::cosh;
222*e4b17023SJohn Marino
223*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
224*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
225*e4b17023SJohn Marino  cosh(float __x)
226*e4b17023SJohn Marino  { return __builtin_coshf(__x); }
227*e4b17023SJohn Marino
228*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
229*e4b17023SJohn Marino  cosh(long double __x)
230*e4b17023SJohn Marino  { return __builtin_coshl(__x); }
231*e4b17023SJohn Marino#endif
232*e4b17023SJohn Marino
233*e4b17023SJohn Marino  template<typename _Tp>
234*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
235*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
236*e4b17023SJohn Marino                                    double>::__type
237*e4b17023SJohn Marino    cosh(_Tp __x)
238*e4b17023SJohn Marino    { return __builtin_cosh(__x); }
239*e4b17023SJohn Marino
240*e4b17023SJohn Marino  using ::exp;
241*e4b17023SJohn Marino
242*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
243*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
244*e4b17023SJohn Marino  exp(float __x)
245*e4b17023SJohn Marino  { return __builtin_expf(__x); }
246*e4b17023SJohn Marino
247*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
248*e4b17023SJohn Marino  exp(long double __x)
249*e4b17023SJohn Marino  { return __builtin_expl(__x); }
250*e4b17023SJohn Marino#endif
251*e4b17023SJohn Marino
252*e4b17023SJohn Marino  template<typename _Tp>
253*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
254*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
255*e4b17023SJohn Marino                                    double>::__type
256*e4b17023SJohn Marino    exp(_Tp __x)
257*e4b17023SJohn Marino    { return __builtin_exp(__x); }
258*e4b17023SJohn Marino
259*e4b17023SJohn Marino  using ::fabs;
260*e4b17023SJohn Marino
261*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
262*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
263*e4b17023SJohn Marino  fabs(float __x)
264*e4b17023SJohn Marino  { return __builtin_fabsf(__x); }
265*e4b17023SJohn Marino
266*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
267*e4b17023SJohn Marino  fabs(long double __x)
268*e4b17023SJohn Marino  { return __builtin_fabsl(__x); }
269*e4b17023SJohn Marino#endif
270*e4b17023SJohn Marino
271*e4b17023SJohn Marino  template<typename _Tp>
272*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
273*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
274*e4b17023SJohn Marino                                    double>::__type
275*e4b17023SJohn Marino    fabs(_Tp __x)
276*e4b17023SJohn Marino    { return __builtin_fabs(__x); }
277*e4b17023SJohn Marino
278*e4b17023SJohn Marino  using ::floor;
279*e4b17023SJohn Marino
280*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
281*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
282*e4b17023SJohn Marino  floor(float __x)
283*e4b17023SJohn Marino  { return __builtin_floorf(__x); }
284*e4b17023SJohn Marino
285*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
286*e4b17023SJohn Marino  floor(long double __x)
287*e4b17023SJohn Marino  { return __builtin_floorl(__x); }
288*e4b17023SJohn Marino#endif
289*e4b17023SJohn Marino
290*e4b17023SJohn Marino  template<typename _Tp>
291*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
292*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
293*e4b17023SJohn Marino                                    double>::__type
294*e4b17023SJohn Marino    floor(_Tp __x)
295*e4b17023SJohn Marino    { return __builtin_floor(__x); }
296*e4b17023SJohn Marino
297*e4b17023SJohn Marino  using ::fmod;
298*e4b17023SJohn Marino
299*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
300*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
301*e4b17023SJohn Marino  fmod(float __x, float __y)
302*e4b17023SJohn Marino  { return __builtin_fmodf(__x, __y); }
303*e4b17023SJohn Marino
304*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
305*e4b17023SJohn Marino  fmod(long double __x, long double __y)
306*e4b17023SJohn Marino  { return __builtin_fmodl(__x, __y); }
307*e4b17023SJohn Marino#endif
308*e4b17023SJohn Marino
309*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
310*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
311*e4b17023SJohn Marino    typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
312*e4b17023SJohn Marino    fmod(_Tp __x, _Up __y)
313*e4b17023SJohn Marino    {
314*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
315*e4b17023SJohn Marino      return fmod(__type(__x), __type(__y));
316*e4b17023SJohn Marino    }
317*e4b17023SJohn Marino
318*e4b17023SJohn Marino  using ::frexp;
319*e4b17023SJohn Marino
320*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
321*e4b17023SJohn Marino  inline float
322*e4b17023SJohn Marino  frexp(float __x, int* __exp)
323*e4b17023SJohn Marino  { return __builtin_frexpf(__x, __exp); }
324*e4b17023SJohn Marino
325*e4b17023SJohn Marino  inline long double
326*e4b17023SJohn Marino  frexp(long double __x, int* __exp)
327*e4b17023SJohn Marino  { return __builtin_frexpl(__x, __exp); }
328*e4b17023SJohn Marino#endif
329*e4b17023SJohn Marino
330*e4b17023SJohn Marino  template<typename _Tp>
331*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
332*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
333*e4b17023SJohn Marino                                    double>::__type
334*e4b17023SJohn Marino    frexp(_Tp __x, int* __exp)
335*e4b17023SJohn Marino    { return __builtin_frexp(__x, __exp); }
336*e4b17023SJohn Marino
337*e4b17023SJohn Marino  using ::ldexp;
338*e4b17023SJohn Marino
339*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
340*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
341*e4b17023SJohn Marino  ldexp(float __x, int __exp)
342*e4b17023SJohn Marino  { return __builtin_ldexpf(__x, __exp); }
343*e4b17023SJohn Marino
344*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
345*e4b17023SJohn Marino  ldexp(long double __x, int __exp)
346*e4b17023SJohn Marino  { return __builtin_ldexpl(__x, __exp); }
347*e4b17023SJohn Marino#endif
348*e4b17023SJohn Marino
349*e4b17023SJohn Marino  template<typename _Tp>
350*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
351*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
352*e4b17023SJohn Marino                                    double>::__type
353*e4b17023SJohn Marino    ldexp(_Tp __x, int __exp)
354*e4b17023SJohn Marino    { return __builtin_ldexp(__x, __exp); }
355*e4b17023SJohn Marino
356*e4b17023SJohn Marino  using ::log;
357*e4b17023SJohn Marino
358*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
359*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
360*e4b17023SJohn Marino  log(float __x)
361*e4b17023SJohn Marino  { return __builtin_logf(__x); }
362*e4b17023SJohn Marino
363*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
364*e4b17023SJohn Marino  log(long double __x)
365*e4b17023SJohn Marino  { return __builtin_logl(__x); }
366*e4b17023SJohn Marino#endif
367*e4b17023SJohn Marino
368*e4b17023SJohn Marino  template<typename _Tp>
369*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
370*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
371*e4b17023SJohn Marino                                    double>::__type
372*e4b17023SJohn Marino    log(_Tp __x)
373*e4b17023SJohn Marino    { return __builtin_log(__x); }
374*e4b17023SJohn Marino
375*e4b17023SJohn Marino  using ::log10;
376*e4b17023SJohn Marino
377*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
378*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
379*e4b17023SJohn Marino  log10(float __x)
380*e4b17023SJohn Marino  { return __builtin_log10f(__x); }
381*e4b17023SJohn Marino
382*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
383*e4b17023SJohn Marino  log10(long double __x)
384*e4b17023SJohn Marino  { return __builtin_log10l(__x); }
385*e4b17023SJohn Marino#endif
386*e4b17023SJohn Marino
387*e4b17023SJohn Marino  template<typename _Tp>
388*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
389*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
390*e4b17023SJohn Marino                                    double>::__type
391*e4b17023SJohn Marino    log10(_Tp __x)
392*e4b17023SJohn Marino    { return __builtin_log10(__x); }
393*e4b17023SJohn Marino
394*e4b17023SJohn Marino  using ::modf;
395*e4b17023SJohn Marino
396*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
397*e4b17023SJohn Marino  inline float
398*e4b17023SJohn Marino  modf(float __x, float* __iptr)
399*e4b17023SJohn Marino  { return __builtin_modff(__x, __iptr); }
400*e4b17023SJohn Marino
401*e4b17023SJohn Marino  inline long double
402*e4b17023SJohn Marino  modf(long double __x, long double* __iptr)
403*e4b17023SJohn Marino  { return __builtin_modfl(__x, __iptr); }
404*e4b17023SJohn Marino#endif
405*e4b17023SJohn Marino
406*e4b17023SJohn Marino  using ::pow;
407*e4b17023SJohn Marino
408*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
409*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
410*e4b17023SJohn Marino  pow(float __x, float __y)
411*e4b17023SJohn Marino  { return __builtin_powf(__x, __y); }
412*e4b17023SJohn Marino
413*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
414*e4b17023SJohn Marino  pow(long double __x, long double __y)
415*e4b17023SJohn Marino  { return __builtin_powl(__x, __y); }
416*e4b17023SJohn Marino
417*e4b17023SJohn Marino#ifndef __GXX_EXPERIMENTAL_CXX0X__
418*e4b17023SJohn Marino  // _GLIBCXX_RESOLVE_LIB_DEFECTS
419*e4b17023SJohn Marino  // DR 550. What should the return type of pow(float,int) be?
420*e4b17023SJohn Marino  inline double
421*e4b17023SJohn Marino  pow(double __x, int __i)
422*e4b17023SJohn Marino  { return __builtin_powi(__x, __i); }
423*e4b17023SJohn Marino
424*e4b17023SJohn Marino  inline float
425*e4b17023SJohn Marino  pow(float __x, int __n)
426*e4b17023SJohn Marino  { return __builtin_powif(__x, __n); }
427*e4b17023SJohn Marino
428*e4b17023SJohn Marino  inline long double
429*e4b17023SJohn Marino  pow(long double __x, int __n)
430*e4b17023SJohn Marino  { return __builtin_powil(__x, __n); }
431*e4b17023SJohn Marino#endif
432*e4b17023SJohn Marino#endif
433*e4b17023SJohn Marino
434*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
435*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
436*e4b17023SJohn Marino    typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
437*e4b17023SJohn Marino    pow(_Tp __x, _Up __y)
438*e4b17023SJohn Marino    {
439*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
440*e4b17023SJohn Marino      return pow(__type(__x), __type(__y));
441*e4b17023SJohn Marino    }
442*e4b17023SJohn Marino
443*e4b17023SJohn Marino  using ::sin;
444*e4b17023SJohn Marino
445*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
446*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
447*e4b17023SJohn Marino  sin(float __x)
448*e4b17023SJohn Marino  { return __builtin_sinf(__x); }
449*e4b17023SJohn Marino
450*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
451*e4b17023SJohn Marino  sin(long double __x)
452*e4b17023SJohn Marino  { return __builtin_sinl(__x); }
453*e4b17023SJohn Marino#endif
454*e4b17023SJohn Marino
455*e4b17023SJohn Marino  template<typename _Tp>
456*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
457*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
458*e4b17023SJohn Marino                                    double>::__type
459*e4b17023SJohn Marino    sin(_Tp __x)
460*e4b17023SJohn Marino    { return __builtin_sin(__x); }
461*e4b17023SJohn Marino
462*e4b17023SJohn Marino  using ::sinh;
463*e4b17023SJohn Marino
464*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
465*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
466*e4b17023SJohn Marino  sinh(float __x)
467*e4b17023SJohn Marino  { return __builtin_sinhf(__x); }
468*e4b17023SJohn Marino
469*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
470*e4b17023SJohn Marino  sinh(long double __x)
471*e4b17023SJohn Marino  { return __builtin_sinhl(__x); }
472*e4b17023SJohn Marino#endif
473*e4b17023SJohn Marino
474*e4b17023SJohn Marino  template<typename _Tp>
475*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
476*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
477*e4b17023SJohn Marino                                    double>::__type
478*e4b17023SJohn Marino    sinh(_Tp __x)
479*e4b17023SJohn Marino    { return __builtin_sinh(__x); }
480*e4b17023SJohn Marino
481*e4b17023SJohn Marino  using ::sqrt;
482*e4b17023SJohn Marino
483*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
484*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
485*e4b17023SJohn Marino  sqrt(float __x)
486*e4b17023SJohn Marino  { return __builtin_sqrtf(__x); }
487*e4b17023SJohn Marino
488*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
489*e4b17023SJohn Marino  sqrt(long double __x)
490*e4b17023SJohn Marino  { return __builtin_sqrtl(__x); }
491*e4b17023SJohn Marino#endif
492*e4b17023SJohn Marino
493*e4b17023SJohn Marino  template<typename _Tp>
494*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
495*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
496*e4b17023SJohn Marino                                    double>::__type
497*e4b17023SJohn Marino    sqrt(_Tp __x)
498*e4b17023SJohn Marino    { return __builtin_sqrt(__x); }
499*e4b17023SJohn Marino
500*e4b17023SJohn Marino  using ::tan;
501*e4b17023SJohn Marino
502*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
503*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
504*e4b17023SJohn Marino  tan(float __x)
505*e4b17023SJohn Marino  { return __builtin_tanf(__x); }
506*e4b17023SJohn Marino
507*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
508*e4b17023SJohn Marino  tan(long double __x)
509*e4b17023SJohn Marino  { return __builtin_tanl(__x); }
510*e4b17023SJohn Marino#endif
511*e4b17023SJohn Marino
512*e4b17023SJohn Marino  template<typename _Tp>
513*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
514*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
515*e4b17023SJohn Marino                                    double>::__type
516*e4b17023SJohn Marino    tan(_Tp __x)
517*e4b17023SJohn Marino    { return __builtin_tan(__x); }
518*e4b17023SJohn Marino
519*e4b17023SJohn Marino  using ::tanh;
520*e4b17023SJohn Marino
521*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1
522*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR float
523*e4b17023SJohn Marino  tanh(float __x)
524*e4b17023SJohn Marino  { return __builtin_tanhf(__x); }
525*e4b17023SJohn Marino
526*e4b17023SJohn Marino  inline _GLIBCXX_CONSTEXPR long double
527*e4b17023SJohn Marino  tanh(long double __x)
528*e4b17023SJohn Marino  { return __builtin_tanhl(__x); }
529*e4b17023SJohn Marino#endif
530*e4b17023SJohn Marino
531*e4b17023SJohn Marino  template<typename _Tp>
532*e4b17023SJohn Marino    inline _GLIBCXX_CONSTEXPR
533*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
534*e4b17023SJohn Marino                                    double>::__type
535*e4b17023SJohn Marino    tanh(_Tp __x)
536*e4b17023SJohn Marino    { return __builtin_tanh(__x); }
537*e4b17023SJohn Marino
538*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION
539*e4b17023SJohn Marino} // namespace
540*e4b17023SJohn Marino
541*e4b17023SJohn Marino#if _GLIBCXX_USE_C99_MATH
542*e4b17023SJohn Marino#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
543*e4b17023SJohn Marino
544*e4b17023SJohn Marino// These are possible macros imported from C99-land.
545*e4b17023SJohn Marino#undef fpclassify
546*e4b17023SJohn Marino#undef isfinite
547*e4b17023SJohn Marino#undef isinf
548*e4b17023SJohn Marino#undef isnan
549*e4b17023SJohn Marino#undef isnormal
550*e4b17023SJohn Marino#undef signbit
551*e4b17023SJohn Marino#undef isgreater
552*e4b17023SJohn Marino#undef isgreaterequal
553*e4b17023SJohn Marino#undef isless
554*e4b17023SJohn Marino#undef islessequal
555*e4b17023SJohn Marino#undef islessgreater
556*e4b17023SJohn Marino#undef isunordered
557*e4b17023SJohn Marino
558*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default)
559*e4b17023SJohn Marino{
560*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION
561*e4b17023SJohn Marino
562*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
563*e4b17023SJohn Marino  constexpr int
564*e4b17023SJohn Marino  fpclassify(float __x)
565*e4b17023SJohn Marino  { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
566*e4b17023SJohn Marino				FP_SUBNORMAL, FP_ZERO, __x); }
567*e4b17023SJohn Marino
568*e4b17023SJohn Marino  constexpr int
569*e4b17023SJohn Marino  fpclassify(double __x)
570*e4b17023SJohn Marino  { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
571*e4b17023SJohn Marino				FP_SUBNORMAL, FP_ZERO, __x); }
572*e4b17023SJohn Marino
573*e4b17023SJohn Marino  constexpr int
574*e4b17023SJohn Marino  fpclassify(long double __x)
575*e4b17023SJohn Marino  { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
576*e4b17023SJohn Marino				FP_SUBNORMAL, FP_ZERO, __x); }
577*e4b17023SJohn Marino
578*e4b17023SJohn Marino  template<typename _Tp>
579*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
580*e4b17023SJohn Marino                                              int>::__type
581*e4b17023SJohn Marino    fpclassify(_Tp __x)
582*e4b17023SJohn Marino    { return __x != 0 ? FP_NORMAL : FP_ZERO; }
583*e4b17023SJohn Marino
584*e4b17023SJohn Marino  constexpr bool
585*e4b17023SJohn Marino  isfinite(float __x)
586*e4b17023SJohn Marino  { return __builtin_isfinite(__x); }
587*e4b17023SJohn Marino
588*e4b17023SJohn Marino  constexpr bool
589*e4b17023SJohn Marino  isfinite(double __x)
590*e4b17023SJohn Marino  { return __builtin_isfinite(__x); }
591*e4b17023SJohn Marino
592*e4b17023SJohn Marino  constexpr bool
593*e4b17023SJohn Marino  isfinite(long double __x)
594*e4b17023SJohn Marino  { return __builtin_isfinite(__x); }
595*e4b17023SJohn Marino
596*e4b17023SJohn Marino  template<typename _Tp>
597*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
598*e4b17023SJohn Marino                                              bool>::__type
599*e4b17023SJohn Marino    isfinite(_Tp __x)
600*e4b17023SJohn Marino    { return true; }
601*e4b17023SJohn Marino
602*e4b17023SJohn Marino  constexpr bool
603*e4b17023SJohn Marino  isinf(float __x)
604*e4b17023SJohn Marino  { return __builtin_isinf(__x); }
605*e4b17023SJohn Marino
606*e4b17023SJohn Marino  constexpr bool
607*e4b17023SJohn Marino  isinf(double __x)
608*e4b17023SJohn Marino  { return __builtin_isinf(__x); }
609*e4b17023SJohn Marino
610*e4b17023SJohn Marino  constexpr bool
611*e4b17023SJohn Marino  isinf(long double __x)
612*e4b17023SJohn Marino  { return __builtin_isinf(__x); }
613*e4b17023SJohn Marino
614*e4b17023SJohn Marino  template<typename _Tp>
615*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
616*e4b17023SJohn Marino                                              bool>::__type
617*e4b17023SJohn Marino    isinf(_Tp __x)
618*e4b17023SJohn Marino    { return false; }
619*e4b17023SJohn Marino
620*e4b17023SJohn Marino  constexpr bool
621*e4b17023SJohn Marino  isnan(float __x)
622*e4b17023SJohn Marino  { return __builtin_isnan(__x); }
623*e4b17023SJohn Marino
624*e4b17023SJohn Marino  constexpr bool
625*e4b17023SJohn Marino  isnan(double __x)
626*e4b17023SJohn Marino  { return __builtin_isnan(__x); }
627*e4b17023SJohn Marino
628*e4b17023SJohn Marino  constexpr bool
629*e4b17023SJohn Marino  isnan(long double __x)
630*e4b17023SJohn Marino  { return __builtin_isnan(__x); }
631*e4b17023SJohn Marino
632*e4b17023SJohn Marino  template<typename _Tp>
633*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
634*e4b17023SJohn Marino                                              bool>::__type
635*e4b17023SJohn Marino    isnan(_Tp __x)
636*e4b17023SJohn Marino    { return false; }
637*e4b17023SJohn Marino
638*e4b17023SJohn Marino  constexpr bool
639*e4b17023SJohn Marino  isnormal(float __x)
640*e4b17023SJohn Marino  { return __builtin_isnormal(__x); }
641*e4b17023SJohn Marino
642*e4b17023SJohn Marino  constexpr bool
643*e4b17023SJohn Marino  isnormal(double __x)
644*e4b17023SJohn Marino  { return __builtin_isnormal(__x); }
645*e4b17023SJohn Marino
646*e4b17023SJohn Marino  constexpr bool
647*e4b17023SJohn Marino  isnormal(long double __x)
648*e4b17023SJohn Marino  { return __builtin_isnormal(__x); }
649*e4b17023SJohn Marino
650*e4b17023SJohn Marino  template<typename _Tp>
651*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
652*e4b17023SJohn Marino                                              bool>::__type
653*e4b17023SJohn Marino    isnormal(_Tp __x)
654*e4b17023SJohn Marino    { return __x != 0 ? true : false; }
655*e4b17023SJohn Marino
656*e4b17023SJohn Marino  constexpr bool
657*e4b17023SJohn Marino  signbit(float __x)
658*e4b17023SJohn Marino  { return __builtin_signbit(__x); }
659*e4b17023SJohn Marino
660*e4b17023SJohn Marino  constexpr bool
661*e4b17023SJohn Marino  signbit(double __x)
662*e4b17023SJohn Marino  { return __builtin_signbit(__x); }
663*e4b17023SJohn Marino
664*e4b17023SJohn Marino  constexpr bool
665*e4b17023SJohn Marino  signbit(long double __x)
666*e4b17023SJohn Marino  { return __builtin_signbit(__x); }
667*e4b17023SJohn Marino
668*e4b17023SJohn Marino  template<typename _Tp>
669*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
670*e4b17023SJohn Marino                                              bool>::__type
671*e4b17023SJohn Marino    signbit(_Tp __x)
672*e4b17023SJohn Marino    { return __x < 0 ? true : false; }
673*e4b17023SJohn Marino
674*e4b17023SJohn Marino  constexpr bool
675*e4b17023SJohn Marino  isgreater(float __x, float __y)
676*e4b17023SJohn Marino  { return __builtin_isgreater(__x, __y); }
677*e4b17023SJohn Marino
678*e4b17023SJohn Marino  constexpr bool
679*e4b17023SJohn Marino  isgreater(double __x, double __y)
680*e4b17023SJohn Marino  { return __builtin_isgreater(__x, __y); }
681*e4b17023SJohn Marino
682*e4b17023SJohn Marino  constexpr bool
683*e4b17023SJohn Marino  isgreater(long double __x, long double __y)
684*e4b17023SJohn Marino  { return __builtin_isgreater(__x, __y); }
685*e4b17023SJohn Marino
686*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
687*e4b17023SJohn Marino    constexpr typename
688*e4b17023SJohn Marino    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
689*e4b17023SJohn Marino			    && __is_arithmetic<_Up>::__value), bool>::__type
690*e4b17023SJohn Marino    isgreater(_Tp __x, _Up __y)
691*e4b17023SJohn Marino    {
692*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
693*e4b17023SJohn Marino      return __builtin_isgreater(__type(__x), __type(__y));
694*e4b17023SJohn Marino    }
695*e4b17023SJohn Marino
696*e4b17023SJohn Marino  constexpr bool
697*e4b17023SJohn Marino  isgreaterequal(float __x, float __y)
698*e4b17023SJohn Marino  { return __builtin_isgreaterequal(__x, __y); }
699*e4b17023SJohn Marino
700*e4b17023SJohn Marino  constexpr bool
701*e4b17023SJohn Marino  isgreaterequal(double __x, double __y)
702*e4b17023SJohn Marino  { return __builtin_isgreaterequal(__x, __y); }
703*e4b17023SJohn Marino
704*e4b17023SJohn Marino  constexpr bool
705*e4b17023SJohn Marino  isgreaterequal(long double __x, long double __y)
706*e4b17023SJohn Marino  { return __builtin_isgreaterequal(__x, __y); }
707*e4b17023SJohn Marino
708*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
709*e4b17023SJohn Marino    constexpr typename
710*e4b17023SJohn Marino    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
711*e4b17023SJohn Marino			    && __is_arithmetic<_Up>::__value), bool>::__type
712*e4b17023SJohn Marino    isgreaterequal(_Tp __x, _Up __y)
713*e4b17023SJohn Marino    {
714*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
715*e4b17023SJohn Marino      return __builtin_isgreaterequal(__type(__x), __type(__y));
716*e4b17023SJohn Marino    }
717*e4b17023SJohn Marino
718*e4b17023SJohn Marino  constexpr bool
719*e4b17023SJohn Marino  isless(float __x, float __y)
720*e4b17023SJohn Marino  { return __builtin_isless(__x, __y); }
721*e4b17023SJohn Marino
722*e4b17023SJohn Marino  constexpr bool
723*e4b17023SJohn Marino  isless(double __x, double __y)
724*e4b17023SJohn Marino  { return __builtin_isless(__x, __y); }
725*e4b17023SJohn Marino
726*e4b17023SJohn Marino  constexpr bool
727*e4b17023SJohn Marino  isless(long double __x, long double __y)
728*e4b17023SJohn Marino  { return __builtin_isless(__x, __y); }
729*e4b17023SJohn Marino
730*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
731*e4b17023SJohn Marino    constexpr typename
732*e4b17023SJohn Marino    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
733*e4b17023SJohn Marino			    && __is_arithmetic<_Up>::__value), bool>::__type
734*e4b17023SJohn Marino    isless(_Tp __x, _Up __y)
735*e4b17023SJohn Marino    {
736*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
737*e4b17023SJohn Marino      return __builtin_isless(__type(__x), __type(__y));
738*e4b17023SJohn Marino    }
739*e4b17023SJohn Marino
740*e4b17023SJohn Marino  constexpr bool
741*e4b17023SJohn Marino  islessequal(float __x, float __y)
742*e4b17023SJohn Marino  { return __builtin_islessequal(__x, __y); }
743*e4b17023SJohn Marino
744*e4b17023SJohn Marino  constexpr bool
745*e4b17023SJohn Marino  islessequal(double __x, double __y)
746*e4b17023SJohn Marino  { return __builtin_islessequal(__x, __y); }
747*e4b17023SJohn Marino
748*e4b17023SJohn Marino  constexpr bool
749*e4b17023SJohn Marino  islessequal(long double __x, long double __y)
750*e4b17023SJohn Marino  { return __builtin_islessequal(__x, __y); }
751*e4b17023SJohn Marino
752*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
753*e4b17023SJohn Marino    constexpr typename
754*e4b17023SJohn Marino    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
755*e4b17023SJohn Marino			    && __is_arithmetic<_Up>::__value), bool>::__type
756*e4b17023SJohn Marino    islessequal(_Tp __x, _Up __y)
757*e4b17023SJohn Marino    {
758*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
759*e4b17023SJohn Marino      return __builtin_islessequal(__type(__x), __type(__y));
760*e4b17023SJohn Marino    }
761*e4b17023SJohn Marino
762*e4b17023SJohn Marino  constexpr bool
763*e4b17023SJohn Marino  islessgreater(float __x, float __y)
764*e4b17023SJohn Marino  { return __builtin_islessgreater(__x, __y); }
765*e4b17023SJohn Marino
766*e4b17023SJohn Marino  constexpr bool
767*e4b17023SJohn Marino  islessgreater(double __x, double __y)
768*e4b17023SJohn Marino  { return __builtin_islessgreater(__x, __y); }
769*e4b17023SJohn Marino
770*e4b17023SJohn Marino  constexpr bool
771*e4b17023SJohn Marino  islessgreater(long double __x, long double __y)
772*e4b17023SJohn Marino  { return __builtin_islessgreater(__x, __y); }
773*e4b17023SJohn Marino
774*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
775*e4b17023SJohn Marino    constexpr typename
776*e4b17023SJohn Marino    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
777*e4b17023SJohn Marino			    && __is_arithmetic<_Up>::__value), bool>::__type
778*e4b17023SJohn Marino    islessgreater(_Tp __x, _Up __y)
779*e4b17023SJohn Marino    {
780*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
781*e4b17023SJohn Marino      return __builtin_islessgreater(__type(__x), __type(__y));
782*e4b17023SJohn Marino    }
783*e4b17023SJohn Marino
784*e4b17023SJohn Marino  constexpr bool
785*e4b17023SJohn Marino  isunordered(float __x, float __y)
786*e4b17023SJohn Marino  { return __builtin_isunordered(__x, __y); }
787*e4b17023SJohn Marino
788*e4b17023SJohn Marino  constexpr bool
789*e4b17023SJohn Marino  isunordered(double __x, double __y)
790*e4b17023SJohn Marino  { return __builtin_isunordered(__x, __y); }
791*e4b17023SJohn Marino
792*e4b17023SJohn Marino  constexpr bool
793*e4b17023SJohn Marino  isunordered(long double __x, long double __y)
794*e4b17023SJohn Marino  { return __builtin_isunordered(__x, __y); }
795*e4b17023SJohn Marino
796*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
797*e4b17023SJohn Marino    constexpr typename
798*e4b17023SJohn Marino    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
799*e4b17023SJohn Marino			    && __is_arithmetic<_Up>::__value), bool>::__type
800*e4b17023SJohn Marino    isunordered(_Tp __x, _Up __y)
801*e4b17023SJohn Marino    {
802*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
803*e4b17023SJohn Marino      return __builtin_isunordered(__type(__x), __type(__y));
804*e4b17023SJohn Marino    }
805*e4b17023SJohn Marino
806*e4b17023SJohn Marino#else
807*e4b17023SJohn Marino
808*e4b17023SJohn Marino  template<typename _Tp>
809*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
810*e4b17023SJohn Marino					   int>::__type
811*e4b17023SJohn Marino    fpclassify(_Tp __f)
812*e4b17023SJohn Marino    {
813*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
814*e4b17023SJohn Marino      return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
815*e4b17023SJohn Marino				  FP_SUBNORMAL, FP_ZERO, __type(__f));
816*e4b17023SJohn Marino    }
817*e4b17023SJohn Marino
818*e4b17023SJohn Marino  template<typename _Tp>
819*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
820*e4b17023SJohn Marino					   int>::__type
821*e4b17023SJohn Marino    isfinite(_Tp __f)
822*e4b17023SJohn Marino    {
823*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
824*e4b17023SJohn Marino      return __builtin_isfinite(__type(__f));
825*e4b17023SJohn Marino    }
826*e4b17023SJohn Marino
827*e4b17023SJohn Marino  template<typename _Tp>
828*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
829*e4b17023SJohn Marino					   int>::__type
830*e4b17023SJohn Marino    isinf(_Tp __f)
831*e4b17023SJohn Marino    {
832*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
833*e4b17023SJohn Marino      return __builtin_isinf(__type(__f));
834*e4b17023SJohn Marino    }
835*e4b17023SJohn Marino
836*e4b17023SJohn Marino  template<typename _Tp>
837*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
838*e4b17023SJohn Marino					   int>::__type
839*e4b17023SJohn Marino    isnan(_Tp __f)
840*e4b17023SJohn Marino    {
841*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
842*e4b17023SJohn Marino      return __builtin_isnan(__type(__f));
843*e4b17023SJohn Marino    }
844*e4b17023SJohn Marino
845*e4b17023SJohn Marino  template<typename _Tp>
846*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
847*e4b17023SJohn Marino					   int>::__type
848*e4b17023SJohn Marino    isnormal(_Tp __f)
849*e4b17023SJohn Marino    {
850*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
851*e4b17023SJohn Marino      return __builtin_isnormal(__type(__f));
852*e4b17023SJohn Marino    }
853*e4b17023SJohn Marino
854*e4b17023SJohn Marino  template<typename _Tp>
855*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
856*e4b17023SJohn Marino					   int>::__type
857*e4b17023SJohn Marino    signbit(_Tp __f)
858*e4b17023SJohn Marino    {
859*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
860*e4b17023SJohn Marino      return __builtin_signbit(__type(__f));
861*e4b17023SJohn Marino    }
862*e4b17023SJohn Marino
863*e4b17023SJohn Marino  template<typename _Tp>
864*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
865*e4b17023SJohn Marino					   int>::__type
866*e4b17023SJohn Marino    isgreater(_Tp __f1, _Tp __f2)
867*e4b17023SJohn Marino    {
868*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
869*e4b17023SJohn Marino      return __builtin_isgreater(__type(__f1), __type(__f2));
870*e4b17023SJohn Marino    }
871*e4b17023SJohn Marino
872*e4b17023SJohn Marino  template<typename _Tp>
873*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
874*e4b17023SJohn Marino					   int>::__type
875*e4b17023SJohn Marino    isgreaterequal(_Tp __f1, _Tp __f2)
876*e4b17023SJohn Marino    {
877*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
878*e4b17023SJohn Marino      return __builtin_isgreaterequal(__type(__f1), __type(__f2));
879*e4b17023SJohn Marino    }
880*e4b17023SJohn Marino
881*e4b17023SJohn Marino  template<typename _Tp>
882*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
883*e4b17023SJohn Marino					   int>::__type
884*e4b17023SJohn Marino    isless(_Tp __f1, _Tp __f2)
885*e4b17023SJohn Marino    {
886*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
887*e4b17023SJohn Marino      return __builtin_isless(__type(__f1), __type(__f2));
888*e4b17023SJohn Marino    }
889*e4b17023SJohn Marino
890*e4b17023SJohn Marino  template<typename _Tp>
891*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
892*e4b17023SJohn Marino					   int>::__type
893*e4b17023SJohn Marino    islessequal(_Tp __f1, _Tp __f2)
894*e4b17023SJohn Marino    {
895*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
896*e4b17023SJohn Marino      return __builtin_islessequal(__type(__f1), __type(__f2));
897*e4b17023SJohn Marino    }
898*e4b17023SJohn Marino
899*e4b17023SJohn Marino  template<typename _Tp>
900*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
901*e4b17023SJohn Marino					   int>::__type
902*e4b17023SJohn Marino    islessgreater(_Tp __f1, _Tp __f2)
903*e4b17023SJohn Marino    {
904*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
905*e4b17023SJohn Marino      return __builtin_islessgreater(__type(__f1), __type(__f2));
906*e4b17023SJohn Marino    }
907*e4b17023SJohn Marino
908*e4b17023SJohn Marino  template<typename _Tp>
909*e4b17023SJohn Marino    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
910*e4b17023SJohn Marino					   int>::__type
911*e4b17023SJohn Marino    isunordered(_Tp __f1, _Tp __f2)
912*e4b17023SJohn Marino    {
913*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
914*e4b17023SJohn Marino      return __builtin_isunordered(__type(__f1), __type(__f2));
915*e4b17023SJohn Marino    }
916*e4b17023SJohn Marino
917*e4b17023SJohn Marino#endif
918*e4b17023SJohn Marino
919*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION
920*e4b17023SJohn Marino} // namespace
921*e4b17023SJohn Marino
922*e4b17023SJohn Marino#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
923*e4b17023SJohn Marino#endif
924*e4b17023SJohn Marino
925*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
926*e4b17023SJohn Marino
927*e4b17023SJohn Marino#ifdef _GLIBCXX_USE_C99_MATH_TR1
928*e4b17023SJohn Marino
929*e4b17023SJohn Marino#undef acosh
930*e4b17023SJohn Marino#undef acoshf
931*e4b17023SJohn Marino#undef acoshl
932*e4b17023SJohn Marino#undef asinh
933*e4b17023SJohn Marino#undef asinhf
934*e4b17023SJohn Marino#undef asinhl
935*e4b17023SJohn Marino#undef atanh
936*e4b17023SJohn Marino#undef atanhf
937*e4b17023SJohn Marino#undef atanhl
938*e4b17023SJohn Marino#undef cbrt
939*e4b17023SJohn Marino#undef cbrtf
940*e4b17023SJohn Marino#undef cbrtl
941*e4b17023SJohn Marino#undef copysign
942*e4b17023SJohn Marino#undef copysignf
943*e4b17023SJohn Marino#undef copysignl
944*e4b17023SJohn Marino#undef erf
945*e4b17023SJohn Marino#undef erff
946*e4b17023SJohn Marino#undef erfl
947*e4b17023SJohn Marino#undef erfc
948*e4b17023SJohn Marino#undef erfcf
949*e4b17023SJohn Marino#undef erfcl
950*e4b17023SJohn Marino#undef exp2
951*e4b17023SJohn Marino#undef exp2f
952*e4b17023SJohn Marino#undef exp2l
953*e4b17023SJohn Marino#undef expm1
954*e4b17023SJohn Marino#undef expm1f
955*e4b17023SJohn Marino#undef expm1l
956*e4b17023SJohn Marino#undef fdim
957*e4b17023SJohn Marino#undef fdimf
958*e4b17023SJohn Marino#undef fdiml
959*e4b17023SJohn Marino#undef fma
960*e4b17023SJohn Marino#undef fmaf
961*e4b17023SJohn Marino#undef fmal
962*e4b17023SJohn Marino#undef fmax
963*e4b17023SJohn Marino#undef fmaxf
964*e4b17023SJohn Marino#undef fmaxl
965*e4b17023SJohn Marino#undef fmin
966*e4b17023SJohn Marino#undef fminf
967*e4b17023SJohn Marino#undef fminl
968*e4b17023SJohn Marino#undef hypot
969*e4b17023SJohn Marino#undef hypotf
970*e4b17023SJohn Marino#undef hypotl
971*e4b17023SJohn Marino#undef ilogb
972*e4b17023SJohn Marino#undef ilogbf
973*e4b17023SJohn Marino#undef ilogbl
974*e4b17023SJohn Marino#undef lgamma
975*e4b17023SJohn Marino#undef lgammaf
976*e4b17023SJohn Marino#undef lgammal
977*e4b17023SJohn Marino#undef llrint
978*e4b17023SJohn Marino#undef llrintf
979*e4b17023SJohn Marino#undef llrintl
980*e4b17023SJohn Marino#undef llround
981*e4b17023SJohn Marino#undef llroundf
982*e4b17023SJohn Marino#undef llroundl
983*e4b17023SJohn Marino#undef log1p
984*e4b17023SJohn Marino#undef log1pf
985*e4b17023SJohn Marino#undef log1pl
986*e4b17023SJohn Marino#undef log2
987*e4b17023SJohn Marino#undef log2f
988*e4b17023SJohn Marino#undef log2l
989*e4b17023SJohn Marino#undef logb
990*e4b17023SJohn Marino#undef logbf
991*e4b17023SJohn Marino#undef logbl
992*e4b17023SJohn Marino#undef lrint
993*e4b17023SJohn Marino#undef lrintf
994*e4b17023SJohn Marino#undef lrintl
995*e4b17023SJohn Marino#undef lround
996*e4b17023SJohn Marino#undef lroundf
997*e4b17023SJohn Marino#undef lroundl
998*e4b17023SJohn Marino#undef nan
999*e4b17023SJohn Marino#undef nanf
1000*e4b17023SJohn Marino#undef nanl
1001*e4b17023SJohn Marino#undef nearbyint
1002*e4b17023SJohn Marino#undef nearbyintf
1003*e4b17023SJohn Marino#undef nearbyintl
1004*e4b17023SJohn Marino#undef nextafter
1005*e4b17023SJohn Marino#undef nextafterf
1006*e4b17023SJohn Marino#undef nextafterl
1007*e4b17023SJohn Marino#undef nexttoward
1008*e4b17023SJohn Marino#undef nexttowardf
1009*e4b17023SJohn Marino#undef nexttowardl
1010*e4b17023SJohn Marino#undef remainder
1011*e4b17023SJohn Marino#undef remainderf
1012*e4b17023SJohn Marino#undef remainderl
1013*e4b17023SJohn Marino#undef remquo
1014*e4b17023SJohn Marino#undef remquof
1015*e4b17023SJohn Marino#undef remquol
1016*e4b17023SJohn Marino#undef rint
1017*e4b17023SJohn Marino#undef rintf
1018*e4b17023SJohn Marino#undef rintl
1019*e4b17023SJohn Marino#undef round
1020*e4b17023SJohn Marino#undef roundf
1021*e4b17023SJohn Marino#undef roundl
1022*e4b17023SJohn Marino#undef scalbln
1023*e4b17023SJohn Marino#undef scalblnf
1024*e4b17023SJohn Marino#undef scalblnl
1025*e4b17023SJohn Marino#undef scalbn
1026*e4b17023SJohn Marino#undef scalbnf
1027*e4b17023SJohn Marino#undef scalbnl
1028*e4b17023SJohn Marino#undef tgamma
1029*e4b17023SJohn Marino#undef tgammaf
1030*e4b17023SJohn Marino#undef tgammal
1031*e4b17023SJohn Marino#undef trunc
1032*e4b17023SJohn Marino#undef truncf
1033*e4b17023SJohn Marino#undef truncl
1034*e4b17023SJohn Marino
1035*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default)
1036*e4b17023SJohn Marino{
1037*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION
1038*e4b17023SJohn Marino
1039*e4b17023SJohn Marino  // types
1040*e4b17023SJohn Marino  using ::double_t;
1041*e4b17023SJohn Marino  using ::float_t;
1042*e4b17023SJohn Marino
1043*e4b17023SJohn Marino  // functions
1044*e4b17023SJohn Marino  using ::acosh;
1045*e4b17023SJohn Marino  using ::acoshf;
1046*e4b17023SJohn Marino  using ::acoshl;
1047*e4b17023SJohn Marino
1048*e4b17023SJohn Marino  using ::asinh;
1049*e4b17023SJohn Marino  using ::asinhf;
1050*e4b17023SJohn Marino  using ::asinhl;
1051*e4b17023SJohn Marino
1052*e4b17023SJohn Marino  using ::atanh;
1053*e4b17023SJohn Marino  using ::atanhf;
1054*e4b17023SJohn Marino  using ::atanhl;
1055*e4b17023SJohn Marino
1056*e4b17023SJohn Marino  using ::cbrt;
1057*e4b17023SJohn Marino  using ::cbrtf;
1058*e4b17023SJohn Marino  using ::cbrtl;
1059*e4b17023SJohn Marino
1060*e4b17023SJohn Marino  using ::copysign;
1061*e4b17023SJohn Marino  using ::copysignf;
1062*e4b17023SJohn Marino  using ::copysignl;
1063*e4b17023SJohn Marino
1064*e4b17023SJohn Marino  using ::erf;
1065*e4b17023SJohn Marino  using ::erff;
1066*e4b17023SJohn Marino  using ::erfl;
1067*e4b17023SJohn Marino
1068*e4b17023SJohn Marino  using ::erfc;
1069*e4b17023SJohn Marino  using ::erfcf;
1070*e4b17023SJohn Marino  using ::erfcl;
1071*e4b17023SJohn Marino
1072*e4b17023SJohn Marino  using ::exp2;
1073*e4b17023SJohn Marino  using ::exp2f;
1074*e4b17023SJohn Marino  using ::exp2l;
1075*e4b17023SJohn Marino
1076*e4b17023SJohn Marino  using ::expm1;
1077*e4b17023SJohn Marino  using ::expm1f;
1078*e4b17023SJohn Marino  using ::expm1l;
1079*e4b17023SJohn Marino
1080*e4b17023SJohn Marino  using ::fdim;
1081*e4b17023SJohn Marino  using ::fdimf;
1082*e4b17023SJohn Marino  using ::fdiml;
1083*e4b17023SJohn Marino
1084*e4b17023SJohn Marino  using ::fma;
1085*e4b17023SJohn Marino  using ::fmaf;
1086*e4b17023SJohn Marino  using ::fmal;
1087*e4b17023SJohn Marino
1088*e4b17023SJohn Marino  using ::fmax;
1089*e4b17023SJohn Marino  using ::fmaxf;
1090*e4b17023SJohn Marino  using ::fmaxl;
1091*e4b17023SJohn Marino
1092*e4b17023SJohn Marino  using ::fmin;
1093*e4b17023SJohn Marino  using ::fminf;
1094*e4b17023SJohn Marino  using ::fminl;
1095*e4b17023SJohn Marino
1096*e4b17023SJohn Marino  using ::hypot;
1097*e4b17023SJohn Marino  using ::hypotf;
1098*e4b17023SJohn Marino  using ::hypotl;
1099*e4b17023SJohn Marino
1100*e4b17023SJohn Marino  using ::ilogb;
1101*e4b17023SJohn Marino  using ::ilogbf;
1102*e4b17023SJohn Marino  using ::ilogbl;
1103*e4b17023SJohn Marino
1104*e4b17023SJohn Marino  using ::lgamma;
1105*e4b17023SJohn Marino  using ::lgammaf;
1106*e4b17023SJohn Marino  using ::lgammal;
1107*e4b17023SJohn Marino
1108*e4b17023SJohn Marino  using ::llrint;
1109*e4b17023SJohn Marino  using ::llrintf;
1110*e4b17023SJohn Marino  using ::llrintl;
1111*e4b17023SJohn Marino
1112*e4b17023SJohn Marino  using ::llround;
1113*e4b17023SJohn Marino  using ::llroundf;
1114*e4b17023SJohn Marino  using ::llroundl;
1115*e4b17023SJohn Marino
1116*e4b17023SJohn Marino  using ::log1p;
1117*e4b17023SJohn Marino  using ::log1pf;
1118*e4b17023SJohn Marino  using ::log1pl;
1119*e4b17023SJohn Marino
1120*e4b17023SJohn Marino  using ::log2;
1121*e4b17023SJohn Marino  using ::log2f;
1122*e4b17023SJohn Marino  using ::log2l;
1123*e4b17023SJohn Marino
1124*e4b17023SJohn Marino  using ::logb;
1125*e4b17023SJohn Marino  using ::logbf;
1126*e4b17023SJohn Marino  using ::logbl;
1127*e4b17023SJohn Marino
1128*e4b17023SJohn Marino  using ::lrint;
1129*e4b17023SJohn Marino  using ::lrintf;
1130*e4b17023SJohn Marino  using ::lrintl;
1131*e4b17023SJohn Marino
1132*e4b17023SJohn Marino  using ::lround;
1133*e4b17023SJohn Marino  using ::lroundf;
1134*e4b17023SJohn Marino  using ::lroundl;
1135*e4b17023SJohn Marino
1136*e4b17023SJohn Marino  using ::nan;
1137*e4b17023SJohn Marino  using ::nanf;
1138*e4b17023SJohn Marino  using ::nanl;
1139*e4b17023SJohn Marino
1140*e4b17023SJohn Marino  using ::nearbyint;
1141*e4b17023SJohn Marino  using ::nearbyintf;
1142*e4b17023SJohn Marino  using ::nearbyintl;
1143*e4b17023SJohn Marino
1144*e4b17023SJohn Marino  using ::nextafter;
1145*e4b17023SJohn Marino  using ::nextafterf;
1146*e4b17023SJohn Marino  using ::nextafterl;
1147*e4b17023SJohn Marino
1148*e4b17023SJohn Marino  using ::nexttoward;
1149*e4b17023SJohn Marino  using ::nexttowardf;
1150*e4b17023SJohn Marino  using ::nexttowardl;
1151*e4b17023SJohn Marino
1152*e4b17023SJohn Marino  using ::remainder;
1153*e4b17023SJohn Marino  using ::remainderf;
1154*e4b17023SJohn Marino  using ::remainderl;
1155*e4b17023SJohn Marino
1156*e4b17023SJohn Marino  using ::remquo;
1157*e4b17023SJohn Marino  using ::remquof;
1158*e4b17023SJohn Marino  using ::remquol;
1159*e4b17023SJohn Marino
1160*e4b17023SJohn Marino  using ::rint;
1161*e4b17023SJohn Marino  using ::rintf;
1162*e4b17023SJohn Marino  using ::rintl;
1163*e4b17023SJohn Marino
1164*e4b17023SJohn Marino  using ::round;
1165*e4b17023SJohn Marino  using ::roundf;
1166*e4b17023SJohn Marino  using ::roundl;
1167*e4b17023SJohn Marino
1168*e4b17023SJohn Marino  using ::scalbln;
1169*e4b17023SJohn Marino  using ::scalblnf;
1170*e4b17023SJohn Marino  using ::scalblnl;
1171*e4b17023SJohn Marino
1172*e4b17023SJohn Marino  using ::scalbn;
1173*e4b17023SJohn Marino  using ::scalbnf;
1174*e4b17023SJohn Marino  using ::scalbnl;
1175*e4b17023SJohn Marino
1176*e4b17023SJohn Marino  using ::tgamma;
1177*e4b17023SJohn Marino  using ::tgammaf;
1178*e4b17023SJohn Marino  using ::tgammal;
1179*e4b17023SJohn Marino
1180*e4b17023SJohn Marino  using ::trunc;
1181*e4b17023SJohn Marino  using ::truncf;
1182*e4b17023SJohn Marino  using ::truncl;
1183*e4b17023SJohn Marino
1184*e4b17023SJohn Marino  /// Additional overloads.
1185*e4b17023SJohn Marino  constexpr float
1186*e4b17023SJohn Marino  acosh(float __x)
1187*e4b17023SJohn Marino  { return __builtin_acoshf(__x); }
1188*e4b17023SJohn Marino
1189*e4b17023SJohn Marino  constexpr long double
1190*e4b17023SJohn Marino  acosh(long double __x)
1191*e4b17023SJohn Marino  { return __builtin_acoshl(__x); }
1192*e4b17023SJohn Marino
1193*e4b17023SJohn Marino  template<typename _Tp>
1194*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1195*e4b17023SJohn Marino                                              double>::__type
1196*e4b17023SJohn Marino    acosh(_Tp __x)
1197*e4b17023SJohn Marino    { return __builtin_acosh(__x); }
1198*e4b17023SJohn Marino
1199*e4b17023SJohn Marino  constexpr float
1200*e4b17023SJohn Marino  asinh(float __x)
1201*e4b17023SJohn Marino  { return __builtin_asinhf(__x); }
1202*e4b17023SJohn Marino
1203*e4b17023SJohn Marino  constexpr long double
1204*e4b17023SJohn Marino  asinh(long double __x)
1205*e4b17023SJohn Marino  { return __builtin_asinhl(__x); }
1206*e4b17023SJohn Marino
1207*e4b17023SJohn Marino  template<typename _Tp>
1208*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1209*e4b17023SJohn Marino                                              double>::__type
1210*e4b17023SJohn Marino    asinh(_Tp __x)
1211*e4b17023SJohn Marino    { return __builtin_asinh(__x); }
1212*e4b17023SJohn Marino
1213*e4b17023SJohn Marino  constexpr float
1214*e4b17023SJohn Marino  atanh(float __x)
1215*e4b17023SJohn Marino  { return __builtin_atanhf(__x); }
1216*e4b17023SJohn Marino
1217*e4b17023SJohn Marino  constexpr long double
1218*e4b17023SJohn Marino  atanh(long double __x)
1219*e4b17023SJohn Marino  { return __builtin_atanhl(__x); }
1220*e4b17023SJohn Marino
1221*e4b17023SJohn Marino  template<typename _Tp>
1222*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1223*e4b17023SJohn Marino                                              double>::__type
1224*e4b17023SJohn Marino    atanh(_Tp __x)
1225*e4b17023SJohn Marino    { return __builtin_atanh(__x); }
1226*e4b17023SJohn Marino
1227*e4b17023SJohn Marino  constexpr float
1228*e4b17023SJohn Marino  cbrt(float __x)
1229*e4b17023SJohn Marino  { return __builtin_cbrtf(__x); }
1230*e4b17023SJohn Marino
1231*e4b17023SJohn Marino  constexpr long double
1232*e4b17023SJohn Marino  cbrt(long double __x)
1233*e4b17023SJohn Marino  { return __builtin_cbrtl(__x); }
1234*e4b17023SJohn Marino
1235*e4b17023SJohn Marino  template<typename _Tp>
1236*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1237*e4b17023SJohn Marino                                              double>::__type
1238*e4b17023SJohn Marino    cbrt(_Tp __x)
1239*e4b17023SJohn Marino    { return __builtin_cbrt(__x); }
1240*e4b17023SJohn Marino
1241*e4b17023SJohn Marino  constexpr float
1242*e4b17023SJohn Marino  copysign(float __x, float __y)
1243*e4b17023SJohn Marino  { return __builtin_copysignf(__x, __y); }
1244*e4b17023SJohn Marino
1245*e4b17023SJohn Marino  constexpr long double
1246*e4b17023SJohn Marino  copysign(long double __x, long double __y)
1247*e4b17023SJohn Marino  { return __builtin_copysignl(__x, __y); }
1248*e4b17023SJohn Marino
1249*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
1250*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1251*e4b17023SJohn Marino    copysign(_Tp __x, _Up __y)
1252*e4b17023SJohn Marino    {
1253*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1254*e4b17023SJohn Marino      return copysign(__type(__x), __type(__y));
1255*e4b17023SJohn Marino    }
1256*e4b17023SJohn Marino
1257*e4b17023SJohn Marino  constexpr float
1258*e4b17023SJohn Marino  erf(float __x)
1259*e4b17023SJohn Marino  { return __builtin_erff(__x); }
1260*e4b17023SJohn Marino
1261*e4b17023SJohn Marino  constexpr long double
1262*e4b17023SJohn Marino  erf(long double __x)
1263*e4b17023SJohn Marino  { return __builtin_erfl(__x); }
1264*e4b17023SJohn Marino
1265*e4b17023SJohn Marino  template<typename _Tp>
1266*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1267*e4b17023SJohn Marino                                              double>::__type
1268*e4b17023SJohn Marino    erf(_Tp __x)
1269*e4b17023SJohn Marino    { return __builtin_erf(__x); }
1270*e4b17023SJohn Marino
1271*e4b17023SJohn Marino  constexpr float
1272*e4b17023SJohn Marino  erfc(float __x)
1273*e4b17023SJohn Marino  { return __builtin_erfcf(__x); }
1274*e4b17023SJohn Marino
1275*e4b17023SJohn Marino  constexpr long double
1276*e4b17023SJohn Marino  erfc(long double __x)
1277*e4b17023SJohn Marino  { return __builtin_erfcl(__x); }
1278*e4b17023SJohn Marino
1279*e4b17023SJohn Marino  template<typename _Tp>
1280*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1281*e4b17023SJohn Marino                                              double>::__type
1282*e4b17023SJohn Marino    erfc(_Tp __x)
1283*e4b17023SJohn Marino    { return __builtin_erfc(__x); }
1284*e4b17023SJohn Marino
1285*e4b17023SJohn Marino  constexpr float
1286*e4b17023SJohn Marino  exp2(float __x)
1287*e4b17023SJohn Marino  { return __builtin_exp2f(__x); }
1288*e4b17023SJohn Marino
1289*e4b17023SJohn Marino  constexpr long double
1290*e4b17023SJohn Marino  exp2(long double __x)
1291*e4b17023SJohn Marino  { return __builtin_exp2l(__x); }
1292*e4b17023SJohn Marino
1293*e4b17023SJohn Marino  template<typename _Tp>
1294*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1295*e4b17023SJohn Marino                                              double>::__type
1296*e4b17023SJohn Marino    exp2(_Tp __x)
1297*e4b17023SJohn Marino    { return __builtin_exp2(__x); }
1298*e4b17023SJohn Marino
1299*e4b17023SJohn Marino  constexpr float
1300*e4b17023SJohn Marino  expm1(float __x)
1301*e4b17023SJohn Marino  { return __builtin_expm1f(__x); }
1302*e4b17023SJohn Marino
1303*e4b17023SJohn Marino  constexpr long double
1304*e4b17023SJohn Marino  expm1(long double __x)
1305*e4b17023SJohn Marino  { return __builtin_expm1l(__x); }
1306*e4b17023SJohn Marino
1307*e4b17023SJohn Marino  template<typename _Tp>
1308*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1309*e4b17023SJohn Marino                                              double>::__type
1310*e4b17023SJohn Marino    expm1(_Tp __x)
1311*e4b17023SJohn Marino    { return __builtin_expm1(__x); }
1312*e4b17023SJohn Marino
1313*e4b17023SJohn Marino  constexpr float
1314*e4b17023SJohn Marino  fdim(float __x, float __y)
1315*e4b17023SJohn Marino  { return __builtin_fdimf(__x, __y); }
1316*e4b17023SJohn Marino
1317*e4b17023SJohn Marino  constexpr long double
1318*e4b17023SJohn Marino  fdim(long double __x, long double __y)
1319*e4b17023SJohn Marino  { return __builtin_fdiml(__x, __y); }
1320*e4b17023SJohn Marino
1321*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
1322*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1323*e4b17023SJohn Marino    fdim(_Tp __x, _Up __y)
1324*e4b17023SJohn Marino    {
1325*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1326*e4b17023SJohn Marino      return fdim(__type(__x), __type(__y));
1327*e4b17023SJohn Marino    }
1328*e4b17023SJohn Marino
1329*e4b17023SJohn Marino  constexpr float
1330*e4b17023SJohn Marino  fma(float __x, float __y, float __z)
1331*e4b17023SJohn Marino  { return __builtin_fmaf(__x, __y, __z); }
1332*e4b17023SJohn Marino
1333*e4b17023SJohn Marino  constexpr long double
1334*e4b17023SJohn Marino  fma(long double __x, long double __y, long double __z)
1335*e4b17023SJohn Marino  { return __builtin_fmal(__x, __y, __z); }
1336*e4b17023SJohn Marino
1337*e4b17023SJohn Marino  template<typename _Tp, typename _Up, typename _Vp>
1338*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type
1339*e4b17023SJohn Marino    fma(_Tp __x, _Up __y, _Vp __z)
1340*e4b17023SJohn Marino    {
1341*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type;
1342*e4b17023SJohn Marino      return fma(__type(__x), __type(__y), __type(__z));
1343*e4b17023SJohn Marino    }
1344*e4b17023SJohn Marino
1345*e4b17023SJohn Marino  constexpr float
1346*e4b17023SJohn Marino  fmax(float __x, float __y)
1347*e4b17023SJohn Marino  { return __builtin_fmaxf(__x, __y); }
1348*e4b17023SJohn Marino
1349*e4b17023SJohn Marino  constexpr long double
1350*e4b17023SJohn Marino  fmax(long double __x, long double __y)
1351*e4b17023SJohn Marino  { return __builtin_fmaxl(__x, __y); }
1352*e4b17023SJohn Marino
1353*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
1354*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1355*e4b17023SJohn Marino    fmax(_Tp __x, _Up __y)
1356*e4b17023SJohn Marino    {
1357*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1358*e4b17023SJohn Marino      return fmax(__type(__x), __type(__y));
1359*e4b17023SJohn Marino    }
1360*e4b17023SJohn Marino
1361*e4b17023SJohn Marino  constexpr float
1362*e4b17023SJohn Marino  fmin(float __x, float __y)
1363*e4b17023SJohn Marino  { return __builtin_fminf(__x, __y); }
1364*e4b17023SJohn Marino
1365*e4b17023SJohn Marino  constexpr long double
1366*e4b17023SJohn Marino  fmin(long double __x, long double __y)
1367*e4b17023SJohn Marino  { return __builtin_fminl(__x, __y); }
1368*e4b17023SJohn Marino
1369*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
1370*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1371*e4b17023SJohn Marino    fmin(_Tp __x, _Up __y)
1372*e4b17023SJohn Marino    {
1373*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1374*e4b17023SJohn Marino      return fmin(__type(__x), __type(__y));
1375*e4b17023SJohn Marino    }
1376*e4b17023SJohn Marino
1377*e4b17023SJohn Marino  constexpr float
1378*e4b17023SJohn Marino  hypot(float __x, float __y)
1379*e4b17023SJohn Marino  { return __builtin_hypotf(__x, __y); }
1380*e4b17023SJohn Marino
1381*e4b17023SJohn Marino  constexpr long double
1382*e4b17023SJohn Marino  hypot(long double __x, long double __y)
1383*e4b17023SJohn Marino  { return __builtin_hypotl(__x, __y); }
1384*e4b17023SJohn Marino
1385*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
1386*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1387*e4b17023SJohn Marino    hypot(_Tp __x, _Up __y)
1388*e4b17023SJohn Marino    {
1389*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1390*e4b17023SJohn Marino      return hypot(__type(__x), __type(__y));
1391*e4b17023SJohn Marino    }
1392*e4b17023SJohn Marino
1393*e4b17023SJohn Marino  constexpr int
1394*e4b17023SJohn Marino  ilogb(float __x)
1395*e4b17023SJohn Marino  { return __builtin_ilogbf(__x); }
1396*e4b17023SJohn Marino
1397*e4b17023SJohn Marino  constexpr int
1398*e4b17023SJohn Marino  ilogb(long double __x)
1399*e4b17023SJohn Marino  { return __builtin_ilogbl(__x); }
1400*e4b17023SJohn Marino
1401*e4b17023SJohn Marino  template<typename _Tp>
1402*e4b17023SJohn Marino    constexpr
1403*e4b17023SJohn Marino    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1404*e4b17023SJohn Marino                                    int>::__type
1405*e4b17023SJohn Marino    ilogb(_Tp __x)
1406*e4b17023SJohn Marino    { return __builtin_ilogb(__x); }
1407*e4b17023SJohn Marino
1408*e4b17023SJohn Marino  constexpr float
1409*e4b17023SJohn Marino  lgamma(float __x)
1410*e4b17023SJohn Marino  { return __builtin_lgammaf(__x); }
1411*e4b17023SJohn Marino
1412*e4b17023SJohn Marino  constexpr long double
1413*e4b17023SJohn Marino  lgamma(long double __x)
1414*e4b17023SJohn Marino  { return __builtin_lgammal(__x); }
1415*e4b17023SJohn Marino
1416*e4b17023SJohn Marino  template<typename _Tp>
1417*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1418*e4b17023SJohn Marino                                              double>::__type
1419*e4b17023SJohn Marino    lgamma(_Tp __x)
1420*e4b17023SJohn Marino    { return __builtin_lgamma(__x); }
1421*e4b17023SJohn Marino
1422*e4b17023SJohn Marino  constexpr long long
1423*e4b17023SJohn Marino  llrint(float __x)
1424*e4b17023SJohn Marino  { return __builtin_llrintf(__x); }
1425*e4b17023SJohn Marino
1426*e4b17023SJohn Marino  constexpr long long
1427*e4b17023SJohn Marino  llrint(long double __x)
1428*e4b17023SJohn Marino  { return __builtin_llrintl(__x); }
1429*e4b17023SJohn Marino
1430*e4b17023SJohn Marino  template<typename _Tp>
1431*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1432*e4b17023SJohn Marino                                              long long>::__type
1433*e4b17023SJohn Marino    llrint(_Tp __x)
1434*e4b17023SJohn Marino    { return __builtin_llrint(__x); }
1435*e4b17023SJohn Marino
1436*e4b17023SJohn Marino  constexpr long long
1437*e4b17023SJohn Marino  llround(float __x)
1438*e4b17023SJohn Marino  { return __builtin_llroundf(__x); }
1439*e4b17023SJohn Marino
1440*e4b17023SJohn Marino  constexpr long long
1441*e4b17023SJohn Marino  llround(long double __x)
1442*e4b17023SJohn Marino  { return __builtin_llroundl(__x); }
1443*e4b17023SJohn Marino
1444*e4b17023SJohn Marino  template<typename _Tp>
1445*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1446*e4b17023SJohn Marino                                              long long>::__type
1447*e4b17023SJohn Marino    llround(_Tp __x)
1448*e4b17023SJohn Marino    { return __builtin_llround(__x); }
1449*e4b17023SJohn Marino
1450*e4b17023SJohn Marino  constexpr float
1451*e4b17023SJohn Marino  log1p(float __x)
1452*e4b17023SJohn Marino  { return __builtin_log1pf(__x); }
1453*e4b17023SJohn Marino
1454*e4b17023SJohn Marino  constexpr long double
1455*e4b17023SJohn Marino  log1p(long double __x)
1456*e4b17023SJohn Marino  { return __builtin_log1pl(__x); }
1457*e4b17023SJohn Marino
1458*e4b17023SJohn Marino  template<typename _Tp>
1459*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1460*e4b17023SJohn Marino                                              double>::__type
1461*e4b17023SJohn Marino    log1p(_Tp __x)
1462*e4b17023SJohn Marino    { return __builtin_log1p(__x); }
1463*e4b17023SJohn Marino
1464*e4b17023SJohn Marino  // DR 568.
1465*e4b17023SJohn Marino  constexpr float
1466*e4b17023SJohn Marino  log2(float __x)
1467*e4b17023SJohn Marino  { return __builtin_log2f(__x); }
1468*e4b17023SJohn Marino
1469*e4b17023SJohn Marino  constexpr long double
1470*e4b17023SJohn Marino  log2(long double __x)
1471*e4b17023SJohn Marino  { return __builtin_log2l(__x); }
1472*e4b17023SJohn Marino
1473*e4b17023SJohn Marino  template<typename _Tp>
1474*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1475*e4b17023SJohn Marino                                              double>::__type
1476*e4b17023SJohn Marino    log2(_Tp __x)
1477*e4b17023SJohn Marino    { return __builtin_log2(__x); }
1478*e4b17023SJohn Marino
1479*e4b17023SJohn Marino  constexpr float
1480*e4b17023SJohn Marino  logb(float __x)
1481*e4b17023SJohn Marino  { return __builtin_logbf(__x); }
1482*e4b17023SJohn Marino
1483*e4b17023SJohn Marino  constexpr long double
1484*e4b17023SJohn Marino  logb(long double __x)
1485*e4b17023SJohn Marino  { return __builtin_logbl(__x); }
1486*e4b17023SJohn Marino
1487*e4b17023SJohn Marino  template<typename _Tp>
1488*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1489*e4b17023SJohn Marino                                              double>::__type
1490*e4b17023SJohn Marino    logb(_Tp __x)
1491*e4b17023SJohn Marino    { return __builtin_logb(__x); }
1492*e4b17023SJohn Marino
1493*e4b17023SJohn Marino  constexpr long
1494*e4b17023SJohn Marino  lrint(float __x)
1495*e4b17023SJohn Marino  { return __builtin_lrintf(__x); }
1496*e4b17023SJohn Marino
1497*e4b17023SJohn Marino  constexpr long
1498*e4b17023SJohn Marino  lrint(long double __x)
1499*e4b17023SJohn Marino  { return __builtin_lrintl(__x); }
1500*e4b17023SJohn Marino
1501*e4b17023SJohn Marino  template<typename _Tp>
1502*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1503*e4b17023SJohn Marino                                              long>::__type
1504*e4b17023SJohn Marino    lrint(_Tp __x)
1505*e4b17023SJohn Marino    { return __builtin_lrint(__x); }
1506*e4b17023SJohn Marino
1507*e4b17023SJohn Marino  constexpr long
1508*e4b17023SJohn Marino  lround(float __x)
1509*e4b17023SJohn Marino  { return __builtin_lroundf(__x); }
1510*e4b17023SJohn Marino
1511*e4b17023SJohn Marino  constexpr long
1512*e4b17023SJohn Marino  lround(long double __x)
1513*e4b17023SJohn Marino  { return __builtin_lroundl(__x); }
1514*e4b17023SJohn Marino
1515*e4b17023SJohn Marino  template<typename _Tp>
1516*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1517*e4b17023SJohn Marino                                              long>::__type
1518*e4b17023SJohn Marino    lround(_Tp __x)
1519*e4b17023SJohn Marino    { return __builtin_lround(__x); }
1520*e4b17023SJohn Marino
1521*e4b17023SJohn Marino  constexpr float
1522*e4b17023SJohn Marino  nearbyint(float __x)
1523*e4b17023SJohn Marino  { return __builtin_nearbyintf(__x); }
1524*e4b17023SJohn Marino
1525*e4b17023SJohn Marino  constexpr long double
1526*e4b17023SJohn Marino  nearbyint(long double __x)
1527*e4b17023SJohn Marino  { return __builtin_nearbyintl(__x); }
1528*e4b17023SJohn Marino
1529*e4b17023SJohn Marino  template<typename _Tp>
1530*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1531*e4b17023SJohn Marino                                              double>::__type
1532*e4b17023SJohn Marino    nearbyint(_Tp __x)
1533*e4b17023SJohn Marino    { return __builtin_nearbyint(__x); }
1534*e4b17023SJohn Marino
1535*e4b17023SJohn Marino  constexpr float
1536*e4b17023SJohn Marino  nextafter(float __x, float __y)
1537*e4b17023SJohn Marino  { return __builtin_nextafterf(__x, __y); }
1538*e4b17023SJohn Marino
1539*e4b17023SJohn Marino  constexpr long double
1540*e4b17023SJohn Marino  nextafter(long double __x, long double __y)
1541*e4b17023SJohn Marino  { return __builtin_nextafterl(__x, __y); }
1542*e4b17023SJohn Marino
1543*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
1544*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1545*e4b17023SJohn Marino    nextafter(_Tp __x, _Up __y)
1546*e4b17023SJohn Marino    {
1547*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1548*e4b17023SJohn Marino      return nextafter(__type(__x), __type(__y));
1549*e4b17023SJohn Marino    }
1550*e4b17023SJohn Marino
1551*e4b17023SJohn Marino  constexpr float
1552*e4b17023SJohn Marino  nexttoward(float __x, long double __y)
1553*e4b17023SJohn Marino  { return __builtin_nexttowardf(__x, __y); }
1554*e4b17023SJohn Marino
1555*e4b17023SJohn Marino  constexpr long double
1556*e4b17023SJohn Marino  nexttoward(long double __x, long double __y)
1557*e4b17023SJohn Marino  { return __builtin_nexttowardl(__x, __y); }
1558*e4b17023SJohn Marino
1559*e4b17023SJohn Marino  template<typename _Tp>
1560*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1561*e4b17023SJohn Marino                                              double>::__type
1562*e4b17023SJohn Marino    nexttoward(_Tp __x, long double __y)
1563*e4b17023SJohn Marino    { return __builtin_nexttoward(__x, __y); }
1564*e4b17023SJohn Marino
1565*e4b17023SJohn Marino  constexpr float
1566*e4b17023SJohn Marino  remainder(float __x, float __y)
1567*e4b17023SJohn Marino  { return __builtin_remainderf(__x, __y); }
1568*e4b17023SJohn Marino
1569*e4b17023SJohn Marino  constexpr long double
1570*e4b17023SJohn Marino  remainder(long double __x, long double __y)
1571*e4b17023SJohn Marino  { return __builtin_remainderl(__x, __y); }
1572*e4b17023SJohn Marino
1573*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
1574*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1575*e4b17023SJohn Marino    remainder(_Tp __x, _Up __y)
1576*e4b17023SJohn Marino    {
1577*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1578*e4b17023SJohn Marino      return remainder(__type(__x), __type(__y));
1579*e4b17023SJohn Marino    }
1580*e4b17023SJohn Marino
1581*e4b17023SJohn Marino  inline float
1582*e4b17023SJohn Marino  remquo(float __x, float __y, int* __pquo)
1583*e4b17023SJohn Marino  { return __builtin_remquof(__x, __y, __pquo); }
1584*e4b17023SJohn Marino
1585*e4b17023SJohn Marino  inline long double
1586*e4b17023SJohn Marino  remquo(long double __x, long double __y, int* __pquo)
1587*e4b17023SJohn Marino  { return __builtin_remquol(__x, __y, __pquo); }
1588*e4b17023SJohn Marino
1589*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
1590*e4b17023SJohn Marino    inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1591*e4b17023SJohn Marino    remquo(_Tp __x, _Up __y, int* __pquo)
1592*e4b17023SJohn Marino    {
1593*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1594*e4b17023SJohn Marino      return remquo(__type(__x), __type(__y), __pquo);
1595*e4b17023SJohn Marino    }
1596*e4b17023SJohn Marino
1597*e4b17023SJohn Marino  constexpr float
1598*e4b17023SJohn Marino  rint(float __x)
1599*e4b17023SJohn Marino  { return __builtin_rintf(__x); }
1600*e4b17023SJohn Marino
1601*e4b17023SJohn Marino  constexpr long double
1602*e4b17023SJohn Marino  rint(long double __x)
1603*e4b17023SJohn Marino  { return __builtin_rintl(__x); }
1604*e4b17023SJohn Marino
1605*e4b17023SJohn Marino  template<typename _Tp>
1606*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1607*e4b17023SJohn Marino                                              double>::__type
1608*e4b17023SJohn Marino    rint(_Tp __x)
1609*e4b17023SJohn Marino    { return __builtin_rint(__x); }
1610*e4b17023SJohn Marino
1611*e4b17023SJohn Marino  constexpr float
1612*e4b17023SJohn Marino  round(float __x)
1613*e4b17023SJohn Marino  { return __builtin_roundf(__x); }
1614*e4b17023SJohn Marino
1615*e4b17023SJohn Marino  constexpr long double
1616*e4b17023SJohn Marino  round(long double __x)
1617*e4b17023SJohn Marino  { return __builtin_roundl(__x); }
1618*e4b17023SJohn Marino
1619*e4b17023SJohn Marino  template<typename _Tp>
1620*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1621*e4b17023SJohn Marino                                              double>::__type
1622*e4b17023SJohn Marino    round(_Tp __x)
1623*e4b17023SJohn Marino    { return __builtin_round(__x); }
1624*e4b17023SJohn Marino
1625*e4b17023SJohn Marino  constexpr float
1626*e4b17023SJohn Marino  scalbln(float __x, long __ex)
1627*e4b17023SJohn Marino  { return __builtin_scalblnf(__x, __ex); }
1628*e4b17023SJohn Marino
1629*e4b17023SJohn Marino  constexpr long double
1630*e4b17023SJohn Marino  scalbln(long double __x, long __ex)
1631*e4b17023SJohn Marino  { return __builtin_scalblnl(__x, __ex); }
1632*e4b17023SJohn Marino
1633*e4b17023SJohn Marino  template<typename _Tp>
1634*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1635*e4b17023SJohn Marino                                              double>::__type
1636*e4b17023SJohn Marino    scalbln(_Tp __x, long __ex)
1637*e4b17023SJohn Marino    { return __builtin_scalbln(__x, __ex); }
1638*e4b17023SJohn Marino
1639*e4b17023SJohn Marino  constexpr float
1640*e4b17023SJohn Marino  scalbn(float __x, int __ex)
1641*e4b17023SJohn Marino  { return __builtin_scalbnf(__x, __ex); }
1642*e4b17023SJohn Marino
1643*e4b17023SJohn Marino  constexpr long double
1644*e4b17023SJohn Marino  scalbn(long double __x, int __ex)
1645*e4b17023SJohn Marino  { return __builtin_scalbnl(__x, __ex); }
1646*e4b17023SJohn Marino
1647*e4b17023SJohn Marino  template<typename _Tp>
1648*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1649*e4b17023SJohn Marino                                              double>::__type
1650*e4b17023SJohn Marino    scalbn(_Tp __x, int __ex)
1651*e4b17023SJohn Marino    { return __builtin_scalbn(__x, __ex); }
1652*e4b17023SJohn Marino
1653*e4b17023SJohn Marino  constexpr float
1654*e4b17023SJohn Marino  tgamma(float __x)
1655*e4b17023SJohn Marino  { return __builtin_tgammaf(__x); }
1656*e4b17023SJohn Marino
1657*e4b17023SJohn Marino  constexpr long double
1658*e4b17023SJohn Marino  tgamma(long double __x)
1659*e4b17023SJohn Marino  { return __builtin_tgammal(__x); }
1660*e4b17023SJohn Marino
1661*e4b17023SJohn Marino  template<typename _Tp>
1662*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1663*e4b17023SJohn Marino                                              double>::__type
1664*e4b17023SJohn Marino    tgamma(_Tp __x)
1665*e4b17023SJohn Marino    { return __builtin_tgamma(__x); }
1666*e4b17023SJohn Marino
1667*e4b17023SJohn Marino  constexpr float
1668*e4b17023SJohn Marino  trunc(float __x)
1669*e4b17023SJohn Marino  { return __builtin_truncf(__x); }
1670*e4b17023SJohn Marino
1671*e4b17023SJohn Marino  constexpr long double
1672*e4b17023SJohn Marino  trunc(long double __x)
1673*e4b17023SJohn Marino  { return __builtin_truncl(__x); }
1674*e4b17023SJohn Marino
1675*e4b17023SJohn Marino  template<typename _Tp>
1676*e4b17023SJohn Marino    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1677*e4b17023SJohn Marino                                              double>::__type
1678*e4b17023SJohn Marino    trunc(_Tp __x)
1679*e4b17023SJohn Marino    { return __builtin_trunc(__x); }
1680*e4b17023SJohn Marino
1681*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION
1682*e4b17023SJohn Marino} // namespace
1683*e4b17023SJohn Marino
1684*e4b17023SJohn Marino#endif // _GLIBCXX_USE_C99_MATH_TR1
1685*e4b17023SJohn Marino
1686*e4b17023SJohn Marino#endif // __GXX_EXPERIMENTAL_CXX0X__
1687*e4b17023SJohn Marino
1688*e4b17023SJohn Marino#endif
1689