1*e4b17023SJohn Marino// -*- C++ -*- C forwarding header. 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 4*e4b17023SJohn Marino// 2006, 2007, 2008, 2009, 2010 5*e4b17023SJohn Marino// Free Software Foundation, Inc. 6*e4b17023SJohn Marino// 7*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library. This library is free 8*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the 9*e4b17023SJohn Marino// terms of the GNU General Public License as published by the 10*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option) 11*e4b17023SJohn Marino// any later version. 12*e4b17023SJohn Marino 13*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful, 14*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of 15*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*e4b17023SJohn Marino// GNU General Public License for more details. 17*e4b17023SJohn Marino 18*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional 19*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version 20*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation. 21*e4b17023SJohn Marino 22*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License and 23*e4b17023SJohn Marino// a copy of the GCC Runtime Library Exception along with this program; 24*e4b17023SJohn Marino// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 25*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>. 26*e4b17023SJohn Marino 27*e4b17023SJohn Marino/** @file include/cmath 28*e4b17023SJohn Marino * This is a Standard C++ Library file. You should @c #include this file 29*e4b17023SJohn Marino * in your programs, rather than any of the @a *.h implementation files. 30*e4b17023SJohn Marino * 31*e4b17023SJohn Marino * This is the C++ version of the Standard C Library header @c math.h, 32*e4b17023SJohn Marino * and its contents are (mostly) the same as that header, but are all 33*e4b17023SJohn Marino * contained in the namespace @c std (except for names which are defined 34*e4b17023SJohn Marino * as macros in C). 35*e4b17023SJohn Marino */ 36*e4b17023SJohn Marino 37*e4b17023SJohn Marino// 38*e4b17023SJohn Marino// ISO C++ 14882: 26.5 C library 39*e4b17023SJohn Marino// 40*e4b17023SJohn Marino 41*e4b17023SJohn Marino#ifndef _GLIBCXX_CMATH 42*e4b17023SJohn Marino#define _GLIBCXX_CMATH 1 43*e4b17023SJohn Marino 44*e4b17023SJohn Marino#pragma GCC system_header 45*e4b17023SJohn Marino 46*e4b17023SJohn Marino#include <bits/c++config.h> 47*e4b17023SJohn Marino#include <bits/cpp_type_traits.h> 48*e4b17023SJohn Marino#include <ext/type_traits.h> 49*e4b17023SJohn Marino 50*e4b17023SJohn Marino#include <math.h> 51*e4b17023SJohn Marino 52*e4b17023SJohn Marino// Get rid of those macros defined in <math.h> in lieu of real functions. 53*e4b17023SJohn Marino#undef abs 54*e4b17023SJohn Marino#undef div 55*e4b17023SJohn Marino#undef acos 56*e4b17023SJohn Marino#undef asin 57*e4b17023SJohn Marino#undef atan 58*e4b17023SJohn Marino#undef atan2 59*e4b17023SJohn Marino#undef ceil 60*e4b17023SJohn Marino#undef cos 61*e4b17023SJohn Marino#undef cosh 62*e4b17023SJohn Marino#undef exp 63*e4b17023SJohn Marino#undef fabs 64*e4b17023SJohn Marino#undef floor 65*e4b17023SJohn Marino#undef fmod 66*e4b17023SJohn Marino#undef frexp 67*e4b17023SJohn Marino#undef ldexp 68*e4b17023SJohn Marino#undef log 69*e4b17023SJohn Marino#undef log10 70*e4b17023SJohn Marino#undef modf 71*e4b17023SJohn Marino#undef pow 72*e4b17023SJohn Marino#undef sin 73*e4b17023SJohn Marino#undef sinh 74*e4b17023SJohn Marino#undef sqrt 75*e4b17023SJohn Marino#undef tan 76*e4b17023SJohn Marino#undef tanh 77*e4b17023SJohn Marino 78*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default) 79*e4b17023SJohn Marino{ 80*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 81*e4b17023SJohn Marino 82*e4b17023SJohn Marino inline double 83*e4b17023SJohn Marino abs(double __x) 84*e4b17023SJohn Marino { return __builtin_fabs(__x); } 85*e4b17023SJohn Marino 86*e4b17023SJohn Marino inline float 87*e4b17023SJohn Marino abs(float __x) 88*e4b17023SJohn Marino { return __builtin_fabsf(__x); } 89*e4b17023SJohn Marino 90*e4b17023SJohn Marino inline long double 91*e4b17023SJohn Marino abs(long double __x) 92*e4b17023SJohn Marino { return __builtin_fabsl(__x); } 93*e4b17023SJohn Marino 94*e4b17023SJohn Marino template<typename _Tp> 95*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 96*e4b17023SJohn Marino double>::__type 97*e4b17023SJohn Marino abs(_Tp __x) 98*e4b17023SJohn Marino { return __builtin_fabs(__x); } 99*e4b17023SJohn Marino 100*e4b17023SJohn Marino using ::acos; 101*e4b17023SJohn Marino 102*e4b17023SJohn Marino inline float 103*e4b17023SJohn Marino acos(float __x) 104*e4b17023SJohn Marino { return __builtin_acosf(__x); } 105*e4b17023SJohn Marino 106*e4b17023SJohn Marino inline long double 107*e4b17023SJohn Marino acos(long double __x) 108*e4b17023SJohn Marino { return __builtin_acosl(__x); } 109*e4b17023SJohn Marino 110*e4b17023SJohn Marino template<typename _Tp> 111*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 112*e4b17023SJohn Marino double>::__type 113*e4b17023SJohn Marino acos(_Tp __x) 114*e4b17023SJohn Marino { return __builtin_acos(__x); } 115*e4b17023SJohn Marino 116*e4b17023SJohn Marino using ::asin; 117*e4b17023SJohn Marino 118*e4b17023SJohn Marino inline float 119*e4b17023SJohn Marino asin(float __x) 120*e4b17023SJohn Marino { return __builtin_asinf(__x); } 121*e4b17023SJohn Marino 122*e4b17023SJohn Marino inline long double 123*e4b17023SJohn Marino asin(long double __x) 124*e4b17023SJohn Marino { return __builtin_asinl(__x); } 125*e4b17023SJohn Marino 126*e4b17023SJohn Marino template<typename _Tp> 127*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 128*e4b17023SJohn Marino double>::__type 129*e4b17023SJohn Marino asin(_Tp __x) 130*e4b17023SJohn Marino { return __builtin_asin(__x); } 131*e4b17023SJohn Marino 132*e4b17023SJohn Marino using ::atan; 133*e4b17023SJohn Marino 134*e4b17023SJohn Marino inline float 135*e4b17023SJohn Marino atan(float __x) 136*e4b17023SJohn Marino { return __builtin_atanf(__x); } 137*e4b17023SJohn Marino 138*e4b17023SJohn Marino inline long double 139*e4b17023SJohn Marino atan(long double __x) 140*e4b17023SJohn Marino { return __builtin_atanl(__x); } 141*e4b17023SJohn Marino 142*e4b17023SJohn Marino template<typename _Tp> 143*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 144*e4b17023SJohn Marino double>::__type 145*e4b17023SJohn Marino atan(_Tp __x) 146*e4b17023SJohn Marino { return __builtin_atan(__x); } 147*e4b17023SJohn Marino 148*e4b17023SJohn Marino using ::atan2; 149*e4b17023SJohn Marino 150*e4b17023SJohn Marino inline float 151*e4b17023SJohn Marino atan2(float __y, float __x) 152*e4b17023SJohn Marino { return __builtin_atan2f(__y, __x); } 153*e4b17023SJohn Marino 154*e4b17023SJohn Marino inline long double 155*e4b17023SJohn Marino atan2(long double __y, long double __x) 156*e4b17023SJohn Marino { return __builtin_atan2l(__y, __x); } 157*e4b17023SJohn Marino 158*e4b17023SJohn Marino template<typename _Tp, typename _Up> 159*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value 160*e4b17023SJohn Marino && __is_integer<_Up>::__value, 161*e4b17023SJohn Marino double>::__type 162*e4b17023SJohn Marino atan2(_Tp __y, _Up __x) 163*e4b17023SJohn Marino { return __builtin_atan2(__y, __x); } 164*e4b17023SJohn Marino 165*e4b17023SJohn Marino using ::ceil; 166*e4b17023SJohn Marino 167*e4b17023SJohn Marino inline float 168*e4b17023SJohn Marino ceil(float __x) 169*e4b17023SJohn Marino { return __builtin_ceilf(__x); } 170*e4b17023SJohn Marino 171*e4b17023SJohn Marino inline long double 172*e4b17023SJohn Marino ceil(long double __x) 173*e4b17023SJohn Marino { return __builtin_ceill(__x); } 174*e4b17023SJohn Marino 175*e4b17023SJohn Marino template<typename _Tp> 176*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 177*e4b17023SJohn Marino double>::__type 178*e4b17023SJohn Marino ceil(_Tp __x) 179*e4b17023SJohn Marino { return __builtin_ceil(__x); } 180*e4b17023SJohn Marino 181*e4b17023SJohn Marino using ::cos; 182*e4b17023SJohn Marino 183*e4b17023SJohn Marino inline float 184*e4b17023SJohn Marino cos(float __x) 185*e4b17023SJohn Marino { return __builtin_cosf(__x); } 186*e4b17023SJohn Marino 187*e4b17023SJohn Marino inline long double 188*e4b17023SJohn Marino cos(long double __x) 189*e4b17023SJohn Marino { return __builtin_cosl(__x); } 190*e4b17023SJohn Marino 191*e4b17023SJohn Marino template<typename _Tp> 192*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 193*e4b17023SJohn Marino double>::__type 194*e4b17023SJohn Marino cos(_Tp __x) 195*e4b17023SJohn Marino { return __builtin_cos(__x); } 196*e4b17023SJohn Marino 197*e4b17023SJohn Marino using ::cosh; 198*e4b17023SJohn Marino 199*e4b17023SJohn Marino inline float 200*e4b17023SJohn Marino cosh(float __x) 201*e4b17023SJohn Marino { return __builtin_coshf(__x); } 202*e4b17023SJohn Marino 203*e4b17023SJohn Marino inline long double 204*e4b17023SJohn Marino cosh(long double __x) 205*e4b17023SJohn Marino { return __builtin_coshl(__x); } 206*e4b17023SJohn Marino 207*e4b17023SJohn Marino template<typename _Tp> 208*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 209*e4b17023SJohn Marino double>::__type 210*e4b17023SJohn Marino cosh(_Tp __x) 211*e4b17023SJohn Marino { return __builtin_cosh(__x); } 212*e4b17023SJohn Marino 213*e4b17023SJohn Marino using ::exp; 214*e4b17023SJohn Marino 215*e4b17023SJohn Marino inline float 216*e4b17023SJohn Marino exp(float __x) 217*e4b17023SJohn Marino { return __builtin_expf(__x); } 218*e4b17023SJohn Marino 219*e4b17023SJohn Marino inline long double 220*e4b17023SJohn Marino exp(long double __x) 221*e4b17023SJohn Marino { return __builtin_expl(__x); } 222*e4b17023SJohn Marino 223*e4b17023SJohn Marino template<typename _Tp> 224*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 225*e4b17023SJohn Marino double>::__type 226*e4b17023SJohn Marino exp(_Tp __x) 227*e4b17023SJohn Marino { return __builtin_exp(__x); } 228*e4b17023SJohn Marino 229*e4b17023SJohn Marino using ::fabs; 230*e4b17023SJohn Marino 231*e4b17023SJohn Marino inline float 232*e4b17023SJohn Marino fabs(float __x) 233*e4b17023SJohn Marino { return __builtin_fabsf(__x); } 234*e4b17023SJohn Marino 235*e4b17023SJohn Marino inline long double 236*e4b17023SJohn Marino fabs(long double __x) 237*e4b17023SJohn Marino { return __builtin_fabsl(__x); } 238*e4b17023SJohn Marino 239*e4b17023SJohn Marino template<typename _Tp> 240*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 241*e4b17023SJohn Marino double>::__type 242*e4b17023SJohn Marino fabs(_Tp __x) 243*e4b17023SJohn Marino { return __builtin_fabs(__x); } 244*e4b17023SJohn Marino 245*e4b17023SJohn Marino using ::floor; 246*e4b17023SJohn Marino 247*e4b17023SJohn Marino inline float 248*e4b17023SJohn Marino floor(float __x) 249*e4b17023SJohn Marino { return __builtin_floorf(__x); } 250*e4b17023SJohn Marino 251*e4b17023SJohn Marino inline long double 252*e4b17023SJohn Marino floor(long double __x) 253*e4b17023SJohn Marino { return __builtin_floorl(__x); } 254*e4b17023SJohn Marino 255*e4b17023SJohn Marino template<typename _Tp> 256*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 257*e4b17023SJohn Marino double>::__type 258*e4b17023SJohn Marino floor(_Tp __x) 259*e4b17023SJohn Marino { return __builtin_floor(__x); } 260*e4b17023SJohn Marino 261*e4b17023SJohn Marino using ::fmod; 262*e4b17023SJohn Marino 263*e4b17023SJohn Marino inline float 264*e4b17023SJohn Marino fmod(float __x, float __y) 265*e4b17023SJohn Marino { return __builtin_fmodf(__x, __y); } 266*e4b17023SJohn Marino 267*e4b17023SJohn Marino inline long double 268*e4b17023SJohn Marino fmod(long double __x, long double __y) 269*e4b17023SJohn Marino { return __builtin_fmodl(__x, __y); } 270*e4b17023SJohn Marino 271*e4b17023SJohn Marino template<typename _Tp, typename _Up> 272*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value 273*e4b17023SJohn Marino && __is_integer<_Up>::__value, 274*e4b17023SJohn Marino double>::__type 275*e4b17023SJohn Marino fmod(_Tp __x, _Up __y) 276*e4b17023SJohn Marino { return __builtin_fmod(__x, __y); } 277*e4b17023SJohn Marino 278*e4b17023SJohn Marino using ::frexp; 279*e4b17023SJohn Marino 280*e4b17023SJohn Marino inline float 281*e4b17023SJohn Marino frexp(float __x, int* __exp) 282*e4b17023SJohn Marino { return __builtin_frexpf(__x, __exp); } 283*e4b17023SJohn Marino 284*e4b17023SJohn Marino inline long double 285*e4b17023SJohn Marino frexp(long double __x, int* __exp) 286*e4b17023SJohn Marino { return __builtin_frexpl(__x, __exp); } 287*e4b17023SJohn Marino 288*e4b17023SJohn Marino template<typename _Tp> 289*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 290*e4b17023SJohn Marino double>::__type 291*e4b17023SJohn Marino frexp(_Tp __x, int* __exp) 292*e4b17023SJohn Marino { return __builtin_frexp(__x, __exp); } 293*e4b17023SJohn Marino 294*e4b17023SJohn Marino using ::ldexp; 295*e4b17023SJohn Marino 296*e4b17023SJohn Marino inline float 297*e4b17023SJohn Marino ldexp(float __x, int __exp) 298*e4b17023SJohn Marino { return __builtin_ldexpf(__x, __exp); } 299*e4b17023SJohn Marino 300*e4b17023SJohn Marino inline long double 301*e4b17023SJohn Marino ldexp(long double __x, int __exp) 302*e4b17023SJohn Marino { return __builtin_ldexpl(__x, __exp); } 303*e4b17023SJohn Marino 304*e4b17023SJohn Marino template<typename _Tp> 305*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 306*e4b17023SJohn Marino double>::__type 307*e4b17023SJohn Marino ldexp(_Tp __x, int __exp) 308*e4b17023SJohn Marino { return __builtin_ldexp(__x, __exp); } 309*e4b17023SJohn Marino 310*e4b17023SJohn Marino using ::log; 311*e4b17023SJohn Marino 312*e4b17023SJohn Marino inline float 313*e4b17023SJohn Marino log(float __x) 314*e4b17023SJohn Marino { return __builtin_logf(__x); } 315*e4b17023SJohn Marino 316*e4b17023SJohn Marino inline long double 317*e4b17023SJohn Marino log(long double __x) 318*e4b17023SJohn Marino { return __builtin_logl(__x); } 319*e4b17023SJohn Marino 320*e4b17023SJohn Marino template<typename _Tp> 321*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 322*e4b17023SJohn Marino double>::__type 323*e4b17023SJohn Marino log(_Tp __x) 324*e4b17023SJohn Marino { return __builtin_log(__x); } 325*e4b17023SJohn Marino 326*e4b17023SJohn Marino using ::log10; 327*e4b17023SJohn Marino 328*e4b17023SJohn Marino inline float 329*e4b17023SJohn Marino log10(float __x) 330*e4b17023SJohn Marino { return __builtin_log10f(__x); } 331*e4b17023SJohn Marino 332*e4b17023SJohn Marino inline long double 333*e4b17023SJohn Marino log10(long double __x) 334*e4b17023SJohn Marino { return __builtin_log10l(__x); } 335*e4b17023SJohn Marino 336*e4b17023SJohn Marino template<typename _Tp> 337*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 338*e4b17023SJohn Marino double>::__type 339*e4b17023SJohn Marino log10(_Tp __x) 340*e4b17023SJohn Marino { return __builtin_log10(__x); } 341*e4b17023SJohn Marino 342*e4b17023SJohn Marino using ::modf; 343*e4b17023SJohn Marino 344*e4b17023SJohn Marino inline float 345*e4b17023SJohn Marino modf(float __x, float* __iptr) 346*e4b17023SJohn Marino { return __builtin_modff(__x, __iptr); } 347*e4b17023SJohn Marino 348*e4b17023SJohn Marino inline long double 349*e4b17023SJohn Marino modf(long double __x, long double* __iptr) 350*e4b17023SJohn Marino { return __builtin_modfl(__x, __iptr); } 351*e4b17023SJohn Marino 352*e4b17023SJohn Marino using ::pow; 353*e4b17023SJohn Marino 354*e4b17023SJohn Marino inline float 355*e4b17023SJohn Marino pow(float __x, float __y) 356*e4b17023SJohn Marino { return __builtin_powf(__x, __y); } 357*e4b17023SJohn Marino 358*e4b17023SJohn Marino inline long double 359*e4b17023SJohn Marino pow(long double __x, long double __y) 360*e4b17023SJohn Marino { return __builtin_powl(__x, __y); } 361*e4b17023SJohn Marino 362*e4b17023SJohn Marino inline double 363*e4b17023SJohn Marino pow(double __x, int __i) 364*e4b17023SJohn Marino { return __builtin_powi(__x, __i); } 365*e4b17023SJohn Marino 366*e4b17023SJohn Marino inline float 367*e4b17023SJohn Marino pow(float __x, int __n) 368*e4b17023SJohn Marino { return __builtin_powif(__x, __n); } 369*e4b17023SJohn Marino 370*e4b17023SJohn Marino inline long double 371*e4b17023SJohn Marino pow(long double __x, int __n) 372*e4b17023SJohn Marino { return __builtin_powil(__x, __n); } 373*e4b17023SJohn Marino 374*e4b17023SJohn Marino using ::sin; 375*e4b17023SJohn Marino 376*e4b17023SJohn Marino inline float 377*e4b17023SJohn Marino sin(float __x) 378*e4b17023SJohn Marino { return __builtin_sinf(__x); } 379*e4b17023SJohn Marino 380*e4b17023SJohn Marino inline long double 381*e4b17023SJohn Marino sin(long double __x) 382*e4b17023SJohn Marino { return __builtin_sinl(__x); } 383*e4b17023SJohn Marino 384*e4b17023SJohn Marino template<typename _Tp> 385*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 386*e4b17023SJohn Marino double>::__type 387*e4b17023SJohn Marino sin(_Tp __x) 388*e4b17023SJohn Marino { return __builtin_sin(__x); } 389*e4b17023SJohn Marino 390*e4b17023SJohn Marino using ::sinh; 391*e4b17023SJohn Marino 392*e4b17023SJohn Marino inline float 393*e4b17023SJohn Marino sinh(float __x) 394*e4b17023SJohn Marino { return __builtin_sinhf(__x); } 395*e4b17023SJohn Marino 396*e4b17023SJohn Marino inline long double 397*e4b17023SJohn Marino sinh(long double __x) 398*e4b17023SJohn Marino { return __builtin_sinhl(__x); } 399*e4b17023SJohn Marino 400*e4b17023SJohn Marino template<typename _Tp> 401*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 402*e4b17023SJohn Marino double>::__type 403*e4b17023SJohn Marino sinh(_Tp __x) 404*e4b17023SJohn Marino { return __builtin_sinh(__x); } 405*e4b17023SJohn Marino 406*e4b17023SJohn Marino using ::sqrt; 407*e4b17023SJohn Marino 408*e4b17023SJohn Marino inline float 409*e4b17023SJohn Marino sqrt(float __x) 410*e4b17023SJohn Marino { return __builtin_sqrtf(__x); } 411*e4b17023SJohn Marino 412*e4b17023SJohn Marino inline long double 413*e4b17023SJohn Marino sqrt(long double __x) 414*e4b17023SJohn Marino { return __builtin_sqrtl(__x); } 415*e4b17023SJohn Marino 416*e4b17023SJohn Marino template<typename _Tp> 417*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 418*e4b17023SJohn Marino double>::__type 419*e4b17023SJohn Marino sqrt(_Tp __x) 420*e4b17023SJohn Marino { return __builtin_sqrt(__x); } 421*e4b17023SJohn Marino 422*e4b17023SJohn Marino using ::tan; 423*e4b17023SJohn Marino 424*e4b17023SJohn Marino inline float 425*e4b17023SJohn Marino tan(float __x) 426*e4b17023SJohn Marino { return __builtin_tanf(__x); } 427*e4b17023SJohn Marino 428*e4b17023SJohn Marino inline long double 429*e4b17023SJohn Marino tan(long double __x) 430*e4b17023SJohn Marino { return __builtin_tanl(__x); } 431*e4b17023SJohn Marino 432*e4b17023SJohn Marino template<typename _Tp> 433*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 434*e4b17023SJohn Marino double>::__type 435*e4b17023SJohn Marino tan(_Tp __x) 436*e4b17023SJohn Marino { return __builtin_tan(__x); } 437*e4b17023SJohn Marino 438*e4b17023SJohn Marino using ::tanh; 439*e4b17023SJohn Marino 440*e4b17023SJohn Marino inline float 441*e4b17023SJohn Marino tanh(float __x) 442*e4b17023SJohn Marino { return __builtin_tanhf(__x); } 443*e4b17023SJohn Marino 444*e4b17023SJohn Marino inline long double 445*e4b17023SJohn Marino tanh(long double __x) 446*e4b17023SJohn Marino { return __builtin_tanhl(__x); } 447*e4b17023SJohn Marino 448*e4b17023SJohn Marino template<typename _Tp> 449*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 450*e4b17023SJohn Marino double>::__type 451*e4b17023SJohn Marino tanh(_Tp __x) 452*e4b17023SJohn Marino { return __builtin_tanh(__x); } 453*e4b17023SJohn Marino 454*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 455*e4b17023SJohn Marino} // namespace 456*e4b17023SJohn Marino 457*e4b17023SJohn Marino#if _GLIBCXX_USE_C99_MATH 458*e4b17023SJohn Marino#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC 459*e4b17023SJohn Marino 460*e4b17023SJohn Marino// These are possible macros imported from C99-land. 461*e4b17023SJohn Marino#undef fpclassify 462*e4b17023SJohn Marino#undef isfinite 463*e4b17023SJohn Marino#undef isinf 464*e4b17023SJohn Marino#undef isnan 465*e4b17023SJohn Marino#undef isnormal 466*e4b17023SJohn Marino#undef signbit 467*e4b17023SJohn Marino#undef isgreater 468*e4b17023SJohn Marino#undef isgreaterequal 469*e4b17023SJohn Marino#undef isless 470*e4b17023SJohn Marino#undef islessequal 471*e4b17023SJohn Marino#undef islessgreater 472*e4b17023SJohn Marino#undef isunordered 473*e4b17023SJohn Marino 474*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default) 475*e4b17023SJohn Marino{ 476*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 477*e4b17023SJohn Marino 478*e4b17023SJohn Marino template<typename _Tp> 479*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 480*e4b17023SJohn Marino int>::__type 481*e4b17023SJohn Marino fpclassify(_Tp __f) 482*e4b17023SJohn Marino { 483*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 484*e4b17023SJohn Marino return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 485*e4b17023SJohn Marino FP_SUBNORMAL, FP_ZERO, __type(__f)); 486*e4b17023SJohn Marino } 487*e4b17023SJohn Marino 488*e4b17023SJohn Marino template<typename _Tp> 489*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 490*e4b17023SJohn Marino int>::__type 491*e4b17023SJohn Marino isfinite(_Tp __f) 492*e4b17023SJohn Marino { 493*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 494*e4b17023SJohn Marino return __builtin_isfinite(__type(__f)); 495*e4b17023SJohn Marino } 496*e4b17023SJohn Marino 497*e4b17023SJohn Marino template<typename _Tp> 498*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 499*e4b17023SJohn Marino int>::__type 500*e4b17023SJohn Marino isinf(_Tp __f) 501*e4b17023SJohn Marino { 502*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 503*e4b17023SJohn Marino return __builtin_isinf(__type(__f)); 504*e4b17023SJohn Marino } 505*e4b17023SJohn Marino 506*e4b17023SJohn Marino template<typename _Tp> 507*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 508*e4b17023SJohn Marino int>::__type 509*e4b17023SJohn Marino isnan(_Tp __f) 510*e4b17023SJohn Marino { 511*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 512*e4b17023SJohn Marino return __builtin_isnan(__type(__f)); 513*e4b17023SJohn Marino } 514*e4b17023SJohn Marino 515*e4b17023SJohn Marino template<typename _Tp> 516*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 517*e4b17023SJohn Marino int>::__type 518*e4b17023SJohn Marino isnormal(_Tp __f) 519*e4b17023SJohn Marino { 520*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 521*e4b17023SJohn Marino return __builtin_isnormal(__type(__f)); 522*e4b17023SJohn Marino } 523*e4b17023SJohn Marino 524*e4b17023SJohn Marino template<typename _Tp> 525*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 526*e4b17023SJohn Marino int>::__type 527*e4b17023SJohn Marino signbit(_Tp __f) 528*e4b17023SJohn Marino { 529*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 530*e4b17023SJohn Marino return __builtin_signbit(__type(__f)); 531*e4b17023SJohn Marino } 532*e4b17023SJohn Marino 533*e4b17023SJohn Marino template<typename _Tp> 534*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 535*e4b17023SJohn Marino int>::__type 536*e4b17023SJohn Marino isgreater(_Tp __f1, _Tp __f2) 537*e4b17023SJohn Marino { 538*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 539*e4b17023SJohn Marino return __builtin_isgreater(__type(__f1), __type(__f2)); 540*e4b17023SJohn Marino } 541*e4b17023SJohn Marino 542*e4b17023SJohn Marino template<typename _Tp> 543*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 544*e4b17023SJohn Marino int>::__type 545*e4b17023SJohn Marino isgreaterequal(_Tp __f1, _Tp __f2) 546*e4b17023SJohn Marino { 547*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 548*e4b17023SJohn Marino return __builtin_isgreaterequal(__type(__f1), __type(__f2)); 549*e4b17023SJohn Marino } 550*e4b17023SJohn Marino 551*e4b17023SJohn Marino template<typename _Tp> 552*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 553*e4b17023SJohn Marino int>::__type 554*e4b17023SJohn Marino isless(_Tp __f1, _Tp __f2) 555*e4b17023SJohn Marino { 556*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 557*e4b17023SJohn Marino return __builtin_isless(__type(__f1), __type(__f2)); 558*e4b17023SJohn Marino } 559*e4b17023SJohn Marino 560*e4b17023SJohn Marino template<typename _Tp> 561*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 562*e4b17023SJohn Marino int>::__type 563*e4b17023SJohn Marino islessequal(_Tp __f1, _Tp __f2) 564*e4b17023SJohn Marino { 565*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 566*e4b17023SJohn Marino return __builtin_islessequal(__type(__f1), __type(__f2)); 567*e4b17023SJohn Marino } 568*e4b17023SJohn Marino 569*e4b17023SJohn Marino template<typename _Tp> 570*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 571*e4b17023SJohn Marino int>::__type 572*e4b17023SJohn Marino islessgreater(_Tp __f1, _Tp __f2) 573*e4b17023SJohn Marino { 574*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 575*e4b17023SJohn Marino return __builtin_islessgreater(__type(__f1), __type(__f2)); 576*e4b17023SJohn Marino } 577*e4b17023SJohn Marino 578*e4b17023SJohn Marino template<typename _Tp> 579*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 580*e4b17023SJohn Marino int>::__type 581*e4b17023SJohn Marino isunordered(_Tp __f1, _Tp __f2) 582*e4b17023SJohn Marino { 583*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 584*e4b17023SJohn Marino return __builtin_isunordered(__type(__f1), __type(__f2)); 585*e4b17023SJohn Marino } 586*e4b17023SJohn Marino 587*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 588*e4b17023SJohn Marino} // namespace std 589*e4b17023SJohn Marino 590*e4b17023SJohn Marino#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */ 591*e4b17023SJohn Marino#endif 592*e4b17023SJohn Marino 593*e4b17023SJohn Marino#endif 594