std_cmath.h revision 169691
1288943Sdim// -*- C++ -*- C forwarding header.
2249259Sdim
3353358Sdim// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
4353358Sdim// Free Software Foundation, Inc.
5353358Sdim//
6249259Sdim// This file is part of the GNU ISO C++ Library.  This library is free
7249259Sdim// software; you can redistribute it and/or modify it under the
8249259Sdim// terms of the GNU General Public License as published by the
9249259Sdim// Free Software Foundation; either version 2, or (at your option)
10249259Sdim// any later version.
11249259Sdim
12249259Sdim// This library is distributed in the hope that it will be useful,
13249259Sdim// but WITHOUT ANY WARRANTY; without even the implied warranty of
14249259Sdim// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15249259Sdim// GNU General Public License for more details.
16249259Sdim
17249259Sdim// You should have received a copy of the GNU General Public License along
18249259Sdim// with this library; see the file COPYING.  If not, write to the Free
19280031Sdim// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20314564Sdim// USA.
21314564Sdim
22296417Sdim// As a special exception, you may use this file as part of a free software
23321369Sdim// library without restriction.  Specifically, if other files instantiate
24314564Sdim// templates or use macros or inline functions from this file, or you compile
25360784Sdim// this file and link it with other files to produce an executable, this
26314564Sdim// file does not by itself cause the resulting executable to be covered by
27321369Sdim// the GNU General Public License.  This exception does not however
28321369Sdim// invalidate any other reasons why the executable file might be covered by
29280031Sdim// the GNU General Public License.
30296417Sdim
31249259Sdim/** @file include/cmath
32321369Sdim *  This is a Standard C++ Library file.  You should @c #include this file
33314564Sdim *  in your programs, rather than any of the "*.h" implementation files.
34280031Sdim *
35314564Sdim *  This is the C++ version of the Standard C Library header @c math.h,
36314564Sdim *  and its contents are (mostly) the same as that header, but are all
37314564Sdim *  contained in the namespace @c std (except for names which are defined
38314564Sdim *  as macros in C).
39314564Sdim */
40314564Sdim
41280031Sdim//
42314564Sdim// ISO C++ 14882: 26.5  C library
43249259Sdim//
44249259Sdim
45288943Sdim#ifndef _GLIBCXX_CMATH
46249259Sdim#define _GLIBCXX_CMATH 1
47288943Sdim
48321369Sdim#pragma GCC system_header
49321369Sdim
50288943Sdim#include <bits/c++config.h>
51276479Sdim#include <bits/cpp_type_traits.h>
52288943Sdim#include <ext/type_traits.h>
53261991Sdim
54261991Sdim#include <math.h>
55341825Sdim
56280031Sdim// Get rid of those macros defined in <math.h> in lieu of real functions.
57280031Sdim#undef abs
58280031Sdim#undef div
59280031Sdim#undef acos
60280031Sdim#undef asin
61341825Sdim#undef atan
62280031Sdim#undef atan2
63280031Sdim#undef ceil
64280031Sdim#undef cos
65341825Sdim#undef cosh
66288943Sdim#undef exp
67288943Sdim#undef fabs
68341825Sdim#undef floor
69344779Sdim#undef fmod
70280031Sdim#undef frexp
71280031Sdim#undef ldexp
72344779Sdim#undef log
73344779Sdim#undef log10
74321369Sdim#undef modf
75321369Sdim#undef pow
76280031Sdim#undef sin
77280031Sdim#undef sinh
78280031Sdim#undef sqrt
79309124Sdim#undef tan
80309124Sdim#undef tanh
81280031Sdim
82280031Sdim_GLIBCXX_BEGIN_NAMESPACE(std)
83280031Sdim
84288943Sdim  // Forward declaration of a helper function.  This really should be
85344779Sdim  // an `exported' forward declaration.
86321369Sdim  template<typename _Tp> _Tp __cmath_power(_Tp, unsigned int);
87288943Sdim
88314564Sdim  inline double
89288943Sdim  abs(double __x)
90280031Sdim  { return __builtin_fabs(__x); }
91341825Sdim
92280031Sdim  inline float
93280031Sdim  abs(float __x)
94280031Sdim  { return __builtin_fabsf(__x); }
95280031Sdim
96280031Sdim  inline long double
97280031Sdim  abs(long double __x)
98280031Sdim  { return __builtin_fabsl(__x); }
99280031Sdim
100280031Sdim  using ::acos;
101280031Sdim
102341825Sdim  inline float
103288943Sdim  acos(float __x)
104288943Sdim  { return __builtin_acosf(__x); }
105288943Sdim
106288943Sdim  inline long double
107288943Sdim  acos(long double __x)
108288943Sdim  { return __builtin_acosl(__x); }
109288943Sdim
110288943Sdim  template<typename _Tp>
111280031Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
112288943Sdim					   double>::__type
113288943Sdim    acos(_Tp __x)
114288943Sdim    { return __builtin_acos(__x); }
115341825Sdim
116288943Sdim  using ::asin;
117288943Sdim
118288943Sdim  inline float
119288943Sdim  asin(float __x)
120288943Sdim  { return __builtin_asinf(__x); }
121288943Sdim
122296417Sdim  inline long double
123296417Sdim  asin(long double __x)
124296417Sdim  { return __builtin_asinl(__x); }
125296417Sdim
126288943Sdim  template<typename _Tp>
127288943Sdim  inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
128341825Sdim					 double>::__type
129288943Sdim    asin(_Tp __x)
130288943Sdim    { return __builtin_asin(__x); }
131288943Sdim
132288943Sdim  using ::atan;
133288943Sdim
134288943Sdim  inline float
135288943Sdim  atan(float __x)
136288943Sdim  { return __builtin_atanf(__x); }
137280031Sdim
138288943Sdim  inline long double
139280031Sdim  atan(long double __x)
140280031Sdim  { return __builtin_atanl(__x); }
141321369Sdim
142321369Sdim  template<typename _Tp>
143321369Sdim  inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
144321369Sdim					 double>::__type
145321369Sdim    atan(_Tp __x)
146321369Sdim    { return __builtin_atan(__x); }
147321369Sdim
148321369Sdim  using ::atan2;
149280031Sdim
150280031Sdim  inline float
151280031Sdim  atan2(float __y, float __x)
152288943Sdim  { return __builtin_atan2f(__y, __x); }
153288943Sdim
154288943Sdim  inline long double
155288943Sdim  atan2(long double __y, long double __x)
156288943Sdim  { return __builtin_atan2l(__y, __x); }
157288943Sdim
158288943Sdim  template<typename _Tp, typename _Up>
159288943Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value
160288943Sdim    					   && __is_integer<_Up>::__value,
161288943Sdim					   double>::__type
162280031Sdim    atan2(_Tp __y, _Up __x)
163280031Sdim    { return __builtin_atan2(__y, __x); }
164280031Sdim
165280031Sdim  using ::ceil;
166280031Sdim
167341825Sdim  inline float
168280031Sdim  ceil(float __x)
169280031Sdim  { return __builtin_ceilf(__x); }
170280031Sdim
171280031Sdim  inline long double
172280031Sdim  ceil(long double __x)
173280031Sdim  { return __builtin_ceill(__x); }
174280031Sdim
175280031Sdim  template<typename _Tp>
176280031Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
177280031Sdim					   double>::__type
178280031Sdim    ceil(_Tp __x)
179280031Sdim    { return __builtin_ceil(__x); }
180280031Sdim
181280031Sdim  using ::cos;
182341825Sdim
183280031Sdim  inline float
184280031Sdim  cos(float __x)
185280031Sdim  { return __builtin_cosf(__x); }
186321369Sdim
187321369Sdim  inline long double
188280031Sdim  cos(long double __x)
189280031Sdim  { return __builtin_cosl(__x); }
190321369Sdim
191280031Sdim  template<typename _Tp>
192280031Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
193280031Sdim					   double>::__type
194280031Sdim    cos(_Tp __x)
195280031Sdim    { return __builtin_cos(__x); }
196280031Sdim
197280031Sdim  using ::cosh;
198280031Sdim
199280031Sdim  inline float
200280031Sdim  cosh(float __x)
201280031Sdim  { return __builtin_coshf(__x); }
202280031Sdim
203341825Sdim  inline long double
204296417Sdim  cosh(long double __x)
205296417Sdim  { return __builtin_coshl(__x); }
206296417Sdim
207296417Sdim  template<typename _Tp>
208296417Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
209296417Sdim					   double>::__type
210296417Sdim    cosh(_Tp __x)
211296417Sdim    { return __builtin_cosh(__x); }
212341825Sdim
213296417Sdim  using ::exp;
214296417Sdim
215296417Sdim  inline float
216296417Sdim  exp(float __x)
217296417Sdim  { return __builtin_expf(__x); }
218296417Sdim
219296417Sdim  inline long double
220296417Sdim  exp(long double __x)
221296417Sdim  { return __builtin_expl(__x); }
222296417Sdim
223296417Sdim  template<typename _Tp>
224296417Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
225341825Sdim					   double>::__type
226296417Sdim    exp(_Tp __x)
227296417Sdim    { return __builtin_exp(__x); }
228296417Sdim
229296417Sdim  using ::fabs;
230296417Sdim
231296417Sdim  inline float
232296417Sdim  fabs(float __x)
233296417Sdim  { return __builtin_fabsf(__x); }
234341825Sdim
235296417Sdim  inline long double
236296417Sdim  fabs(long double __x)
237296417Sdim  { return __builtin_fabsl(__x); }
238296417Sdim
239296417Sdim  template<typename _Tp>
240296417Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
241296417Sdim					   double>::__type
242296417Sdim    fabs(_Tp __x)
243341825Sdim    { return __builtin_fabs(__x); }
244296417Sdim
245296417Sdim  using ::floor;
246296417Sdim
247296417Sdim  inline float
248296417Sdim  floor(float __x)
249341825Sdim  { return __builtin_floorf(__x); }
250296417Sdim
251296417Sdim  inline long double
252296417Sdim  floor(long double __x)
253296417Sdim  { return __builtin_floorl(__x); }
254296417Sdim
255296417Sdim  template<typename _Tp>
256296417Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
257296417Sdim					   double>::__type
258296417Sdim    floor(_Tp __x)
259296417Sdim    { return __builtin_floor(__x); }
260296417Sdim
261296417Sdim  using ::fmod;
262341825Sdim
263296417Sdim  inline float
264296417Sdim  fmod(float __x, float __y)
265321369Sdim  { return __builtin_fmodf(__x, __y); }
266296417Sdim
267296417Sdim  inline long double
268341825Sdim  fmod(long double __x, long double __y)
269296417Sdim  { return __builtin_fmodl(__x, __y); }
270296417Sdim
271296417Sdim  using ::frexp;
272296417Sdim
273296417Sdim  inline float
274341825Sdim  frexp(float __x, int* __exp)
275280031Sdim  { return __builtin_frexpf(__x, __exp); }
276280031Sdim
277280031Sdim  inline long double
278280031Sdim  frexp(long double __x, int* __exp)
279280031Sdim  { return __builtin_frexpl(__x, __exp); }
280280031Sdim
281280031Sdim  template<typename _Tp>
282280031Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
283321369Sdim					   double>::__type
284280031Sdim    frexp(_Tp __x, int* __exp)
285280031Sdim    { return __builtin_frexp(__x, __exp); }
286288943Sdim
287321369Sdim  using ::ldexp;
288280031Sdim
289280031Sdim  inline float
290280031Sdim  ldexp(float __x, int __exp)
291321369Sdim  { return __builtin_ldexpf(__x, __exp); }
292314564Sdim
293280031Sdim  inline long double
294280031Sdim  ldexp(long double __x, int __exp)
295280031Sdim  { return __builtin_ldexpl(__x, __exp); }
296280031Sdim
297288943Sdim  template<typename _Tp>
298288943Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
299341825Sdim					   double>::__type
300280031Sdim  ldexp(_Tp __x, int __exp)
301280031Sdim  { return __builtin_ldexp(__x, __exp); }
302280031Sdim
303280031Sdim  using ::log;
304341825Sdim
305280031Sdim  inline float
306280031Sdim  log(float __x)
307288943Sdim  { return __builtin_logf(__x); }
308288943Sdim
309280031Sdim  inline long double
310280031Sdim  log(long double __x)
311280031Sdim  { return __builtin_logl(__x); }
312280031Sdim
313280031Sdim  template<typename _Tp>
314280031Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
315280031Sdim					   double>::__type
316309124Sdim    log(_Tp __x)
317309124Sdim    { return __builtin_log(__x); }
318309124Sdim
319309124Sdim  using ::log10;
320309124Sdim
321309124Sdim  inline float
322309124Sdim  log10(float __x)
323309124Sdim  { return __builtin_log10f(__x); }
324309124Sdim
325309124Sdim  inline long double
326309124Sdim  log10(long double __x)
327309124Sdim  { return __builtin_log10l(__x); }
328309124Sdim
329280031Sdim  template<typename _Tp>
330280031Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
331341825Sdim					   double>::__type
332280031Sdim    log10(_Tp __x)
333280031Sdim    { return __builtin_log10(__x); }
334280031Sdim
335280031Sdim  using ::modf;
336280031Sdim
337280031Sdim  inline float
338280031Sdim  modf(float __x, float* __iptr)
339280031Sdim  { return __builtin_modff(__x, __iptr); }
340280031Sdim
341280031Sdim  inline long double
342280031Sdim  modf(long double __x, long double* __iptr)
343280031Sdim  { return __builtin_modfl(__x, __iptr); }
344280031Sdim
345341825Sdim  template<typename _Tp>
346280031Sdim    inline _Tp
347280031Sdim    __pow_helper(_Tp __x, int __n)
348280031Sdim    {
349280031Sdim      return __n < 0
350280031Sdim        ? _Tp(1)/__cmath_power(__x, -__n)
351280031Sdim        : __cmath_power(__x, __n);
352288943Sdim    }
353280031Sdim
354280031Sdim  using ::pow;
355314564Sdim
356288943Sdim  inline float
357280031Sdim  pow(float __x, float __y)
358280031Sdim  { return __builtin_powf(__x, __y); }
359280031Sdim
360321369Sdim  inline long double
361280031Sdim  pow(long double __x, long double __y)
362280031Sdim  { return __builtin_powl(__x, __y); }
363280031Sdim
364321369Sdim  inline double
365280031Sdim  pow(double __x, int __i)
366280031Sdim  { return __builtin_powi(__x, __i); }
367280031Sdim
368280031Sdim  inline float
369280031Sdim  pow(float __x, int __n)
370321369Sdim  { return __builtin_powif(__x, __n); }
371280031Sdim
372280031Sdim  inline long double
373280031Sdim  pow(long double __x, int __n)
374321369Sdim  { return __builtin_powil(__x, __n); }
375280031Sdim
376280031Sdim  using ::sin;
377280031Sdim
378280031Sdim  inline float
379280031Sdim  sin(float __x)
380280031Sdim  { return __builtin_sinf(__x); }
381280031Sdim
382280031Sdim  inline long double
383280031Sdim  sin(long double __x)
384280031Sdim  { return __builtin_sinl(__x); }
385280031Sdim
386280031Sdim  template<typename _Tp>
387341825Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
388280031Sdim					   double>::__type
389280031Sdim    sin(_Tp __x)
390280031Sdim    { return __builtin_sin(__x); }
391280031Sdim
392280031Sdim  using ::sinh;
393280031Sdim
394280031Sdim  inline float
395280031Sdim  sinh(float __x)
396280031Sdim  { return __builtin_sinhf(__x); }
397280031Sdim
398280031Sdim  inline long double
399280031Sdim  sinh(long double __x)
400280031Sdim  { return __builtin_sinhl(__x); }
401280031Sdim
402280031Sdim  template<typename _Tp>
403280031Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
404280031Sdim					   double>::__type
405280031Sdim    sinh(_Tp __x)
406280031Sdim    { return __builtin_sinh(__x); }
407280031Sdim
408280031Sdim  using ::sqrt;
409280031Sdim
410280031Sdim  inline float
411280031Sdim  sqrt(float __x)
412280031Sdim  { return __builtin_sqrtf(__x); }
413314564Sdim
414280031Sdim  inline long double
415280031Sdim  sqrt(long double __x)
416280031Sdim  { return __builtin_sqrtl(__x); }
417280031Sdim
418280031Sdim  template<typename _Tp>
419280031Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
420280031Sdim					   double>::__type
421280031Sdim    sqrt(_Tp __x)
422280031Sdim    { return __builtin_sqrt(__x); }
423280031Sdim
424280031Sdim  using ::tan;
425280031Sdim
426280031Sdim  inline float
427280031Sdim  tan(float __x)
428280031Sdim  { return __builtin_tanf(__x); }
429280031Sdim
430280031Sdim  inline long double
431280031Sdim  tan(long double __x)
432280031Sdim  { return __builtin_tanl(__x); }
433280031Sdim
434280031Sdim  template<typename _Tp>
435280031Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
436280031Sdim					   double>::__type
437280031Sdim    tan(_Tp __x)
438280031Sdim    { return __builtin_tan(__x); }
439314564Sdim
440280031Sdim  using ::tanh;
441280031Sdim
442280031Sdim  inline float
443280031Sdim  tanh(float __x)
444280031Sdim  { return __builtin_tanhf(__x); }
445280031Sdim
446280031Sdim  inline long double
447280031Sdim  tanh(long double __x)
448280031Sdim  { return __builtin_tanhl(__x); }
449341825Sdim
450280031Sdim  template<typename _Tp>
451280031Sdim    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
452280031Sdim					   double>::__type
453280031Sdim    tanh(_Tp __x)
454280031Sdim    { return __builtin_tanh(__x); }
455280031Sdim
456280031Sdim_GLIBCXX_END_NAMESPACE
457280031Sdim
458280031Sdim#if _GLIBCXX_USE_C99_MATH
459280031Sdim#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
460280031Sdim// These are possible macros imported from C99-land. For strict
461280031Sdim// conformance, remove possible C99-injected names from the global
462280031Sdim// namespace, and sequester them in the __gnu_cxx extension namespace.
463280031Sdim
464280031Sdim_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
465280031Sdim
466280031Sdim  template<typename _Tp>
467280031Sdim    inline int
468280031Sdim    __capture_fpclassify(_Tp __f) { return fpclassify(__f); }
469280031Sdim
470280031Sdim  template<typename _Tp>
471280031Sdim    inline int
472280031Sdim    __capture_isfinite(_Tp __f) { return isfinite(__f); }
473280031Sdim
474280031Sdim  template<typename _Tp>
475280031Sdim    inline int
476280031Sdim    __capture_isinf(_Tp __f) { return isinf(__f); }
477280031Sdim
478280031Sdim  template<typename _Tp>
479280031Sdim    inline int
480280031Sdim    __capture_isnan(_Tp __f) { return isnan(__f); }
481280031Sdim
482280031Sdim  template<typename _Tp>
483280031Sdim    inline int
484280031Sdim    __capture_isnormal(_Tp __f) { return isnormal(__f); }
485280031Sdim
486280031Sdim  template<typename _Tp>
487280031Sdim    inline int
488280031Sdim    __capture_signbit(_Tp __f) { return signbit(__f); }
489280031Sdim
490280031Sdim  template<typename _Tp>
491280031Sdim    inline int
492280031Sdim    __capture_isgreater(_Tp __f1, _Tp __f2)
493280031Sdim    { return isgreater(__f1, __f2); }
494280031Sdim
495280031Sdim  template<typename _Tp>
496280031Sdim    inline int
497280031Sdim    __capture_isgreaterequal(_Tp __f1, _Tp __f2)
498280031Sdim    { return isgreaterequal(__f1, __f2); }
499280031Sdim
500314564Sdim  template<typename _Tp>
501280031Sdim    inline int
502280031Sdim    __capture_isless(_Tp __f1, _Tp __f2) { return isless(__f1, __f2); }
503321369Sdim
504321369Sdim  template<typename _Tp>
505280031Sdim    inline int
506280031Sdim    __capture_islessequal(_Tp __f1, _Tp __f2)
507280031Sdim    { return islessequal(__f1, __f2); }
508280031Sdim
509280031Sdim  template<typename _Tp>
510280031Sdim    inline int
511280031Sdim    __capture_islessgreater(_Tp __f1, _Tp __f2)
512280031Sdim    { return islessgreater(__f1, __f2); }
513280031Sdim
514280031Sdim  template<typename _Tp>
515280031Sdim    inline int
516280031Sdim    __capture_isunordered(_Tp __f1, _Tp __f2)
517280031Sdim    { return isunordered(__f1, __f2); }
518280031Sdim
519280031Sdim_GLIBCXX_END_NAMESPACE
520280031Sdim
521280031Sdim// Only undefine the C99 FP macros, if actually captured for namespace movement
522314564Sdim#undef fpclassify
523280031Sdim#undef isfinite
524280031Sdim#undef isinf
525341825Sdim#undef isnan
526280031Sdim#undef isnormal
527280031Sdim#undef signbit
528280031Sdim#undef isgreater
529280031Sdim#undef isgreaterequal
530280031Sdim#undef isless
531280031Sdim#undef islessequal
532280031Sdim#undef islessgreater
533280031Sdim#undef isunordered
534280031Sdim
535280031Sdim_GLIBCXX_BEGIN_NAMESPACE(std)
536280031Sdim
537280031Sdim  template<typename _Tp>
538280031Sdim    inline int
539280031Sdim    fpclassify(_Tp __f) { return ::__gnu_cxx::__capture_fpclassify(__f); }
540280031Sdim
541280031Sdim  template<typename _Tp>
542280031Sdim    inline int
543280031Sdim    isfinite(_Tp __f) { return ::__gnu_cxx::__capture_isfinite(__f); }
544341825Sdim
545280031Sdim  template<typename _Tp>
546280031Sdim    inline int
547280031Sdim    isinf(_Tp __f) { return ::__gnu_cxx::__capture_isinf(__f); }
548280031Sdim
549280031Sdim  template<typename _Tp>
550280031Sdim    inline int
551280031Sdim    isnan(_Tp __f) { return ::__gnu_cxx::__capture_isnan(__f); }
552280031Sdim
553280031Sdim  template<typename _Tp>
554280031Sdim    inline int
555280031Sdim    isnormal(_Tp __f) { return ::__gnu_cxx::__capture_isnormal(__f); }
556280031Sdim
557280031Sdim  template<typename _Tp>
558280031Sdim    inline int
559341825Sdim    signbit(_Tp __f) { return ::__gnu_cxx::__capture_signbit(__f); }
560280031Sdim
561280031Sdim  template<typename _Tp>
562280031Sdim    inline int
563280031Sdim    isgreater(_Tp __f1, _Tp __f2)
564280031Sdim    { return ::__gnu_cxx::__capture_isgreater(__f1, __f2); }
565280031Sdim
566280031Sdim  template<typename _Tp>
567280031Sdim    inline int
568280031Sdim    isgreaterequal(_Tp __f1, _Tp __f2)
569280031Sdim    { return ::__gnu_cxx::__capture_isgreaterequal(__f1, __f2); }
570280031Sdim
571341825Sdim  template<typename _Tp>
572280031Sdim    inline int
573280031Sdim    isless(_Tp __f1, _Tp __f2)
574280031Sdim    { return ::__gnu_cxx::__capture_isless(__f1, __f2); }
575280031Sdim
576280031Sdim  template<typename _Tp>
577280031Sdim    inline int
578280031Sdim    islessequal(_Tp __f1, _Tp __f2)
579280031Sdim    { return ::__gnu_cxx::__capture_islessequal(__f1, __f2); }
580280031Sdim
581280031Sdim  template<typename _Tp>
582280031Sdim    inline int
583280031Sdim    islessgreater(_Tp __f1, _Tp __f2)
584341825Sdim    { return ::__gnu_cxx::__capture_islessgreater(__f1, __f2); }
585280031Sdim
586280031Sdim  template<typename _Tp>
587280031Sdim    inline int
588280031Sdim    isunordered(_Tp __f1, _Tp __f2)
589280031Sdim    { return ::__gnu_cxx::__capture_isunordered(__f1, __f2); }
590280031Sdim
591280031Sdim_GLIBCXX_END_NAMESPACE
592280031Sdim
593280031Sdim#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
594280031Sdim#endif
595280031Sdim
596280031Sdim#ifndef _GLIBCXX_EXPORT_TEMPLATE
597280031Sdim# include <bits/cmath.tcc>
598280031Sdim#endif
599249259Sdim
600341825Sdim#endif
601280031Sdim