197403Sobrien// -*- C++ -*- forwarding header.
297403Sobrien
3132720Skan// Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc.
497403Sobrien//
597403Sobrien// This file is part of the GNU ISO C++ Library.  This library is free
697403Sobrien// software; you can redistribute it and/or modify it under the
797403Sobrien// terms of the GNU General Public License as published by the
897403Sobrien// Free Software Foundation; either version 2, or (at your option)
997403Sobrien// any later version.
1097403Sobrien
1197403Sobrien// This library is distributed in the hope that it will be useful,
1297403Sobrien// but WITHOUT ANY WARRANTY; without even the implied warranty of
1397403Sobrien// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1497403Sobrien// GNU General Public License for more details.
1597403Sobrien
1697403Sobrien// You should have received a copy of the GNU General Public License along
1797403Sobrien// with this library; see the file COPYING.  If not, write to the Free
18169691Skan// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
1997403Sobrien// USA.
2097403Sobrien
2197403Sobrien// As a special exception, you may use this file as part of a free software
2297403Sobrien// library without restriction.  Specifically, if other files instantiate
2397403Sobrien// templates or use macros or inline functions from this file, or you compile
2497403Sobrien// this file and link it with other files to produce an executable, this
2597403Sobrien// file does not by itself cause the resulting executable to be covered by
2697403Sobrien// the GNU General Public License.  This exception does not however
2797403Sobrien// invalidate any other reasons why the executable file might be covered by
2897403Sobrien// the GNU General Public License.
2997403Sobrien
3097403Sobrien//
3197403Sobrien// ISO C++ 14882: 26.5  C library
3297403Sobrien//
3397403Sobrien
34132720Skan#ifndef _GLIBCXX_CMATH
35132720Skan#define _GLIBCXX_CMATH 1
36132720Skan
3797403Sobrien#pragma GCC system_header
3897403Sobrien
39102782Skan#include <bits/c++config.h>
40102782Skan
4197403Sobrien#include_next <math.h>
4297403Sobrien
43102782Skan// Get rid of those macros defined in <math.h> in lieu of real functions.
44102782Skan#undef abs
45102782Skan#undef div
46102782Skan#undef acos
47102782Skan#undef asin
48102782Skan#undef atan
49102782Skan#undef atan2
50102782Skan#undef ceil
51102782Skan#undef cos
52102782Skan#undef cosh
53102782Skan#undef exp
54102782Skan#undef fabs
55102782Skan#undef floor
56102782Skan#undef fmod
57102782Skan#undef frexp
58102782Skan#undef ldexp
59102782Skan#undef log
60102782Skan#undef log10
61102782Skan#undef modf
62102782Skan#undef pow
63102782Skan#undef sin
64102782Skan#undef sinh
65102782Skan#undef sqrt
66102782Skan#undef tan
67102782Skan#undef tanh
68102782Skan
69102782Skan#undef fpclassify
70102782Skan#undef isfinite
71102782Skan#undef isinf
72102782Skan#undef isnan
73102782Skan#undef isnormal
74102782Skan#undef signbit
75102782Skan#undef isgreater
76102782Skan#undef isgreaterequal
77102782Skan#undef isless
78102782Skan#undef islessequal
79102782Skan#undef islessgreater
80102782Skan#undef isunordered
81102782Skan
82132720Skannamespace std
83102782Skan{
84102782Skan  inline double
85102782Skan  abs(double __x)
86102782Skan  { return __builtin_fabs(__x); }
87102782Skan
88102782Skan  inline float
89102782Skan  abs(float __x)
90102782Skan  { return __builtin_fabsf(__x); }
91102782Skan
92102782Skan  inline long double
93102782Skan  abs(long double __x)
94102782Skan  { return __builtin_fabsl(__x); }
95102782Skan
96132720Skan#if _GLIBCXX_HAVE_MODFF
97132720Skan  inline float
98102782Skan  modf(float __x, float* __iptr) { return modff(__x, __iptr); }
99102782Skan#else
100132720Skan  inline float
101102782Skan  modf(float __x, float* __iptr)
102102782Skan  {
103102782Skan    double __tmp;
104102782Skan    double __res = modf(static_cast<double>(__x), &__tmp);
105102782Skan    *__iptr = static_cast<float>(__tmp);
106102782Skan    return __res;
107102782Skan  }
10897403Sobrien#endif
109102782Skan
110132720Skan#if _GLIBCXX_HAVE_MODFL
111132720Skan  inline long double
112102782Skan  modf(long double __x, long double* __iptr) { return modfl(__x, __iptr); }
113102782Skan#else
114132720Skan  inline long double
115132720Skan  modf(long double __x, long double* __iptr)
116132720Skan  {
117102782Skan    double __tmp;
118102782Skan    double __res = modf(static_cast<double>(__x), &__tmp);
119102782Skan    * __iptr = static_cast<long double>(__tmp);
120102782Skan    return __res;
121102782Skan  }
122102782Skan#endif
123102782Skan}
124102782Skan#endif
125