xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/c_std/cmath (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
136ac495dSmrg// -*- C++ -*- C forwarding header.
236ac495dSmrg
3*8feb0f0bSmrg// Copyright (C) 1997-2020 Free Software Foundation, Inc.
436ac495dSmrg//
536ac495dSmrg// This file is part of the GNU ISO C++ Library.  This library is free
636ac495dSmrg// software; you can redistribute it and/or modify it under the
736ac495dSmrg// terms of the GNU General Public License as published by the
836ac495dSmrg// Free Software Foundation; either version 3, or (at your option)
936ac495dSmrg// any later version.
1036ac495dSmrg
1136ac495dSmrg// This library is distributed in the hope that it will be useful,
1236ac495dSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of
1336ac495dSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1436ac495dSmrg// GNU General Public License for more details.
1536ac495dSmrg
1636ac495dSmrg// Under Section 7 of GPL version 3, you are granted additional
1736ac495dSmrg// permissions described in the GCC Runtime Library Exception, version
1836ac495dSmrg// 3.1, as published by the Free Software Foundation.
1936ac495dSmrg
2036ac495dSmrg// You should have received a copy of the GNU General Public License and
2136ac495dSmrg// a copy of the GCC Runtime Library Exception along with this program;
2236ac495dSmrg// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2336ac495dSmrg// <http://www.gnu.org/licenses/>.
2436ac495dSmrg
2536ac495dSmrg/** @file include/cmath
2636ac495dSmrg *  This is a Standard C++ Library file.  You should @c #include this file
2736ac495dSmrg *  in your programs, rather than any of the @a *.h implementation files.
2836ac495dSmrg *
2936ac495dSmrg *  This is the C++ version of the Standard C Library header @c math.h,
3036ac495dSmrg *  and its contents are (mostly) the same as that header, but are all
3136ac495dSmrg *  contained in the namespace @c std (except for names which are defined
3236ac495dSmrg *  as macros in C).
3336ac495dSmrg */
3436ac495dSmrg
3536ac495dSmrg//
3636ac495dSmrg// ISO C++ 14882: 26.5  C library
3736ac495dSmrg//
3836ac495dSmrg
3936ac495dSmrg#ifndef _GLIBCXX_CMATH
4036ac495dSmrg#define _GLIBCXX_CMATH 1
4136ac495dSmrg
4236ac495dSmrg#pragma GCC system_header
4336ac495dSmrg
4436ac495dSmrg#include <bits/c++config.h>
4536ac495dSmrg#include <bits/cpp_type_traits.h>
4636ac495dSmrg#include <ext/type_traits.h>
4736ac495dSmrg
4836ac495dSmrg#include <math.h>
4936ac495dSmrg
5036ac495dSmrg// Get rid of those macros defined in <math.h> in lieu of real functions.
5136ac495dSmrg#undef abs
5236ac495dSmrg#undef div
5336ac495dSmrg#undef acos
5436ac495dSmrg#undef asin
5536ac495dSmrg#undef atan
5636ac495dSmrg#undef atan2
5736ac495dSmrg#undef ceil
5836ac495dSmrg#undef cos
5936ac495dSmrg#undef cosh
6036ac495dSmrg#undef exp
6136ac495dSmrg#undef fabs
6236ac495dSmrg#undef floor
6336ac495dSmrg#undef fmod
6436ac495dSmrg#undef frexp
6536ac495dSmrg#undef ldexp
6636ac495dSmrg#undef log
6736ac495dSmrg#undef log10
6836ac495dSmrg#undef modf
6936ac495dSmrg#undef pow
7036ac495dSmrg#undef sin
7136ac495dSmrg#undef sinh
7236ac495dSmrg#undef sqrt
7336ac495dSmrg#undef tan
7436ac495dSmrg#undef tanh
7536ac495dSmrg
7636ac495dSmrgnamespace std _GLIBCXX_VISIBILITY(default)
7736ac495dSmrg{
7836ac495dSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
7936ac495dSmrg
8036ac495dSmrg  inline double
8136ac495dSmrg  abs(double __x)
8236ac495dSmrg  { return __builtin_fabs(__x); }
8336ac495dSmrg
8436ac495dSmrg  inline float
8536ac495dSmrg  abs(float __x)
8636ac495dSmrg  { return __builtin_fabsf(__x); }
8736ac495dSmrg
8836ac495dSmrg  inline long double
8936ac495dSmrg  abs(long double __x)
9036ac495dSmrg  { return __builtin_fabsl(__x); }
9136ac495dSmrg
9236ac495dSmrg  template<typename _Tp>
9336ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
9436ac495dSmrg					   double>::__type
9536ac495dSmrg    abs(_Tp __x)
9636ac495dSmrg    { return __builtin_fabs(__x); }
9736ac495dSmrg
9836ac495dSmrg  using ::acos;
9936ac495dSmrg
10036ac495dSmrg  inline float
10136ac495dSmrg  acos(float __x)
10236ac495dSmrg  { return __builtin_acosf(__x); }
10336ac495dSmrg
10436ac495dSmrg  inline long double
10536ac495dSmrg  acos(long double __x)
10636ac495dSmrg  { return __builtin_acosl(__x); }
10736ac495dSmrg
10836ac495dSmrg  template<typename _Tp>
10936ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
11036ac495dSmrg					   double>::__type
11136ac495dSmrg    acos(_Tp __x)
11236ac495dSmrg    { return __builtin_acos(__x); }
11336ac495dSmrg
11436ac495dSmrg  using ::asin;
11536ac495dSmrg
11636ac495dSmrg  inline float
11736ac495dSmrg  asin(float __x)
11836ac495dSmrg  { return __builtin_asinf(__x); }
11936ac495dSmrg
12036ac495dSmrg  inline long double
12136ac495dSmrg  asin(long double __x)
12236ac495dSmrg  { return __builtin_asinl(__x); }
12336ac495dSmrg
12436ac495dSmrg  template<typename _Tp>
12536ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
12636ac495dSmrg					   double>::__type
12736ac495dSmrg    asin(_Tp __x)
12836ac495dSmrg    { return __builtin_asin(__x); }
12936ac495dSmrg
13036ac495dSmrg  using ::atan;
13136ac495dSmrg
13236ac495dSmrg  inline float
13336ac495dSmrg  atan(float __x)
13436ac495dSmrg  { return __builtin_atanf(__x); }
13536ac495dSmrg
13636ac495dSmrg  inline long double
13736ac495dSmrg  atan(long double __x)
13836ac495dSmrg  { return __builtin_atanl(__x); }
13936ac495dSmrg
14036ac495dSmrg  template<typename _Tp>
14136ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
14236ac495dSmrg					   double>::__type
14336ac495dSmrg    atan(_Tp __x)
14436ac495dSmrg    { return __builtin_atan(__x); }
14536ac495dSmrg
14636ac495dSmrg  using ::atan2;
14736ac495dSmrg
14836ac495dSmrg  inline float
14936ac495dSmrg  atan2(float __y, float __x)
15036ac495dSmrg  { return __builtin_atan2f(__y, __x); }
15136ac495dSmrg
15236ac495dSmrg  inline long double
15336ac495dSmrg  atan2(long double __y, long double __x)
15436ac495dSmrg  { return __builtin_atan2l(__y, __x); }
15536ac495dSmrg
15636ac495dSmrg  template<typename _Tp, typename _Up>
15736ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value
15836ac495dSmrg    					   && __is_integer<_Up>::__value,
15936ac495dSmrg					   double>::__type
16036ac495dSmrg    atan2(_Tp __y, _Up __x)
16136ac495dSmrg    { return __builtin_atan2(__y, __x); }
16236ac495dSmrg
16336ac495dSmrg  using ::ceil;
16436ac495dSmrg
16536ac495dSmrg  inline float
16636ac495dSmrg  ceil(float __x)
16736ac495dSmrg  { return __builtin_ceilf(__x); }
16836ac495dSmrg
16936ac495dSmrg  inline long double
17036ac495dSmrg  ceil(long double __x)
17136ac495dSmrg  { return __builtin_ceill(__x); }
17236ac495dSmrg
17336ac495dSmrg  template<typename _Tp>
17436ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
17536ac495dSmrg					   double>::__type
17636ac495dSmrg    ceil(_Tp __x)
17736ac495dSmrg    { return __builtin_ceil(__x); }
17836ac495dSmrg
17936ac495dSmrg  using ::cos;
18036ac495dSmrg
18136ac495dSmrg  inline float
18236ac495dSmrg  cos(float __x)
18336ac495dSmrg  { return __builtin_cosf(__x); }
18436ac495dSmrg
18536ac495dSmrg  inline long double
18636ac495dSmrg  cos(long double __x)
18736ac495dSmrg  { return __builtin_cosl(__x); }
18836ac495dSmrg
18936ac495dSmrg  template<typename _Tp>
19036ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
19136ac495dSmrg					   double>::__type
19236ac495dSmrg    cos(_Tp __x)
19336ac495dSmrg    { return __builtin_cos(__x); }
19436ac495dSmrg
19536ac495dSmrg  using ::cosh;
19636ac495dSmrg
19736ac495dSmrg  inline float
19836ac495dSmrg  cosh(float __x)
19936ac495dSmrg  { return __builtin_coshf(__x); }
20036ac495dSmrg
20136ac495dSmrg  inline long double
20236ac495dSmrg  cosh(long double __x)
20336ac495dSmrg  { return __builtin_coshl(__x); }
20436ac495dSmrg
20536ac495dSmrg  template<typename _Tp>
20636ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
20736ac495dSmrg					   double>::__type
20836ac495dSmrg    cosh(_Tp __x)
20936ac495dSmrg    { return __builtin_cosh(__x); }
21036ac495dSmrg
21136ac495dSmrg  using ::exp;
21236ac495dSmrg
21336ac495dSmrg  inline float
21436ac495dSmrg  exp(float __x)
21536ac495dSmrg  { return __builtin_expf(__x); }
21636ac495dSmrg
21736ac495dSmrg  inline long double
21836ac495dSmrg  exp(long double __x)
21936ac495dSmrg  { return __builtin_expl(__x); }
22036ac495dSmrg
22136ac495dSmrg  template<typename _Tp>
22236ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
22336ac495dSmrg					   double>::__type
22436ac495dSmrg    exp(_Tp __x)
22536ac495dSmrg    { return __builtin_exp(__x); }
22636ac495dSmrg
22736ac495dSmrg  using ::fabs;
22836ac495dSmrg
22936ac495dSmrg  inline float
23036ac495dSmrg  fabs(float __x)
23136ac495dSmrg  { return __builtin_fabsf(__x); }
23236ac495dSmrg
23336ac495dSmrg  inline long double
23436ac495dSmrg  fabs(long double __x)
23536ac495dSmrg  { return __builtin_fabsl(__x); }
23636ac495dSmrg
23736ac495dSmrg  template<typename _Tp>
23836ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
23936ac495dSmrg					   double>::__type
24036ac495dSmrg    fabs(_Tp __x)
24136ac495dSmrg    { return __builtin_fabs(__x); }
24236ac495dSmrg
24336ac495dSmrg  using ::floor;
24436ac495dSmrg
24536ac495dSmrg  inline float
24636ac495dSmrg  floor(float __x)
24736ac495dSmrg  { return __builtin_floorf(__x); }
24836ac495dSmrg
24936ac495dSmrg  inline long double
25036ac495dSmrg  floor(long double __x)
25136ac495dSmrg  { return __builtin_floorl(__x); }
25236ac495dSmrg
25336ac495dSmrg  template<typename _Tp>
25436ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
25536ac495dSmrg					   double>::__type
25636ac495dSmrg    floor(_Tp __x)
25736ac495dSmrg    { return __builtin_floor(__x); }
25836ac495dSmrg
25936ac495dSmrg  using ::fmod;
26036ac495dSmrg
26136ac495dSmrg  inline float
26236ac495dSmrg  fmod(float __x, float __y)
26336ac495dSmrg  { return __builtin_fmodf(__x, __y); }
26436ac495dSmrg
26536ac495dSmrg  inline long double
26636ac495dSmrg  fmod(long double __x, long double __y)
26736ac495dSmrg  { return __builtin_fmodl(__x, __y); }
26836ac495dSmrg
26936ac495dSmrg  template<typename _Tp, typename _Up>
27036ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value
27136ac495dSmrg    					   && __is_integer<_Up>::__value,
27236ac495dSmrg					   double>::__type
27336ac495dSmrg    fmod(_Tp __x, _Up __y)
27436ac495dSmrg    { return __builtin_fmod(__x, __y); }
27536ac495dSmrg
27636ac495dSmrg  using ::frexp;
27736ac495dSmrg
27836ac495dSmrg  inline float
27936ac495dSmrg  frexp(float __x, int* __exp)
28036ac495dSmrg  { return __builtin_frexpf(__x, __exp); }
28136ac495dSmrg
28236ac495dSmrg  inline long double
28336ac495dSmrg  frexp(long double __x, int* __exp)
28436ac495dSmrg  { return __builtin_frexpl(__x, __exp); }
28536ac495dSmrg
28636ac495dSmrg  template<typename _Tp>
28736ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
28836ac495dSmrg					   double>::__type
28936ac495dSmrg    frexp(_Tp __x, int* __exp)
29036ac495dSmrg    { return __builtin_frexp(__x, __exp); }
29136ac495dSmrg
29236ac495dSmrg  using ::ldexp;
29336ac495dSmrg
29436ac495dSmrg  inline float
29536ac495dSmrg  ldexp(float __x, int __exp)
29636ac495dSmrg  { return __builtin_ldexpf(__x, __exp); }
29736ac495dSmrg
29836ac495dSmrg  inline long double
29936ac495dSmrg  ldexp(long double __x, int __exp)
30036ac495dSmrg  { return __builtin_ldexpl(__x, __exp); }
30136ac495dSmrg
30236ac495dSmrg  template<typename _Tp>
30336ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
30436ac495dSmrg					   double>::__type
30536ac495dSmrg    ldexp(_Tp __x, int __exp)
30636ac495dSmrg    { return __builtin_ldexp(__x, __exp); }
30736ac495dSmrg
30836ac495dSmrg  using ::log;
30936ac495dSmrg
31036ac495dSmrg  inline float
31136ac495dSmrg  log(float __x)
31236ac495dSmrg  { return __builtin_logf(__x); }
31336ac495dSmrg
31436ac495dSmrg  inline long double
31536ac495dSmrg  log(long double __x)
31636ac495dSmrg  { return __builtin_logl(__x); }
31736ac495dSmrg
31836ac495dSmrg  template<typename _Tp>
31936ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
32036ac495dSmrg					   double>::__type
32136ac495dSmrg    log(_Tp __x)
32236ac495dSmrg    { return __builtin_log(__x); }
32336ac495dSmrg
32436ac495dSmrg  using ::log10;
32536ac495dSmrg
32636ac495dSmrg  inline float
32736ac495dSmrg  log10(float __x)
32836ac495dSmrg  { return __builtin_log10f(__x); }
32936ac495dSmrg
33036ac495dSmrg  inline long double
33136ac495dSmrg  log10(long double __x)
33236ac495dSmrg  { return __builtin_log10l(__x); }
33336ac495dSmrg
33436ac495dSmrg  template<typename _Tp>
33536ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
33636ac495dSmrg					   double>::__type
33736ac495dSmrg    log10(_Tp __x)
33836ac495dSmrg    { return __builtin_log10(__x); }
33936ac495dSmrg
34036ac495dSmrg  using ::modf;
34136ac495dSmrg
34236ac495dSmrg  inline float
34336ac495dSmrg  modf(float __x, float* __iptr)
34436ac495dSmrg  { return __builtin_modff(__x, __iptr); }
34536ac495dSmrg
34636ac495dSmrg  inline long double
34736ac495dSmrg  modf(long double __x, long double* __iptr)
34836ac495dSmrg  { return __builtin_modfl(__x, __iptr); }
34936ac495dSmrg
35036ac495dSmrg  using ::pow;
35136ac495dSmrg
35236ac495dSmrg  inline float
35336ac495dSmrg  pow(float __x, float __y)
35436ac495dSmrg  { return __builtin_powf(__x, __y); }
35536ac495dSmrg
35636ac495dSmrg  inline long double
35736ac495dSmrg  pow(long double __x, long double __y)
35836ac495dSmrg  { return __builtin_powl(__x, __y); }
35936ac495dSmrg
36036ac495dSmrg  inline double
36136ac495dSmrg  pow(double __x, int __i)
36236ac495dSmrg  { return __builtin_powi(__x, __i); }
36336ac495dSmrg
36436ac495dSmrg  inline float
36536ac495dSmrg  pow(float __x, int __n)
36636ac495dSmrg  { return __builtin_powif(__x, __n); }
36736ac495dSmrg
36836ac495dSmrg  inline long double
36936ac495dSmrg  pow(long double __x, int __n)
37036ac495dSmrg  { return __builtin_powil(__x, __n); }
37136ac495dSmrg
37236ac495dSmrg  using ::sin;
37336ac495dSmrg
37436ac495dSmrg  inline float
37536ac495dSmrg  sin(float __x)
37636ac495dSmrg  { return __builtin_sinf(__x); }
37736ac495dSmrg
37836ac495dSmrg  inline long double
37936ac495dSmrg  sin(long double __x)
38036ac495dSmrg  { return __builtin_sinl(__x); }
38136ac495dSmrg
38236ac495dSmrg  template<typename _Tp>
38336ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
38436ac495dSmrg					   double>::__type
38536ac495dSmrg    sin(_Tp __x)
38636ac495dSmrg    { return __builtin_sin(__x); }
38736ac495dSmrg
38836ac495dSmrg  using ::sinh;
38936ac495dSmrg
39036ac495dSmrg  inline float
39136ac495dSmrg  sinh(float __x)
39236ac495dSmrg  { return __builtin_sinhf(__x); }
39336ac495dSmrg
39436ac495dSmrg  inline long double
39536ac495dSmrg  sinh(long double __x)
39636ac495dSmrg  { return __builtin_sinhl(__x); }
39736ac495dSmrg
39836ac495dSmrg  template<typename _Tp>
39936ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
40036ac495dSmrg					   double>::__type
40136ac495dSmrg    sinh(_Tp __x)
40236ac495dSmrg    { return __builtin_sinh(__x); }
40336ac495dSmrg
40436ac495dSmrg  using ::sqrt;
40536ac495dSmrg
40636ac495dSmrg  inline float
40736ac495dSmrg  sqrt(float __x)
40836ac495dSmrg  { return __builtin_sqrtf(__x); }
40936ac495dSmrg
41036ac495dSmrg  inline long double
41136ac495dSmrg  sqrt(long double __x)
41236ac495dSmrg  { return __builtin_sqrtl(__x); }
41336ac495dSmrg
41436ac495dSmrg  template<typename _Tp>
41536ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
41636ac495dSmrg					   double>::__type
41736ac495dSmrg    sqrt(_Tp __x)
41836ac495dSmrg    { return __builtin_sqrt(__x); }
41936ac495dSmrg
42036ac495dSmrg  using ::tan;
42136ac495dSmrg
42236ac495dSmrg  inline float
42336ac495dSmrg  tan(float __x)
42436ac495dSmrg  { return __builtin_tanf(__x); }
42536ac495dSmrg
42636ac495dSmrg  inline long double
42736ac495dSmrg  tan(long double __x)
42836ac495dSmrg  { return __builtin_tanl(__x); }
42936ac495dSmrg
43036ac495dSmrg  template<typename _Tp>
43136ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
43236ac495dSmrg					   double>::__type
43336ac495dSmrg    tan(_Tp __x)
43436ac495dSmrg    { return __builtin_tan(__x); }
43536ac495dSmrg
43636ac495dSmrg  using ::tanh;
43736ac495dSmrg
43836ac495dSmrg  inline float
43936ac495dSmrg  tanh(float __x)
44036ac495dSmrg  { return __builtin_tanhf(__x); }
44136ac495dSmrg
44236ac495dSmrg  inline long double
44336ac495dSmrg  tanh(long double __x)
44436ac495dSmrg  { return __builtin_tanhl(__x); }
44536ac495dSmrg
44636ac495dSmrg  template<typename _Tp>
44736ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
44836ac495dSmrg					   double>::__type
44936ac495dSmrg    tanh(_Tp __x)
45036ac495dSmrg    { return __builtin_tanh(__x); }
45136ac495dSmrg
45236ac495dSmrg#if _GLIBCXX_USE_C99_MATH
45336ac495dSmrg#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
45436ac495dSmrg
45536ac495dSmrg// These are possible macros imported from C99-land.
45636ac495dSmrg#undef fpclassify
45736ac495dSmrg#undef isfinite
45836ac495dSmrg#undef isinf
45936ac495dSmrg#undef isnan
46036ac495dSmrg#undef isnormal
46136ac495dSmrg#undef signbit
46236ac495dSmrg#undef isgreater
46336ac495dSmrg#undef isgreaterequal
46436ac495dSmrg#undef isless
46536ac495dSmrg#undef islessequal
46636ac495dSmrg#undef islessgreater
46736ac495dSmrg#undef isunordered
46836ac495dSmrg
46936ac495dSmrg  template<typename _Tp>
47036ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
47136ac495dSmrg					   int>::__type
47236ac495dSmrg    fpclassify(_Tp __f)
47336ac495dSmrg    {
47436ac495dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
47536ac495dSmrg      return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
47636ac495dSmrg				  FP_SUBNORMAL, FP_ZERO, __type(__f));
47736ac495dSmrg    }
47836ac495dSmrg
47936ac495dSmrg  template<typename _Tp>
48036ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
48136ac495dSmrg					   int>::__type
48236ac495dSmrg    isfinite(_Tp __f)
48336ac495dSmrg    {
48436ac495dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
48536ac495dSmrg      return __builtin_isfinite(__type(__f));
48636ac495dSmrg    }
48736ac495dSmrg
48836ac495dSmrg  template<typename _Tp>
48936ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
49036ac495dSmrg					   int>::__type
49136ac495dSmrg    isinf(_Tp __f)
49236ac495dSmrg    {
49336ac495dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
49436ac495dSmrg      return __builtin_isinf(__type(__f));
49536ac495dSmrg    }
49636ac495dSmrg
49736ac495dSmrg  template<typename _Tp>
49836ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
49936ac495dSmrg					   int>::__type
50036ac495dSmrg    isnan(_Tp __f)
50136ac495dSmrg    {
50236ac495dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
50336ac495dSmrg      return __builtin_isnan(__type(__f));
50436ac495dSmrg    }
50536ac495dSmrg
50636ac495dSmrg  template<typename _Tp>
50736ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
50836ac495dSmrg					   int>::__type
50936ac495dSmrg    isnormal(_Tp __f)
51036ac495dSmrg    {
51136ac495dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
51236ac495dSmrg      return __builtin_isnormal(__type(__f));
51336ac495dSmrg    }
51436ac495dSmrg
51536ac495dSmrg  template<typename _Tp>
51636ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
51736ac495dSmrg					   int>::__type
51836ac495dSmrg    signbit(_Tp __f)
51936ac495dSmrg    {
52036ac495dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
52136ac495dSmrg      return __builtin_signbit(__type(__f));
52236ac495dSmrg    }
52336ac495dSmrg
52436ac495dSmrg  template<typename _Tp>
52536ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
52636ac495dSmrg					   int>::__type
52736ac495dSmrg    isgreater(_Tp __f1, _Tp __f2)
52836ac495dSmrg    {
52936ac495dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
53036ac495dSmrg      return __builtin_isgreater(__type(__f1), __type(__f2));
53136ac495dSmrg    }
53236ac495dSmrg
53336ac495dSmrg  template<typename _Tp>
53436ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
53536ac495dSmrg					   int>::__type
53636ac495dSmrg    isgreaterequal(_Tp __f1, _Tp __f2)
53736ac495dSmrg    {
53836ac495dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
53936ac495dSmrg      return __builtin_isgreaterequal(__type(__f1), __type(__f2));
54036ac495dSmrg    }
54136ac495dSmrg
54236ac495dSmrg  template<typename _Tp>
54336ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
54436ac495dSmrg					   int>::__type
54536ac495dSmrg    isless(_Tp __f1, _Tp __f2)
54636ac495dSmrg    {
54736ac495dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
54836ac495dSmrg      return __builtin_isless(__type(__f1), __type(__f2));
54936ac495dSmrg    }
55036ac495dSmrg
55136ac495dSmrg  template<typename _Tp>
55236ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
55336ac495dSmrg					   int>::__type
55436ac495dSmrg    islessequal(_Tp __f1, _Tp __f2)
55536ac495dSmrg    {
55636ac495dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
55736ac495dSmrg      return __builtin_islessequal(__type(__f1), __type(__f2));
55836ac495dSmrg    }
55936ac495dSmrg
56036ac495dSmrg  template<typename _Tp>
56136ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
56236ac495dSmrg					   int>::__type
56336ac495dSmrg    islessgreater(_Tp __f1, _Tp __f2)
56436ac495dSmrg    {
56536ac495dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
56636ac495dSmrg      return __builtin_islessgreater(__type(__f1), __type(__f2));
56736ac495dSmrg    }
56836ac495dSmrg
56936ac495dSmrg  template<typename _Tp>
57036ac495dSmrg    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
57136ac495dSmrg					   int>::__type
57236ac495dSmrg    isunordered(_Tp __f1, _Tp __f2)
57336ac495dSmrg    {
57436ac495dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
57536ac495dSmrg      return __builtin_isunordered(__type(__f1), __type(__f2));
57636ac495dSmrg    }
57736ac495dSmrg
578a2dc1f3fSmrg#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
579a2dc1f3fSmrg#endif /* _GLIBCXX_USE_C99_MATH */
580a2dc1f3fSmrg
58136ac495dSmrg_GLIBCXX_END_NAMESPACE_VERSION
58236ac495dSmrg} // namespace std
58336ac495dSmrg
58436ac495dSmrg#endif
585