0,0 → 1,591 |
// -*- C++ -*- C forwarding header. |
|
// Copyright (C) 1997-2015 Free Software Foundation, Inc. |
// |
// This file is part of the GNU ISO C++ Library. This library is free |
// software; you can redistribute it and/or modify it under the |
// terms of the GNU General Public License as published by the |
// Free Software Foundation; either version 3, or (at your option) |
// any later version. |
|
// This library is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. |
|
// Under Section 7 of GPL version 3, you are granted additional |
// permissions described in the GCC Runtime Library Exception, version |
// 3.1, as published by the Free Software Foundation. |
|
// You should have received a copy of the GNU General Public License and |
// a copy of the GCC Runtime Library Exception along with this program; |
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
// <http://www.gnu.org/licenses/>. |
|
/** @file include/cmath |
* This is a Standard C++ Library file. You should @c #include this file |
* in your programs, rather than any of the @a *.h implementation files. |
* |
* This is the C++ version of the Standard C Library header @c math.h, |
* and its contents are (mostly) the same as that header, but are all |
* contained in the namespace @c std (except for names which are defined |
* as macros in C). |
*/ |
|
// |
// ISO C++ 14882: 26.5 C library |
// |
|
#ifndef _GLIBCXX_CMATH |
#define _GLIBCXX_CMATH 1 |
|
#pragma GCC system_header |
|
#include <bits/c++config.h> |
#include <bits/cpp_type_traits.h> |
#include <ext/type_traits.h> |
|
#include <math.h> |
|
// Get rid of those macros defined in <math.h> in lieu of real functions. |
#undef abs |
#undef div |
#undef acos |
#undef asin |
#undef atan |
#undef atan2 |
#undef ceil |
#undef cos |
#undef cosh |
#undef exp |
#undef fabs |
#undef floor |
#undef fmod |
#undef frexp |
#undef ldexp |
#undef log |
#undef log10 |
#undef modf |
#undef pow |
#undef sin |
#undef sinh |
#undef sqrt |
#undef tan |
#undef tanh |
|
namespace std _GLIBCXX_VISIBILITY(default) |
{ |
_GLIBCXX_BEGIN_NAMESPACE_VERSION |
|
inline double |
abs(double __x) |
{ return __builtin_fabs(__x); } |
|
inline float |
abs(float __x) |
{ return __builtin_fabsf(__x); } |
|
inline long double |
abs(long double __x) |
{ return __builtin_fabsl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
abs(_Tp __x) |
{ return __builtin_fabs(__x); } |
|
using ::acos; |
|
inline float |
acos(float __x) |
{ return __builtin_acosf(__x); } |
|
inline long double |
acos(long double __x) |
{ return __builtin_acosl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
acos(_Tp __x) |
{ return __builtin_acos(__x); } |
|
using ::asin; |
|
inline float |
asin(float __x) |
{ return __builtin_asinf(__x); } |
|
inline long double |
asin(long double __x) |
{ return __builtin_asinl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
asin(_Tp __x) |
{ return __builtin_asin(__x); } |
|
using ::atan; |
|
inline float |
atan(float __x) |
{ return __builtin_atanf(__x); } |
|
inline long double |
atan(long double __x) |
{ return __builtin_atanl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
atan(_Tp __x) |
{ return __builtin_atan(__x); } |
|
using ::atan2; |
|
inline float |
atan2(float __y, float __x) |
{ return __builtin_atan2f(__y, __x); } |
|
inline long double |
atan2(long double __y, long double __x) |
{ return __builtin_atan2l(__y, __x); } |
|
template<typename _Tp, typename _Up> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value |
&& __is_integer<_Up>::__value, |
double>::__type |
atan2(_Tp __y, _Up __x) |
{ return __builtin_atan2(__y, __x); } |
|
using ::ceil; |
|
inline float |
ceil(float __x) |
{ return __builtin_ceilf(__x); } |
|
inline long double |
ceil(long double __x) |
{ return __builtin_ceill(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
ceil(_Tp __x) |
{ return __builtin_ceil(__x); } |
|
using ::cos; |
|
inline float |
cos(float __x) |
{ return __builtin_cosf(__x); } |
|
inline long double |
cos(long double __x) |
{ return __builtin_cosl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
cos(_Tp __x) |
{ return __builtin_cos(__x); } |
|
using ::cosh; |
|
inline float |
cosh(float __x) |
{ return __builtin_coshf(__x); } |
|
inline long double |
cosh(long double __x) |
{ return __builtin_coshl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
cosh(_Tp __x) |
{ return __builtin_cosh(__x); } |
|
using ::exp; |
|
inline float |
exp(float __x) |
{ return __builtin_expf(__x); } |
|
inline long double |
exp(long double __x) |
{ return __builtin_expl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
exp(_Tp __x) |
{ return __builtin_exp(__x); } |
|
using ::fabs; |
|
inline float |
fabs(float __x) |
{ return __builtin_fabsf(__x); } |
|
inline long double |
fabs(long double __x) |
{ return __builtin_fabsl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
fabs(_Tp __x) |
{ return __builtin_fabs(__x); } |
|
using ::floor; |
|
inline float |
floor(float __x) |
{ return __builtin_floorf(__x); } |
|
inline long double |
floor(long double __x) |
{ return __builtin_floorl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
floor(_Tp __x) |
{ return __builtin_floor(__x); } |
|
using ::fmod; |
|
inline float |
fmod(float __x, float __y) |
{ return __builtin_fmodf(__x, __y); } |
|
inline long double |
fmod(long double __x, long double __y) |
{ return __builtin_fmodl(__x, __y); } |
|
template<typename _Tp, typename _Up> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value |
&& __is_integer<_Up>::__value, |
double>::__type |
fmod(_Tp __x, _Up __y) |
{ return __builtin_fmod(__x, __y); } |
|
using ::frexp; |
|
inline float |
frexp(float __x, int* __exp) |
{ return __builtin_frexpf(__x, __exp); } |
|
inline long double |
frexp(long double __x, int* __exp) |
{ return __builtin_frexpl(__x, __exp); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
frexp(_Tp __x, int* __exp) |
{ return __builtin_frexp(__x, __exp); } |
|
using ::ldexp; |
|
inline float |
ldexp(float __x, int __exp) |
{ return __builtin_ldexpf(__x, __exp); } |
|
inline long double |
ldexp(long double __x, int __exp) |
{ return __builtin_ldexpl(__x, __exp); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
ldexp(_Tp __x, int __exp) |
{ return __builtin_ldexp(__x, __exp); } |
|
using ::log; |
|
inline float |
log(float __x) |
{ return __builtin_logf(__x); } |
|
inline long double |
log(long double __x) |
{ return __builtin_logl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
log(_Tp __x) |
{ return __builtin_log(__x); } |
|
using ::log10; |
|
inline float |
log10(float __x) |
{ return __builtin_log10f(__x); } |
|
inline long double |
log10(long double __x) |
{ return __builtin_log10l(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
log10(_Tp __x) |
{ return __builtin_log10(__x); } |
|
using ::modf; |
|
inline float |
modf(float __x, float* __iptr) |
{ return __builtin_modff(__x, __iptr); } |
|
inline long double |
modf(long double __x, long double* __iptr) |
{ return __builtin_modfl(__x, __iptr); } |
|
using ::pow; |
|
inline float |
pow(float __x, float __y) |
{ return __builtin_powf(__x, __y); } |
|
inline long double |
pow(long double __x, long double __y) |
{ return __builtin_powl(__x, __y); } |
|
inline double |
pow(double __x, int __i) |
{ return __builtin_powi(__x, __i); } |
|
inline float |
pow(float __x, int __n) |
{ return __builtin_powif(__x, __n); } |
|
inline long double |
pow(long double __x, int __n) |
{ return __builtin_powil(__x, __n); } |
|
using ::sin; |
|
inline float |
sin(float __x) |
{ return __builtin_sinf(__x); } |
|
inline long double |
sin(long double __x) |
{ return __builtin_sinl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
sin(_Tp __x) |
{ return __builtin_sin(__x); } |
|
using ::sinh; |
|
inline float |
sinh(float __x) |
{ return __builtin_sinhf(__x); } |
|
inline long double |
sinh(long double __x) |
{ return __builtin_sinhl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
sinh(_Tp __x) |
{ return __builtin_sinh(__x); } |
|
using ::sqrt; |
|
inline float |
sqrt(float __x) |
{ return __builtin_sqrtf(__x); } |
|
inline long double |
sqrt(long double __x) |
{ return __builtin_sqrtl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
sqrt(_Tp __x) |
{ return __builtin_sqrt(__x); } |
|
using ::tan; |
|
inline float |
tan(float __x) |
{ return __builtin_tanf(__x); } |
|
inline long double |
tan(long double __x) |
{ return __builtin_tanl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
tan(_Tp __x) |
{ return __builtin_tan(__x); } |
|
using ::tanh; |
|
inline float |
tanh(float __x) |
{ return __builtin_tanhf(__x); } |
|
inline long double |
tanh(long double __x) |
{ return __builtin_tanhl(__x); } |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, |
double>::__type |
tanh(_Tp __x) |
{ return __builtin_tanh(__x); } |
|
_GLIBCXX_END_NAMESPACE_VERSION |
} // namespace |
|
#if _GLIBCXX_USE_C99_MATH |
#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC |
|
// These are possible macros imported from C99-land. |
#undef fpclassify |
#undef isfinite |
#undef isinf |
#undef isnan |
#undef isnormal |
#undef signbit |
#undef isgreater |
#undef isgreaterequal |
#undef isless |
#undef islessequal |
#undef islessgreater |
#undef isunordered |
|
namespace std _GLIBCXX_VISIBILITY(default) |
{ |
_GLIBCXX_BEGIN_NAMESPACE_VERSION |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, |
int>::__type |
fpclassify(_Tp __f) |
{ |
typedef typename __gnu_cxx::__promote<_Tp>::__type __type; |
return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, |
FP_SUBNORMAL, FP_ZERO, __type(__f)); |
} |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, |
int>::__type |
isfinite(_Tp __f) |
{ |
typedef typename __gnu_cxx::__promote<_Tp>::__type __type; |
return __builtin_isfinite(__type(__f)); |
} |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, |
int>::__type |
isinf(_Tp __f) |
{ |
typedef typename __gnu_cxx::__promote<_Tp>::__type __type; |
return __builtin_isinf(__type(__f)); |
} |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, |
int>::__type |
isnan(_Tp __f) |
{ |
typedef typename __gnu_cxx::__promote<_Tp>::__type __type; |
return __builtin_isnan(__type(__f)); |
} |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, |
int>::__type |
isnormal(_Tp __f) |
{ |
typedef typename __gnu_cxx::__promote<_Tp>::__type __type; |
return __builtin_isnormal(__type(__f)); |
} |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, |
int>::__type |
signbit(_Tp __f) |
{ |
typedef typename __gnu_cxx::__promote<_Tp>::__type __type; |
return __builtin_signbit(__type(__f)); |
} |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, |
int>::__type |
isgreater(_Tp __f1, _Tp __f2) |
{ |
typedef typename __gnu_cxx::__promote<_Tp>::__type __type; |
return __builtin_isgreater(__type(__f1), __type(__f2)); |
} |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, |
int>::__type |
isgreaterequal(_Tp __f1, _Tp __f2) |
{ |
typedef typename __gnu_cxx::__promote<_Tp>::__type __type; |
return __builtin_isgreaterequal(__type(__f1), __type(__f2)); |
} |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, |
int>::__type |
isless(_Tp __f1, _Tp __f2) |
{ |
typedef typename __gnu_cxx::__promote<_Tp>::__type __type; |
return __builtin_isless(__type(__f1), __type(__f2)); |
} |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, |
int>::__type |
islessequal(_Tp __f1, _Tp __f2) |
{ |
typedef typename __gnu_cxx::__promote<_Tp>::__type __type; |
return __builtin_islessequal(__type(__f1), __type(__f2)); |
} |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, |
int>::__type |
islessgreater(_Tp __f1, _Tp __f2) |
{ |
typedef typename __gnu_cxx::__promote<_Tp>::__type __type; |
return __builtin_islessgreater(__type(__f1), __type(__f2)); |
} |
|
template<typename _Tp> |
inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, |
int>::__type |
isunordered(_Tp __f1, _Tp __f2) |
{ |
typedef typename __gnu_cxx::__promote<_Tp>::__type __type; |
return __builtin_isunordered(__type(__f1), __type(__f2)); |
} |
|
_GLIBCXX_END_NAMESPACE_VERSION |
} // namespace std |
|
#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */ |
#endif |
|
#endif |