197403Sobrien// -*- C++ -*- C forwarding header.
297403Sobrien
3169691Skan// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
497403Sobrien// Free Software Foundation, Inc.
597403Sobrien//
697403Sobrien// This file is part of the GNU ISO C++ Library.  This library is free
797403Sobrien// software; you can redistribute it and/or modify it under the
897403Sobrien// terms of the GNU General Public License as published by the
997403Sobrien// Free Software Foundation; either version 2, or (at your option)
1097403Sobrien// any later version.
1197403Sobrien
1297403Sobrien// This library is distributed in the hope that it will be useful,
1397403Sobrien// but WITHOUT ANY WARRANTY; without even the implied warranty of
1497403Sobrien// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1597403Sobrien// GNU General Public License for more details.
1697403Sobrien
1797403Sobrien// You should have received a copy of the GNU General Public License along
1897403Sobrien// with this library; see the file COPYING.  If not, write to the Free
19169691Skan// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2097403Sobrien// USA.
2197403Sobrien
2297403Sobrien// As a special exception, you may use this file as part of a free software
2397403Sobrien// library without restriction.  Specifically, if other files instantiate
2497403Sobrien// templates or use macros or inline functions from this file, or you compile
2597403Sobrien// this file and link it with other files to produce an executable, this
2697403Sobrien// file does not by itself cause the resulting executable to be covered by
2797403Sobrien// the GNU General Public License.  This exception does not however
2897403Sobrien// invalidate any other reasons why the executable file might be covered by
2997403Sobrien// the GNU General Public License.
3097403Sobrien
31169691Skan/** @file include/cmath
3297403Sobrien *  This is a Standard C++ Library file.  You should @c #include this file
3397403Sobrien *  in your programs, rather than any of the "*.h" implementation files.
3497403Sobrien *
3597403Sobrien *  This is the C++ version of the Standard C Library header @c math.h,
3697403Sobrien *  and its contents are (mostly) the same as that header, but are all
37169691Skan *  contained in the namespace @c std (except for names which are defined
38169691Skan *  as macros in C).
3997403Sobrien */
4097403Sobrien
41169691Skan//
42169691Skan// ISO C++ 14882: 26.5  C library
43169691Skan//
44169691Skan
45132720Skan#ifndef _GLIBCXX_CMATH
46132720Skan#define _GLIBCXX_CMATH 1
4797403Sobrien
4897403Sobrien#pragma GCC system_header
4997403Sobrien
5097403Sobrien#include <bits/c++config.h>
51132720Skan#include <bits/cpp_type_traits.h>
52169691Skan#include <ext/type_traits.h>
5397403Sobrien
5497403Sobrien#include <math.h>
5597403Sobrien
5697403Sobrien// Get rid of those macros defined in <math.h> in lieu of real functions.
5797403Sobrien#undef abs
5897403Sobrien#undef div
5997403Sobrien#undef acos
6097403Sobrien#undef asin
6197403Sobrien#undef atan
6297403Sobrien#undef atan2
6397403Sobrien#undef ceil
6497403Sobrien#undef cos
6597403Sobrien#undef cosh
6697403Sobrien#undef exp
6797403Sobrien#undef fabs
6897403Sobrien#undef floor
6997403Sobrien#undef fmod
7097403Sobrien#undef frexp
7197403Sobrien#undef ldexp
7297403Sobrien#undef log
7397403Sobrien#undef log10
7497403Sobrien#undef modf
7597403Sobrien#undef pow
7697403Sobrien#undef sin
7797403Sobrien#undef sinh
7897403Sobrien#undef sqrt
7997403Sobrien#undef tan
8097403Sobrien#undef tanh
8197403Sobrien
82169691Skan_GLIBCXX_BEGIN_NAMESPACE(std)
83117397Skan
8497403Sobrien  // Forward declaration of a helper function.  This really should be
8597403Sobrien  // an `exported' forward declaration.
8697403Sobrien  template<typename _Tp> _Tp __cmath_power(_Tp, unsigned int);
8797403Sobrien
8897403Sobrien  inline double
8997403Sobrien  abs(double __x)
9097403Sobrien  { return __builtin_fabs(__x); }
9197403Sobrien
9297403Sobrien  inline float
9397403Sobrien  abs(float __x)
9497403Sobrien  { return __builtin_fabsf(__x); }
9597403Sobrien
9697403Sobrien  inline long double
9797403Sobrien  abs(long double __x)
9897403Sobrien  { return __builtin_fabsl(__x); }
9997403Sobrien
10097403Sobrien  using ::acos;
10197403Sobrien
102132720Skan  inline float
103132720Skan  acos(float __x)
104132720Skan  { return __builtin_acosf(__x); }
105132720Skan
106132720Skan  inline long double
107132720Skan  acos(long double __x)
108132720Skan  { return __builtin_acosl(__x); }
109132720Skan
110132720Skan  template<typename _Tp>
111169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
112169691Skan					   double>::__type
113132720Skan    acos(_Tp __x)
114169691Skan    { return __builtin_acos(__x); }
115132720Skan
11697403Sobrien  using ::asin;
11797403Sobrien
118132720Skan  inline float
119132720Skan  asin(float __x)
120132720Skan  { return __builtin_asinf(__x); }
12197403Sobrien
122132720Skan  inline long double
123132720Skan  asin(long double __x)
124132720Skan  { return __builtin_asinl(__x); }
12597403Sobrien
126132720Skan  template<typename _Tp>
127169691Skan  inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
128169691Skan					 double>::__type
129132720Skan    asin(_Tp __x)
130132720Skan    { return __builtin_asin(__x); }
131132720Skan
13297403Sobrien  using ::atan;
13397403Sobrien
134132720Skan  inline float
135132720Skan  atan(float __x)
136132720Skan  { return __builtin_atanf(__x); }
13797403Sobrien
138132720Skan  inline long double
139132720Skan  atan(long double __x)
140132720Skan  { return __builtin_atanl(__x); }
14197403Sobrien
142132720Skan  template<typename _Tp>
143169691Skan  inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
144169691Skan					 double>::__type
145132720Skan    atan(_Tp __x)
146132720Skan    { return __builtin_atan(__x); }
147132720Skan
14897403Sobrien  using ::atan2;
14997403Sobrien
150132720Skan  inline float
15197403Sobrien  atan2(float __y, float __x)
152132720Skan  { return __builtin_atan2f(__y, __x); }
15397403Sobrien
154132720Skan  inline long double
155132720Skan  atan2(long double __y, long double __x)
156132720Skan  { return __builtin_atan2l(__y, __x); }
15797403Sobrien
158132720Skan  template<typename _Tp, typename _Up>
159169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value
160169691Skan    					   && __is_integer<_Up>::__value,
161169691Skan					   double>::__type
162132720Skan    atan2(_Tp __y, _Up __x)
163132720Skan    { return __builtin_atan2(__y, __x); }
164132720Skan
16597403Sobrien  using ::ceil;
16697403Sobrien
167132720Skan  inline float
168132720Skan  ceil(float __x)
169132720Skan  { return __builtin_ceilf(__x); }
17097403Sobrien
171132720Skan  inline long double
172132720Skan  ceil(long double __x)
173132720Skan  { return __builtin_ceill(__x); }
17497403Sobrien
175132720Skan  template<typename _Tp>
176169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
177169691Skan					   double>::__type
178132720Skan    ceil(_Tp __x)
179132720Skan    { return __builtin_ceil(__x); }
180132720Skan
18197403Sobrien  using ::cos;
18297403Sobrien
18397403Sobrien  inline float
18497403Sobrien  cos(float __x)
18597403Sobrien  { return __builtin_cosf(__x); }
18697403Sobrien
18797403Sobrien  inline long double
18897403Sobrien  cos(long double __x)
18997403Sobrien  { return __builtin_cosl(__x); }
19097403Sobrien
191132720Skan  template<typename _Tp>
192169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
193169691Skan					   double>::__type
194132720Skan    cos(_Tp __x)
195132720Skan    { return __builtin_cos(__x); }
196132720Skan
19797403Sobrien  using ::cosh;
19897403Sobrien
199132720Skan  inline float
200132720Skan  cosh(float __x)
201132720Skan  { return __builtin_coshf(__x); }
20297403Sobrien
203132720Skan  inline long double
204132720Skan  cosh(long double __x)
205132720Skan  { return __builtin_coshl(__x); }
20697403Sobrien
207132720Skan  template<typename _Tp>
208169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
209169691Skan					   double>::__type
210132720Skan    cosh(_Tp __x)
211132720Skan    { return __builtin_cosh(__x); }
212132720Skan
21397403Sobrien  using ::exp;
21497403Sobrien
215132720Skan  inline float
216132720Skan  exp(float __x)
217132720Skan  { return __builtin_expf(__x); }
21897403Sobrien
219132720Skan  inline long double
220132720Skan  exp(long double __x)
221132720Skan  { return __builtin_expl(__x); }
22297403Sobrien
223132720Skan  template<typename _Tp>
224169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
225169691Skan					   double>::__type
226132720Skan    exp(_Tp __x)
227132720Skan    { return __builtin_exp(__x); }
228132720Skan
22997403Sobrien  using ::fabs;
23097403Sobrien
23197403Sobrien  inline float
23297403Sobrien  fabs(float __x)
23397403Sobrien  { return __builtin_fabsf(__x); }
23497403Sobrien
23597403Sobrien  inline long double
23697403Sobrien  fabs(long double __x)
23797403Sobrien  { return __builtin_fabsl(__x); }
23897403Sobrien
239132720Skan  template<typename _Tp>
240169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
241169691Skan					   double>::__type
242132720Skan    fabs(_Tp __x)
243132720Skan    { return __builtin_fabs(__x); }
244132720Skan
24597403Sobrien  using ::floor;
24697403Sobrien
247132720Skan  inline float
248132720Skan  floor(float __x)
249132720Skan  { return __builtin_floorf(__x); }
25097403Sobrien
251132720Skan  inline long double
252132720Skan  floor(long double __x)
253132720Skan  { return __builtin_floorl(__x); }
25497403Sobrien
255132720Skan  template<typename _Tp>
256169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
257169691Skan					   double>::__type
258132720Skan    floor(_Tp __x)
259132720Skan    { return __builtin_floor(__x); }
260132720Skan
26197403Sobrien  using ::fmod;
26297403Sobrien
263132720Skan  inline float
26497403Sobrien  fmod(float __x, float __y)
265132720Skan  { return __builtin_fmodf(__x, __y); }
26697403Sobrien
267132720Skan  inline long double
268132720Skan  fmod(long double __x, long double __y)
269132720Skan  { return __builtin_fmodl(__x, __y); }
27097403Sobrien
27197403Sobrien  using ::frexp;
27297403Sobrien
273132720Skan  inline float
274132720Skan  frexp(float __x, int* __exp)
275132720Skan  { return __builtin_frexpf(__x, __exp); }
27697403Sobrien
277132720Skan  inline long double
278132720Skan  frexp(long double __x, int* __exp)
279132720Skan  { return __builtin_frexpl(__x, __exp); }
28097403Sobrien
281132720Skan  template<typename _Tp>
282169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
283169691Skan					   double>::__type
284132720Skan    frexp(_Tp __x, int* __exp)
285132720Skan    { return __builtin_frexp(__x, __exp); }
286132720Skan
28797403Sobrien  using ::ldexp;
28897403Sobrien
289132720Skan  inline float
29097403Sobrien  ldexp(float __x, int __exp)
291132720Skan  { return __builtin_ldexpf(__x, __exp); }
29297403Sobrien
293132720Skan  inline long double
294132720Skan  ldexp(long double __x, int __exp)
295132720Skan  { return __builtin_ldexpl(__x, __exp); }
29697403Sobrien
297132720Skan  template<typename _Tp>
298169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
299169691Skan					   double>::__type
300132720Skan  ldexp(_Tp __x, int __exp)
301132720Skan  { return __builtin_ldexp(__x, __exp); }
302132720Skan
30397403Sobrien  using ::log;
30497403Sobrien
305132720Skan  inline float
306132720Skan  log(float __x)
307132720Skan  { return __builtin_logf(__x); }
30897403Sobrien
309132720Skan  inline long double
310132720Skan  log(long double __x)
311132720Skan  { return __builtin_logl(__x); }
31297403Sobrien
313132720Skan  template<typename _Tp>
314169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
315169691Skan					   double>::__type
316132720Skan    log(_Tp __x)
317132720Skan    { return __builtin_log(__x); }
318132720Skan
31997403Sobrien  using ::log10;
32097403Sobrien
321132720Skan  inline float
322132720Skan  log10(float __x)
323132720Skan  { return __builtin_log10f(__x); }
32497403Sobrien
325132720Skan  inline long double
326132720Skan  log10(long double __x)
327132720Skan  { return __builtin_log10l(__x); }
32897403Sobrien
329132720Skan  template<typename _Tp>
330169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
331169691Skan					   double>::__type
332132720Skan    log10(_Tp __x)
333132720Skan    { return __builtin_log10(__x); }
334132720Skan
33597403Sobrien  using ::modf;
33697403Sobrien
337132720Skan  inline float
33897403Sobrien  modf(float __x, float* __iptr)
339132720Skan  { return __builtin_modff(__x, __iptr); }
34097403Sobrien
341132720Skan  inline long double
342132720Skan  modf(long double __x, long double* __iptr)
343132720Skan  { return __builtin_modfl(__x, __iptr); }
34497403Sobrien
34597403Sobrien  template<typename _Tp>
34697403Sobrien    inline _Tp
34797403Sobrien    __pow_helper(_Tp __x, int __n)
34897403Sobrien    {
34997403Sobrien      return __n < 0
35097403Sobrien        ? _Tp(1)/__cmath_power(__x, -__n)
35197403Sobrien        : __cmath_power(__x, __n);
35297403Sobrien    }
35397403Sobrien
35497403Sobrien  using ::pow;
35597403Sobrien
356132720Skan  inline float
35797403Sobrien  pow(float __x, float __y)
358132720Skan  { return __builtin_powf(__x, __y); }
35997403Sobrien
360132720Skan  inline long double
361132720Skan  pow(long double __x, long double __y)
362132720Skan  { return __builtin_powl(__x, __y); }
36397403Sobrien
364132720Skan  inline double
36597403Sobrien  pow(double __x, int __i)
366169691Skan  { return __builtin_powi(__x, __i); }
36797403Sobrien
368132720Skan  inline float
36997403Sobrien  pow(float __x, int __n)
370169691Skan  { return __builtin_powif(__x, __n); }
37197403Sobrien
372132720Skan  inline long double
37397403Sobrien  pow(long double __x, int __n)
374169691Skan  { return __builtin_powil(__x, __n); }
37597403Sobrien
37697403Sobrien  using ::sin;
37797403Sobrien
37897403Sobrien  inline float
37997403Sobrien  sin(float __x)
38097403Sobrien  { return __builtin_sinf(__x); }
38197403Sobrien
38297403Sobrien  inline long double
38397403Sobrien  sin(long double __x)
38497403Sobrien  { return __builtin_sinl(__x); }
38597403Sobrien
386132720Skan  template<typename _Tp>
387169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
388169691Skan					   double>::__type
389132720Skan    sin(_Tp __x)
390132720Skan    { return __builtin_sin(__x); }
391132720Skan
39297403Sobrien  using ::sinh;
39397403Sobrien
394132720Skan  inline float
395132720Skan  sinh(float __x)
396132720Skan  { return __builtin_sinhf(__x); }
39797403Sobrien
398132720Skan  inline long double
399132720Skan  sinh(long double __x)
400132720Skan  { return __builtin_sinhl(__x); }
40197403Sobrien
402132720Skan  template<typename _Tp>
403169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
404169691Skan					   double>::__type
405132720Skan    sinh(_Tp __x)
406132720Skan    { return __builtin_sinh(__x); }
407132720Skan
40897403Sobrien  using ::sqrt;
40997403Sobrien
41097403Sobrien  inline float
41197403Sobrien  sqrt(float __x)
41297403Sobrien  { return __builtin_sqrtf(__x); }
41397403Sobrien
41497403Sobrien  inline long double
41597403Sobrien  sqrt(long double __x)
41697403Sobrien  { return __builtin_sqrtl(__x); }
41797403Sobrien
418132720Skan  template<typename _Tp>
419169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
420169691Skan					   double>::__type
421132720Skan    sqrt(_Tp __x)
422132720Skan    { return __builtin_sqrt(__x); }
423132720Skan
42497403Sobrien  using ::tan;
42597403Sobrien
426132720Skan  inline float
427132720Skan  tan(float __x)
428132720Skan  { return __builtin_tanf(__x); }
42997403Sobrien
430132720Skan  inline long double
431132720Skan  tan(long double __x)
432132720Skan  { return __builtin_tanl(__x); }
43397403Sobrien
434132720Skan  template<typename _Tp>
435169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
436169691Skan					   double>::__type
437132720Skan    tan(_Tp __x)
438132720Skan    { return __builtin_tan(__x); }
439132720Skan
44097403Sobrien  using ::tanh;
44197403Sobrien
442132720Skan  inline float
443132720Skan  tanh(float __x)
444132720Skan  { return __builtin_tanhf(__x); }
44597403Sobrien
446132720Skan  inline long double
447132720Skan  tanh(long double __x)
448132720Skan  { return __builtin_tanhl(__x); }
44997403Sobrien
450132720Skan  template<typename _Tp>
451169691Skan    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
452169691Skan					   double>::__type
453132720Skan    tanh(_Tp __x)
454132720Skan    { return __builtin_tanh(__x); }
45597403Sobrien
456169691Skan_GLIBCXX_END_NAMESPACE
457169691Skan
458132720Skan#if _GLIBCXX_USE_C99_MATH
459132720Skan#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
46097403Sobrien// These are possible macros imported from C99-land. For strict
46197403Sobrien// conformance, remove possible C99-injected names from the global
462132720Skan// namespace, and sequester them in the __gnu_cxx extension namespace.
463169691Skan
464169691Skan_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
465169691Skan
46697403Sobrien  template<typename _Tp>
467161653Skan    inline int
46897403Sobrien    __capture_fpclassify(_Tp __f) { return fpclassify(__f); }
46997403Sobrien
47097403Sobrien  template<typename _Tp>
471161653Skan    inline int
47297403Sobrien    __capture_isfinite(_Tp __f) { return isfinite(__f); }
47397403Sobrien
47497403Sobrien  template<typename _Tp>
475161653Skan    inline int
47697403Sobrien    __capture_isinf(_Tp __f) { return isinf(__f); }
47797403Sobrien
47897403Sobrien  template<typename _Tp>
479161653Skan    inline int
48097403Sobrien    __capture_isnan(_Tp __f) { return isnan(__f); }
48197403Sobrien
48297403Sobrien  template<typename _Tp>
483161653Skan    inline int
48497403Sobrien    __capture_isnormal(_Tp __f) { return isnormal(__f); }
48597403Sobrien
48697403Sobrien  template<typename _Tp>
487161653Skan    inline int
48897403Sobrien    __capture_signbit(_Tp __f) { return signbit(__f); }
48997403Sobrien
49097403Sobrien  template<typename _Tp>
491161653Skan    inline int
49297403Sobrien    __capture_isgreater(_Tp __f1, _Tp __f2)
49397403Sobrien    { return isgreater(__f1, __f2); }
49497403Sobrien
49597403Sobrien  template<typename _Tp>
496161653Skan    inline int
497161653Skan    __capture_isgreaterequal(_Tp __f1, _Tp __f2)
498161653Skan    { return isgreaterequal(__f1, __f2); }
49997403Sobrien
50097403Sobrien  template<typename _Tp>
501161653Skan    inline int
502161653Skan    __capture_isless(_Tp __f1, _Tp __f2) { return isless(__f1, __f2); }
50397403Sobrien
50497403Sobrien  template<typename _Tp>
505161653Skan    inline int
506161653Skan    __capture_islessequal(_Tp __f1, _Tp __f2)
507161653Skan    { return islessequal(__f1, __f2); }
50897403Sobrien
50997403Sobrien  template<typename _Tp>
510161653Skan    inline int
511161653Skan    __capture_islessgreater(_Tp __f1, _Tp __f2)
512161653Skan    { return islessgreater(__f1, __f2); }
51397403Sobrien
51497403Sobrien  template<typename _Tp>
515161653Skan    inline int
516161653Skan    __capture_isunordered(_Tp __f1, _Tp __f2)
517161653Skan    { return isunordered(__f1, __f2); }
51897403Sobrien
519169691Skan_GLIBCXX_END_NAMESPACE
520169691Skan
521132720Skan// Only undefine the C99 FP macros, if actually captured for namespace movement
52297403Sobrien#undef fpclassify
52397403Sobrien#undef isfinite
52497403Sobrien#undef isinf
52597403Sobrien#undef isnan
52697403Sobrien#undef isnormal
52797403Sobrien#undef signbit
52897403Sobrien#undef isgreater
52997403Sobrien#undef isgreaterequal
53097403Sobrien#undef isless
53197403Sobrien#undef islessequal
53297403Sobrien#undef islessgreater
53397403Sobrien#undef isunordered
53497403Sobrien
535169691Skan_GLIBCXX_BEGIN_NAMESPACE(std)
536169691Skan
53797403Sobrien  template<typename _Tp>
538161653Skan    inline int
539169691Skan    fpclassify(_Tp __f) { return ::__gnu_cxx::__capture_fpclassify(__f); }
54097403Sobrien
54197403Sobrien  template<typename _Tp>
542161653Skan    inline int
543169691Skan    isfinite(_Tp __f) { return ::__gnu_cxx::__capture_isfinite(__f); }
54497403Sobrien
54597403Sobrien  template<typename _Tp>
546161653Skan    inline int
547169691Skan    isinf(_Tp __f) { return ::__gnu_cxx::__capture_isinf(__f); }
54897403Sobrien
54997403Sobrien  template<typename _Tp>
550161653Skan    inline int
551169691Skan    isnan(_Tp __f) { return ::__gnu_cxx::__capture_isnan(__f); }
55297403Sobrien
55397403Sobrien  template<typename _Tp>
554161653Skan    inline int
555169691Skan    isnormal(_Tp __f) { return ::__gnu_cxx::__capture_isnormal(__f); }
55697403Sobrien
55797403Sobrien  template<typename _Tp>
558161653Skan    inline int
559169691Skan    signbit(_Tp __f) { return ::__gnu_cxx::__capture_signbit(__f); }
56097403Sobrien
56197403Sobrien  template<typename _Tp>
562161653Skan    inline int
563169691Skan    isgreater(_Tp __f1, _Tp __f2)
564169691Skan    { return ::__gnu_cxx::__capture_isgreater(__f1, __f2); }
56597403Sobrien
56697403Sobrien  template<typename _Tp>
567161653Skan    inline int
568132720Skan    isgreaterequal(_Tp __f1, _Tp __f2)
569169691Skan    { return ::__gnu_cxx::__capture_isgreaterequal(__f1, __f2); }
57097403Sobrien
57197403Sobrien  template<typename _Tp>
572161653Skan    inline int
573169691Skan    isless(_Tp __f1, _Tp __f2)
574169691Skan    { return ::__gnu_cxx::__capture_isless(__f1, __f2); }
57597403Sobrien
57697403Sobrien  template<typename _Tp>
577161653Skan    inline int
578132720Skan    islessequal(_Tp __f1, _Tp __f2)
579169691Skan    { return ::__gnu_cxx::__capture_islessequal(__f1, __f2); }
58097403Sobrien
58197403Sobrien  template<typename _Tp>
582161653Skan    inline int
583132720Skan    islessgreater(_Tp __f1, _Tp __f2)
584169691Skan    { return ::__gnu_cxx::__capture_islessgreater(__f1, __f2); }
58597403Sobrien
58697403Sobrien  template<typename _Tp>
587161653Skan    inline int
588132720Skan    isunordered(_Tp __f1, _Tp __f2)
589169691Skan    { return ::__gnu_cxx::__capture_isunordered(__f1, __f2); }
59097403Sobrien
591169691Skan_GLIBCXX_END_NAMESPACE
592253563Stheravenusing std::isnan;
593253563Stheravenusing std::isinf;
594169691Skan
595132720Skan#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
59697403Sobrien#endif
597132720Skan
598132720Skan#ifndef _GLIBCXX_EXPORT_TEMPLATE
599132720Skan# include <bits/cmath.tcc>
60097403Sobrien#endif
60197403Sobrien
60297403Sobrien#endif
603