1*38fd1498Szrj// -*- C++ -*- C forwarding header. 2*38fd1498Szrj 3*38fd1498Szrj// Copyright (C) 1997-2018 Free Software Foundation, Inc. 4*38fd1498Szrj// 5*38fd1498Szrj// This file is part of the GNU ISO C++ Library. This library is free 6*38fd1498Szrj// software; you can redistribute it and/or modify it under the 7*38fd1498Szrj// terms of the GNU General Public License as published by the 8*38fd1498Szrj// Free Software Foundation; either version 3, or (at your option) 9*38fd1498Szrj// any later version. 10*38fd1498Szrj 11*38fd1498Szrj// This library is distributed in the hope that it will be useful, 12*38fd1498Szrj// but WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*38fd1498Szrj// GNU General Public License for more details. 15*38fd1498Szrj 16*38fd1498Szrj// Under Section 7 of GPL version 3, you are granted additional 17*38fd1498Szrj// permissions described in the GCC Runtime Library Exception, version 18*38fd1498Szrj// 3.1, as published by the Free Software Foundation. 19*38fd1498Szrj 20*38fd1498Szrj// You should have received a copy of the GNU General Public License and 21*38fd1498Szrj// a copy of the GCC Runtime Library Exception along with this program; 22*38fd1498Szrj// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23*38fd1498Szrj// <http://www.gnu.org/licenses/>. 24*38fd1498Szrj 25*38fd1498Szrj/** @file include/cmath 26*38fd1498Szrj * This is a Standard C++ Library file. You should @c \#include this file 27*38fd1498Szrj * in your programs, rather than any of the @a *.h implementation files. 28*38fd1498Szrj * 29*38fd1498Szrj * This is the C++ version of the Standard C Library header @c math.h, 30*38fd1498Szrj * and its contents are (mostly) the same as that header, but are all 31*38fd1498Szrj * contained in the namespace @c std (except for names which are defined 32*38fd1498Szrj * as macros in C). 33*38fd1498Szrj */ 34*38fd1498Szrj 35*38fd1498Szrj// 36*38fd1498Szrj// ISO C++ 14882: 26.5 C library 37*38fd1498Szrj// 38*38fd1498Szrj 39*38fd1498Szrj#pragma GCC system_header 40*38fd1498Szrj 41*38fd1498Szrj#include <bits/c++config.h> 42*38fd1498Szrj#include <bits/cpp_type_traits.h> 43*38fd1498Szrj#include <ext/type_traits.h> 44*38fd1498Szrj#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS 45*38fd1498Szrj#include_next <math.h> 46*38fd1498Szrj#undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS 47*38fd1498Szrj#include <bits/std_abs.h> 48*38fd1498Szrj 49*38fd1498Szrj#ifndef _GLIBCXX_CMATH 50*38fd1498Szrj#define _GLIBCXX_CMATH 1 51*38fd1498Szrj 52*38fd1498Szrj// Get rid of those macros defined in <math.h> in lieu of real functions. 53*38fd1498Szrj#undef div 54*38fd1498Szrj#undef acos 55*38fd1498Szrj#undef asin 56*38fd1498Szrj#undef atan 57*38fd1498Szrj#undef atan2 58*38fd1498Szrj#undef ceil 59*38fd1498Szrj#undef cos 60*38fd1498Szrj#undef cosh 61*38fd1498Szrj#undef exp 62*38fd1498Szrj#undef fabs 63*38fd1498Szrj#undef floor 64*38fd1498Szrj#undef fmod 65*38fd1498Szrj#undef frexp 66*38fd1498Szrj#undef ldexp 67*38fd1498Szrj#undef log 68*38fd1498Szrj#undef log10 69*38fd1498Szrj#undef modf 70*38fd1498Szrj#undef pow 71*38fd1498Szrj#undef sin 72*38fd1498Szrj#undef sinh 73*38fd1498Szrj#undef sqrt 74*38fd1498Szrj#undef tan 75*38fd1498Szrj#undef tanh 76*38fd1498Szrj 77*38fd1498Szrjextern "C++" 78*38fd1498Szrj{ 79*38fd1498Szrjnamespace std _GLIBCXX_VISIBILITY(default) 80*38fd1498Szrj{ 81*38fd1498Szrj_GLIBCXX_BEGIN_NAMESPACE_VERSION 82*38fd1498Szrj 83*38fd1498Szrj using ::acos; 84*38fd1498Szrj 85*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 86*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 87*38fd1498Szrj acos(float __x) 88*38fd1498Szrj { return __builtin_acosf(__x); } 89*38fd1498Szrj 90*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 91*38fd1498Szrj acos(long double __x) 92*38fd1498Szrj { return __builtin_acosl(__x); } 93*38fd1498Szrj#endif 94*38fd1498Szrj 95*38fd1498Szrj template<typename _Tp> 96*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 97*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 98*38fd1498Szrj double>::__type 99*38fd1498Szrj acos(_Tp __x) 100*38fd1498Szrj { return __builtin_acos(__x); } 101*38fd1498Szrj 102*38fd1498Szrj using ::asin; 103*38fd1498Szrj 104*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 105*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 106*38fd1498Szrj asin(float __x) 107*38fd1498Szrj { return __builtin_asinf(__x); } 108*38fd1498Szrj 109*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 110*38fd1498Szrj asin(long double __x) 111*38fd1498Szrj { return __builtin_asinl(__x); } 112*38fd1498Szrj#endif 113*38fd1498Szrj 114*38fd1498Szrj template<typename _Tp> 115*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 116*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 117*38fd1498Szrj double>::__type 118*38fd1498Szrj asin(_Tp __x) 119*38fd1498Szrj { return __builtin_asin(__x); } 120*38fd1498Szrj 121*38fd1498Szrj using ::atan; 122*38fd1498Szrj 123*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 124*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 125*38fd1498Szrj atan(float __x) 126*38fd1498Szrj { return __builtin_atanf(__x); } 127*38fd1498Szrj 128*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 129*38fd1498Szrj atan(long double __x) 130*38fd1498Szrj { return __builtin_atanl(__x); } 131*38fd1498Szrj#endif 132*38fd1498Szrj 133*38fd1498Szrj template<typename _Tp> 134*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 135*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 136*38fd1498Szrj double>::__type 137*38fd1498Szrj atan(_Tp __x) 138*38fd1498Szrj { return __builtin_atan(__x); } 139*38fd1498Szrj 140*38fd1498Szrj using ::atan2; 141*38fd1498Szrj 142*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 143*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 144*38fd1498Szrj atan2(float __y, float __x) 145*38fd1498Szrj { return __builtin_atan2f(__y, __x); } 146*38fd1498Szrj 147*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 148*38fd1498Szrj atan2(long double __y, long double __x) 149*38fd1498Szrj { return __builtin_atan2l(__y, __x); } 150*38fd1498Szrj#endif 151*38fd1498Szrj 152*38fd1498Szrj template<typename _Tp, typename _Up> 153*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 154*38fd1498Szrj typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 155*38fd1498Szrj atan2(_Tp __y, _Up __x) 156*38fd1498Szrj { 157*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 158*38fd1498Szrj return atan2(__type(__y), __type(__x)); 159*38fd1498Szrj } 160*38fd1498Szrj 161*38fd1498Szrj using ::ceil; 162*38fd1498Szrj 163*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 164*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 165*38fd1498Szrj ceil(float __x) 166*38fd1498Szrj { return __builtin_ceilf(__x); } 167*38fd1498Szrj 168*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 169*38fd1498Szrj ceil(long double __x) 170*38fd1498Szrj { return __builtin_ceill(__x); } 171*38fd1498Szrj#endif 172*38fd1498Szrj 173*38fd1498Szrj template<typename _Tp> 174*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 175*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 176*38fd1498Szrj double>::__type 177*38fd1498Szrj ceil(_Tp __x) 178*38fd1498Szrj { return __builtin_ceil(__x); } 179*38fd1498Szrj 180*38fd1498Szrj using ::cos; 181*38fd1498Szrj 182*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 183*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 184*38fd1498Szrj cos(float __x) 185*38fd1498Szrj { return __builtin_cosf(__x); } 186*38fd1498Szrj 187*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 188*38fd1498Szrj cos(long double __x) 189*38fd1498Szrj { return __builtin_cosl(__x); } 190*38fd1498Szrj#endif 191*38fd1498Szrj 192*38fd1498Szrj template<typename _Tp> 193*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 194*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 195*38fd1498Szrj double>::__type 196*38fd1498Szrj cos(_Tp __x) 197*38fd1498Szrj { return __builtin_cos(__x); } 198*38fd1498Szrj 199*38fd1498Szrj using ::cosh; 200*38fd1498Szrj 201*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 202*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 203*38fd1498Szrj cosh(float __x) 204*38fd1498Szrj { return __builtin_coshf(__x); } 205*38fd1498Szrj 206*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 207*38fd1498Szrj cosh(long double __x) 208*38fd1498Szrj { return __builtin_coshl(__x); } 209*38fd1498Szrj#endif 210*38fd1498Szrj 211*38fd1498Szrj template<typename _Tp> 212*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 213*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 214*38fd1498Szrj double>::__type 215*38fd1498Szrj cosh(_Tp __x) 216*38fd1498Szrj { return __builtin_cosh(__x); } 217*38fd1498Szrj 218*38fd1498Szrj using ::exp; 219*38fd1498Szrj 220*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 221*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 222*38fd1498Szrj exp(float __x) 223*38fd1498Szrj { return __builtin_expf(__x); } 224*38fd1498Szrj 225*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 226*38fd1498Szrj exp(long double __x) 227*38fd1498Szrj { return __builtin_expl(__x); } 228*38fd1498Szrj#endif 229*38fd1498Szrj 230*38fd1498Szrj template<typename _Tp> 231*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 232*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 233*38fd1498Szrj double>::__type 234*38fd1498Szrj exp(_Tp __x) 235*38fd1498Szrj { return __builtin_exp(__x); } 236*38fd1498Szrj 237*38fd1498Szrj using ::fabs; 238*38fd1498Szrj 239*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 240*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 241*38fd1498Szrj fabs(float __x) 242*38fd1498Szrj { return __builtin_fabsf(__x); } 243*38fd1498Szrj 244*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 245*38fd1498Szrj fabs(long double __x) 246*38fd1498Szrj { return __builtin_fabsl(__x); } 247*38fd1498Szrj#endif 248*38fd1498Szrj 249*38fd1498Szrj template<typename _Tp> 250*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 251*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 252*38fd1498Szrj double>::__type 253*38fd1498Szrj fabs(_Tp __x) 254*38fd1498Szrj { return __builtin_fabs(__x); } 255*38fd1498Szrj 256*38fd1498Szrj using ::floor; 257*38fd1498Szrj 258*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 259*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 260*38fd1498Szrj floor(float __x) 261*38fd1498Szrj { return __builtin_floorf(__x); } 262*38fd1498Szrj 263*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 264*38fd1498Szrj floor(long double __x) 265*38fd1498Szrj { return __builtin_floorl(__x); } 266*38fd1498Szrj#endif 267*38fd1498Szrj 268*38fd1498Szrj template<typename _Tp> 269*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 270*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 271*38fd1498Szrj double>::__type 272*38fd1498Szrj floor(_Tp __x) 273*38fd1498Szrj { return __builtin_floor(__x); } 274*38fd1498Szrj 275*38fd1498Szrj using ::fmod; 276*38fd1498Szrj 277*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 278*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 279*38fd1498Szrj fmod(float __x, float __y) 280*38fd1498Szrj { return __builtin_fmodf(__x, __y); } 281*38fd1498Szrj 282*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 283*38fd1498Szrj fmod(long double __x, long double __y) 284*38fd1498Szrj { return __builtin_fmodl(__x, __y); } 285*38fd1498Szrj#endif 286*38fd1498Szrj 287*38fd1498Szrj template<typename _Tp, typename _Up> 288*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 289*38fd1498Szrj typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 290*38fd1498Szrj fmod(_Tp __x, _Up __y) 291*38fd1498Szrj { 292*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 293*38fd1498Szrj return fmod(__type(__x), __type(__y)); 294*38fd1498Szrj } 295*38fd1498Szrj 296*38fd1498Szrj using ::frexp; 297*38fd1498Szrj 298*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 299*38fd1498Szrj inline float 300*38fd1498Szrj frexp(float __x, int* __exp) 301*38fd1498Szrj { return __builtin_frexpf(__x, __exp); } 302*38fd1498Szrj 303*38fd1498Szrj inline long double 304*38fd1498Szrj frexp(long double __x, int* __exp) 305*38fd1498Szrj { return __builtin_frexpl(__x, __exp); } 306*38fd1498Szrj#endif 307*38fd1498Szrj 308*38fd1498Szrj template<typename _Tp> 309*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 310*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 311*38fd1498Szrj double>::__type 312*38fd1498Szrj frexp(_Tp __x, int* __exp) 313*38fd1498Szrj { return __builtin_frexp(__x, __exp); } 314*38fd1498Szrj 315*38fd1498Szrj using ::ldexp; 316*38fd1498Szrj 317*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 318*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 319*38fd1498Szrj ldexp(float __x, int __exp) 320*38fd1498Szrj { return __builtin_ldexpf(__x, __exp); } 321*38fd1498Szrj 322*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 323*38fd1498Szrj ldexp(long double __x, int __exp) 324*38fd1498Szrj { return __builtin_ldexpl(__x, __exp); } 325*38fd1498Szrj#endif 326*38fd1498Szrj 327*38fd1498Szrj template<typename _Tp> 328*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 329*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 330*38fd1498Szrj double>::__type 331*38fd1498Szrj ldexp(_Tp __x, int __exp) 332*38fd1498Szrj { return __builtin_ldexp(__x, __exp); } 333*38fd1498Szrj 334*38fd1498Szrj using ::log; 335*38fd1498Szrj 336*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 337*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 338*38fd1498Szrj log(float __x) 339*38fd1498Szrj { return __builtin_logf(__x); } 340*38fd1498Szrj 341*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 342*38fd1498Szrj log(long double __x) 343*38fd1498Szrj { return __builtin_logl(__x); } 344*38fd1498Szrj#endif 345*38fd1498Szrj 346*38fd1498Szrj template<typename _Tp> 347*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 348*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 349*38fd1498Szrj double>::__type 350*38fd1498Szrj log(_Tp __x) 351*38fd1498Szrj { return __builtin_log(__x); } 352*38fd1498Szrj 353*38fd1498Szrj using ::log10; 354*38fd1498Szrj 355*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 356*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 357*38fd1498Szrj log10(float __x) 358*38fd1498Szrj { return __builtin_log10f(__x); } 359*38fd1498Szrj 360*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 361*38fd1498Szrj log10(long double __x) 362*38fd1498Szrj { return __builtin_log10l(__x); } 363*38fd1498Szrj#endif 364*38fd1498Szrj 365*38fd1498Szrj template<typename _Tp> 366*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 367*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 368*38fd1498Szrj double>::__type 369*38fd1498Szrj log10(_Tp __x) 370*38fd1498Szrj { return __builtin_log10(__x); } 371*38fd1498Szrj 372*38fd1498Szrj using ::modf; 373*38fd1498Szrj 374*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 375*38fd1498Szrj inline float 376*38fd1498Szrj modf(float __x, float* __iptr) 377*38fd1498Szrj { return __builtin_modff(__x, __iptr); } 378*38fd1498Szrj 379*38fd1498Szrj inline long double 380*38fd1498Szrj modf(long double __x, long double* __iptr) 381*38fd1498Szrj { return __builtin_modfl(__x, __iptr); } 382*38fd1498Szrj#endif 383*38fd1498Szrj 384*38fd1498Szrj using ::pow; 385*38fd1498Szrj 386*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 387*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 388*38fd1498Szrj pow(float __x, float __y) 389*38fd1498Szrj { return __builtin_powf(__x, __y); } 390*38fd1498Szrj 391*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 392*38fd1498Szrj pow(long double __x, long double __y) 393*38fd1498Szrj { return __builtin_powl(__x, __y); } 394*38fd1498Szrj 395*38fd1498Szrj#if __cplusplus < 201103L 396*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 397*38fd1498Szrj // DR 550. What should the return type of pow(float,int) be? 398*38fd1498Szrj inline double 399*38fd1498Szrj pow(double __x, int __i) 400*38fd1498Szrj { return __builtin_powi(__x, __i); } 401*38fd1498Szrj 402*38fd1498Szrj inline float 403*38fd1498Szrj pow(float __x, int __n) 404*38fd1498Szrj { return __builtin_powif(__x, __n); } 405*38fd1498Szrj 406*38fd1498Szrj inline long double 407*38fd1498Szrj pow(long double __x, int __n) 408*38fd1498Szrj { return __builtin_powil(__x, __n); } 409*38fd1498Szrj#endif 410*38fd1498Szrj#endif 411*38fd1498Szrj 412*38fd1498Szrj template<typename _Tp, typename _Up> 413*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 414*38fd1498Szrj typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 415*38fd1498Szrj pow(_Tp __x, _Up __y) 416*38fd1498Szrj { 417*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 418*38fd1498Szrj return pow(__type(__x), __type(__y)); 419*38fd1498Szrj } 420*38fd1498Szrj 421*38fd1498Szrj using ::sin; 422*38fd1498Szrj 423*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 424*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 425*38fd1498Szrj sin(float __x) 426*38fd1498Szrj { return __builtin_sinf(__x); } 427*38fd1498Szrj 428*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 429*38fd1498Szrj sin(long double __x) 430*38fd1498Szrj { return __builtin_sinl(__x); } 431*38fd1498Szrj#endif 432*38fd1498Szrj 433*38fd1498Szrj template<typename _Tp> 434*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 435*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 436*38fd1498Szrj double>::__type 437*38fd1498Szrj sin(_Tp __x) 438*38fd1498Szrj { return __builtin_sin(__x); } 439*38fd1498Szrj 440*38fd1498Szrj using ::sinh; 441*38fd1498Szrj 442*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 443*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 444*38fd1498Szrj sinh(float __x) 445*38fd1498Szrj { return __builtin_sinhf(__x); } 446*38fd1498Szrj 447*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 448*38fd1498Szrj sinh(long double __x) 449*38fd1498Szrj { return __builtin_sinhl(__x); } 450*38fd1498Szrj#endif 451*38fd1498Szrj 452*38fd1498Szrj template<typename _Tp> 453*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 454*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 455*38fd1498Szrj double>::__type 456*38fd1498Szrj sinh(_Tp __x) 457*38fd1498Szrj { return __builtin_sinh(__x); } 458*38fd1498Szrj 459*38fd1498Szrj using ::sqrt; 460*38fd1498Szrj 461*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 462*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 463*38fd1498Szrj sqrt(float __x) 464*38fd1498Szrj { return __builtin_sqrtf(__x); } 465*38fd1498Szrj 466*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 467*38fd1498Szrj sqrt(long double __x) 468*38fd1498Szrj { return __builtin_sqrtl(__x); } 469*38fd1498Szrj#endif 470*38fd1498Szrj 471*38fd1498Szrj template<typename _Tp> 472*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 473*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 474*38fd1498Szrj double>::__type 475*38fd1498Szrj sqrt(_Tp __x) 476*38fd1498Szrj { return __builtin_sqrt(__x); } 477*38fd1498Szrj 478*38fd1498Szrj using ::tan; 479*38fd1498Szrj 480*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 481*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 482*38fd1498Szrj tan(float __x) 483*38fd1498Szrj { return __builtin_tanf(__x); } 484*38fd1498Szrj 485*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 486*38fd1498Szrj tan(long double __x) 487*38fd1498Szrj { return __builtin_tanl(__x); } 488*38fd1498Szrj#endif 489*38fd1498Szrj 490*38fd1498Szrj template<typename _Tp> 491*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 492*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 493*38fd1498Szrj double>::__type 494*38fd1498Szrj tan(_Tp __x) 495*38fd1498Szrj { return __builtin_tan(__x); } 496*38fd1498Szrj 497*38fd1498Szrj using ::tanh; 498*38fd1498Szrj 499*38fd1498Szrj#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 500*38fd1498Szrj inline _GLIBCXX_CONSTEXPR float 501*38fd1498Szrj tanh(float __x) 502*38fd1498Szrj { return __builtin_tanhf(__x); } 503*38fd1498Szrj 504*38fd1498Szrj inline _GLIBCXX_CONSTEXPR long double 505*38fd1498Szrj tanh(long double __x) 506*38fd1498Szrj { return __builtin_tanhl(__x); } 507*38fd1498Szrj#endif 508*38fd1498Szrj 509*38fd1498Szrj template<typename _Tp> 510*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 511*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 512*38fd1498Szrj double>::__type 513*38fd1498Szrj tanh(_Tp __x) 514*38fd1498Szrj { return __builtin_tanh(__x); } 515*38fd1498Szrj 516*38fd1498Szrj#if _GLIBCXX_USE_C99_MATH 517*38fd1498Szrj#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC 518*38fd1498Szrj 519*38fd1498Szrj// These are possible macros imported from C99-land. 520*38fd1498Szrj#undef fpclassify 521*38fd1498Szrj#undef isfinite 522*38fd1498Szrj#undef isinf 523*38fd1498Szrj#undef isnan 524*38fd1498Szrj#undef isnormal 525*38fd1498Szrj#undef signbit 526*38fd1498Szrj#undef isgreater 527*38fd1498Szrj#undef isgreaterequal 528*38fd1498Szrj#undef isless 529*38fd1498Szrj#undef islessequal 530*38fd1498Szrj#undef islessgreater 531*38fd1498Szrj#undef isunordered 532*38fd1498Szrj 533*38fd1498Szrj#if __cplusplus >= 201103L 534*38fd1498Szrj 535*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 536*38fd1498Szrj constexpr int 537*38fd1498Szrj fpclassify(float __x) 538*38fd1498Szrj { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 539*38fd1498Szrj FP_SUBNORMAL, FP_ZERO, __x); } 540*38fd1498Szrj 541*38fd1498Szrj constexpr int 542*38fd1498Szrj fpclassify(double __x) 543*38fd1498Szrj { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 544*38fd1498Szrj FP_SUBNORMAL, FP_ZERO, __x); } 545*38fd1498Szrj 546*38fd1498Szrj constexpr int 547*38fd1498Szrj fpclassify(long double __x) 548*38fd1498Szrj { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 549*38fd1498Szrj FP_SUBNORMAL, FP_ZERO, __x); } 550*38fd1498Szrj#endif 551*38fd1498Szrj 552*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 553*38fd1498Szrj template<typename _Tp> 554*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 555*38fd1498Szrj int>::__type 556*38fd1498Szrj fpclassify(_Tp __x) 557*38fd1498Szrj { return __x != 0 ? FP_NORMAL : FP_ZERO; } 558*38fd1498Szrj#endif 559*38fd1498Szrj 560*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 561*38fd1498Szrj constexpr bool 562*38fd1498Szrj isfinite(float __x) 563*38fd1498Szrj { return __builtin_isfinite(__x); } 564*38fd1498Szrj 565*38fd1498Szrj constexpr bool 566*38fd1498Szrj isfinite(double __x) 567*38fd1498Szrj { return __builtin_isfinite(__x); } 568*38fd1498Szrj 569*38fd1498Szrj constexpr bool 570*38fd1498Szrj isfinite(long double __x) 571*38fd1498Szrj { return __builtin_isfinite(__x); } 572*38fd1498Szrj#endif 573*38fd1498Szrj 574*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 575*38fd1498Szrj template<typename _Tp> 576*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 577*38fd1498Szrj bool>::__type 578*38fd1498Szrj isfinite(_Tp __x) 579*38fd1498Szrj { return true; } 580*38fd1498Szrj#endif 581*38fd1498Szrj 582*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 583*38fd1498Szrj constexpr bool 584*38fd1498Szrj isinf(float __x) 585*38fd1498Szrj { return __builtin_isinf(__x); } 586*38fd1498Szrj 587*38fd1498Szrj#if _GLIBCXX_HAVE_OBSOLETE_ISINF \ 588*38fd1498Szrj && !_GLIBCXX_NO_OBSOLETE_ISINF_ISNAN_DYNAMIC 589*38fd1498Szrj using ::isinf; 590*38fd1498Szrj#else 591*38fd1498Szrj constexpr bool 592*38fd1498Szrj isinf(double __x) 593*38fd1498Szrj { return __builtin_isinf(__x); } 594*38fd1498Szrj#endif 595*38fd1498Szrj 596*38fd1498Szrj constexpr bool 597*38fd1498Szrj isinf(long double __x) 598*38fd1498Szrj { return __builtin_isinf(__x); } 599*38fd1498Szrj#endif 600*38fd1498Szrj 601*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 602*38fd1498Szrj template<typename _Tp> 603*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 604*38fd1498Szrj bool>::__type 605*38fd1498Szrj isinf(_Tp __x) 606*38fd1498Szrj { return false; } 607*38fd1498Szrj#endif 608*38fd1498Szrj 609*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 610*38fd1498Szrj constexpr bool 611*38fd1498Szrj isnan(float __x) 612*38fd1498Szrj { return __builtin_isnan(__x); } 613*38fd1498Szrj 614*38fd1498Szrj#if _GLIBCXX_HAVE_OBSOLETE_ISNAN \ 615*38fd1498Szrj && !_GLIBCXX_NO_OBSOLETE_ISINF_ISNAN_DYNAMIC 616*38fd1498Szrj using ::isnan; 617*38fd1498Szrj#else 618*38fd1498Szrj constexpr bool 619*38fd1498Szrj isnan(double __x) 620*38fd1498Szrj { return __builtin_isnan(__x); } 621*38fd1498Szrj#endif 622*38fd1498Szrj 623*38fd1498Szrj constexpr bool 624*38fd1498Szrj isnan(long double __x) 625*38fd1498Szrj { return __builtin_isnan(__x); } 626*38fd1498Szrj#endif 627*38fd1498Szrj 628*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 629*38fd1498Szrj template<typename _Tp> 630*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 631*38fd1498Szrj bool>::__type 632*38fd1498Szrj isnan(_Tp __x) 633*38fd1498Szrj { return false; } 634*38fd1498Szrj#endif 635*38fd1498Szrj 636*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 637*38fd1498Szrj constexpr bool 638*38fd1498Szrj isnormal(float __x) 639*38fd1498Szrj { return __builtin_isnormal(__x); } 640*38fd1498Szrj 641*38fd1498Szrj constexpr bool 642*38fd1498Szrj isnormal(double __x) 643*38fd1498Szrj { return __builtin_isnormal(__x); } 644*38fd1498Szrj 645*38fd1498Szrj constexpr bool 646*38fd1498Szrj isnormal(long double __x) 647*38fd1498Szrj { return __builtin_isnormal(__x); } 648*38fd1498Szrj#endif 649*38fd1498Szrj 650*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 651*38fd1498Szrj template<typename _Tp> 652*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 653*38fd1498Szrj bool>::__type 654*38fd1498Szrj isnormal(_Tp __x) 655*38fd1498Szrj { return __x != 0 ? true : false; } 656*38fd1498Szrj#endif 657*38fd1498Szrj 658*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 659*38fd1498Szrj // Note: middle-end/36757 is fixed, __builtin_signbit is type-generic. 660*38fd1498Szrj constexpr bool 661*38fd1498Szrj signbit(float __x) 662*38fd1498Szrj { return __builtin_signbit(__x); } 663*38fd1498Szrj 664*38fd1498Szrj constexpr bool 665*38fd1498Szrj signbit(double __x) 666*38fd1498Szrj { return __builtin_signbit(__x); } 667*38fd1498Szrj 668*38fd1498Szrj constexpr bool 669*38fd1498Szrj signbit(long double __x) 670*38fd1498Szrj { return __builtin_signbit(__x); } 671*38fd1498Szrj#endif 672*38fd1498Szrj 673*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 674*38fd1498Szrj template<typename _Tp> 675*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 676*38fd1498Szrj bool>::__type 677*38fd1498Szrj signbit(_Tp __x) 678*38fd1498Szrj { return __x < 0 ? true : false; } 679*38fd1498Szrj#endif 680*38fd1498Szrj 681*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 682*38fd1498Szrj constexpr bool 683*38fd1498Szrj isgreater(float __x, float __y) 684*38fd1498Szrj { return __builtin_isgreater(__x, __y); } 685*38fd1498Szrj 686*38fd1498Szrj constexpr bool 687*38fd1498Szrj isgreater(double __x, double __y) 688*38fd1498Szrj { return __builtin_isgreater(__x, __y); } 689*38fd1498Szrj 690*38fd1498Szrj constexpr bool 691*38fd1498Szrj isgreater(long double __x, long double __y) 692*38fd1498Szrj { return __builtin_isgreater(__x, __y); } 693*38fd1498Szrj#endif 694*38fd1498Szrj 695*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 696*38fd1498Szrj template<typename _Tp, typename _Up> 697*38fd1498Szrj constexpr typename 698*38fd1498Szrj __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 699*38fd1498Szrj && __is_arithmetic<_Up>::__value), bool>::__type 700*38fd1498Szrj isgreater(_Tp __x, _Up __y) 701*38fd1498Szrj { 702*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 703*38fd1498Szrj return __builtin_isgreater(__type(__x), __type(__y)); 704*38fd1498Szrj } 705*38fd1498Szrj#endif 706*38fd1498Szrj 707*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 708*38fd1498Szrj constexpr bool 709*38fd1498Szrj isgreaterequal(float __x, float __y) 710*38fd1498Szrj { return __builtin_isgreaterequal(__x, __y); } 711*38fd1498Szrj 712*38fd1498Szrj constexpr bool 713*38fd1498Szrj isgreaterequal(double __x, double __y) 714*38fd1498Szrj { return __builtin_isgreaterequal(__x, __y); } 715*38fd1498Szrj 716*38fd1498Szrj constexpr bool 717*38fd1498Szrj isgreaterequal(long double __x, long double __y) 718*38fd1498Szrj { return __builtin_isgreaterequal(__x, __y); } 719*38fd1498Szrj#endif 720*38fd1498Szrj 721*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 722*38fd1498Szrj template<typename _Tp, typename _Up> 723*38fd1498Szrj constexpr typename 724*38fd1498Szrj __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 725*38fd1498Szrj && __is_arithmetic<_Up>::__value), bool>::__type 726*38fd1498Szrj isgreaterequal(_Tp __x, _Up __y) 727*38fd1498Szrj { 728*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 729*38fd1498Szrj return __builtin_isgreaterequal(__type(__x), __type(__y)); 730*38fd1498Szrj } 731*38fd1498Szrj#endif 732*38fd1498Szrj 733*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 734*38fd1498Szrj constexpr bool 735*38fd1498Szrj isless(float __x, float __y) 736*38fd1498Szrj { return __builtin_isless(__x, __y); } 737*38fd1498Szrj 738*38fd1498Szrj constexpr bool 739*38fd1498Szrj isless(double __x, double __y) 740*38fd1498Szrj { return __builtin_isless(__x, __y); } 741*38fd1498Szrj 742*38fd1498Szrj constexpr bool 743*38fd1498Szrj isless(long double __x, long double __y) 744*38fd1498Szrj { return __builtin_isless(__x, __y); } 745*38fd1498Szrj#endif 746*38fd1498Szrj 747*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 748*38fd1498Szrj template<typename _Tp, typename _Up> 749*38fd1498Szrj constexpr typename 750*38fd1498Szrj __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 751*38fd1498Szrj && __is_arithmetic<_Up>::__value), bool>::__type 752*38fd1498Szrj isless(_Tp __x, _Up __y) 753*38fd1498Szrj { 754*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 755*38fd1498Szrj return __builtin_isless(__type(__x), __type(__y)); 756*38fd1498Szrj } 757*38fd1498Szrj#endif 758*38fd1498Szrj 759*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 760*38fd1498Szrj constexpr bool 761*38fd1498Szrj islessequal(float __x, float __y) 762*38fd1498Szrj { return __builtin_islessequal(__x, __y); } 763*38fd1498Szrj 764*38fd1498Szrj constexpr bool 765*38fd1498Szrj islessequal(double __x, double __y) 766*38fd1498Szrj { return __builtin_islessequal(__x, __y); } 767*38fd1498Szrj 768*38fd1498Szrj constexpr bool 769*38fd1498Szrj islessequal(long double __x, long double __y) 770*38fd1498Szrj { return __builtin_islessequal(__x, __y); } 771*38fd1498Szrj#endif 772*38fd1498Szrj 773*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 774*38fd1498Szrj template<typename _Tp, typename _Up> 775*38fd1498Szrj constexpr typename 776*38fd1498Szrj __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 777*38fd1498Szrj && __is_arithmetic<_Up>::__value), bool>::__type 778*38fd1498Szrj islessequal(_Tp __x, _Up __y) 779*38fd1498Szrj { 780*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 781*38fd1498Szrj return __builtin_islessequal(__type(__x), __type(__y)); 782*38fd1498Szrj } 783*38fd1498Szrj#endif 784*38fd1498Szrj 785*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 786*38fd1498Szrj constexpr bool 787*38fd1498Szrj islessgreater(float __x, float __y) 788*38fd1498Szrj { return __builtin_islessgreater(__x, __y); } 789*38fd1498Szrj 790*38fd1498Szrj constexpr bool 791*38fd1498Szrj islessgreater(double __x, double __y) 792*38fd1498Szrj { return __builtin_islessgreater(__x, __y); } 793*38fd1498Szrj 794*38fd1498Szrj constexpr bool 795*38fd1498Szrj islessgreater(long double __x, long double __y) 796*38fd1498Szrj { return __builtin_islessgreater(__x, __y); } 797*38fd1498Szrj#endif 798*38fd1498Szrj 799*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 800*38fd1498Szrj template<typename _Tp, typename _Up> 801*38fd1498Szrj constexpr typename 802*38fd1498Szrj __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 803*38fd1498Szrj && __is_arithmetic<_Up>::__value), bool>::__type 804*38fd1498Szrj islessgreater(_Tp __x, _Up __y) 805*38fd1498Szrj { 806*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 807*38fd1498Szrj return __builtin_islessgreater(__type(__x), __type(__y)); 808*38fd1498Szrj } 809*38fd1498Szrj#endif 810*38fd1498Szrj 811*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 812*38fd1498Szrj constexpr bool 813*38fd1498Szrj isunordered(float __x, float __y) 814*38fd1498Szrj { return __builtin_isunordered(__x, __y); } 815*38fd1498Szrj 816*38fd1498Szrj constexpr bool 817*38fd1498Szrj isunordered(double __x, double __y) 818*38fd1498Szrj { return __builtin_isunordered(__x, __y); } 819*38fd1498Szrj 820*38fd1498Szrj constexpr bool 821*38fd1498Szrj isunordered(long double __x, long double __y) 822*38fd1498Szrj { return __builtin_isunordered(__x, __y); } 823*38fd1498Szrj#endif 824*38fd1498Szrj 825*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 826*38fd1498Szrj template<typename _Tp, typename _Up> 827*38fd1498Szrj constexpr typename 828*38fd1498Szrj __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 829*38fd1498Szrj && __is_arithmetic<_Up>::__value), bool>::__type 830*38fd1498Szrj isunordered(_Tp __x, _Up __y) 831*38fd1498Szrj { 832*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 833*38fd1498Szrj return __builtin_isunordered(__type(__x), __type(__y)); 834*38fd1498Szrj } 835*38fd1498Szrj#endif 836*38fd1498Szrj 837*38fd1498Szrj#else 838*38fd1498Szrj 839*38fd1498Szrj template<typename _Tp> 840*38fd1498Szrj inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 841*38fd1498Szrj int>::__type 842*38fd1498Szrj fpclassify(_Tp __f) 843*38fd1498Szrj { 844*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 845*38fd1498Szrj return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 846*38fd1498Szrj FP_SUBNORMAL, FP_ZERO, __type(__f)); 847*38fd1498Szrj } 848*38fd1498Szrj 849*38fd1498Szrj template<typename _Tp> 850*38fd1498Szrj inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 851*38fd1498Szrj int>::__type 852*38fd1498Szrj isfinite(_Tp __f) 853*38fd1498Szrj { 854*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 855*38fd1498Szrj return __builtin_isfinite(__type(__f)); 856*38fd1498Szrj } 857*38fd1498Szrj 858*38fd1498Szrj template<typename _Tp> 859*38fd1498Szrj inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 860*38fd1498Szrj int>::__type 861*38fd1498Szrj isinf(_Tp __f) 862*38fd1498Szrj { 863*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 864*38fd1498Szrj return __builtin_isinf(__type(__f)); 865*38fd1498Szrj } 866*38fd1498Szrj 867*38fd1498Szrj template<typename _Tp> 868*38fd1498Szrj inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 869*38fd1498Szrj int>::__type 870*38fd1498Szrj isnan(_Tp __f) 871*38fd1498Szrj { 872*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 873*38fd1498Szrj return __builtin_isnan(__type(__f)); 874*38fd1498Szrj } 875*38fd1498Szrj 876*38fd1498Szrj template<typename _Tp> 877*38fd1498Szrj inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 878*38fd1498Szrj int>::__type 879*38fd1498Szrj isnormal(_Tp __f) 880*38fd1498Szrj { 881*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 882*38fd1498Szrj return __builtin_isnormal(__type(__f)); 883*38fd1498Szrj } 884*38fd1498Szrj 885*38fd1498Szrj template<typename _Tp> 886*38fd1498Szrj inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 887*38fd1498Szrj int>::__type 888*38fd1498Szrj signbit(_Tp __f) 889*38fd1498Szrj { 890*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 891*38fd1498Szrj return __builtin_signbit(__type(__f)); 892*38fd1498Szrj } 893*38fd1498Szrj 894*38fd1498Szrj template<typename _Tp> 895*38fd1498Szrj inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 896*38fd1498Szrj int>::__type 897*38fd1498Szrj isgreater(_Tp __f1, _Tp __f2) 898*38fd1498Szrj { 899*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 900*38fd1498Szrj return __builtin_isgreater(__type(__f1), __type(__f2)); 901*38fd1498Szrj } 902*38fd1498Szrj 903*38fd1498Szrj template<typename _Tp> 904*38fd1498Szrj inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 905*38fd1498Szrj int>::__type 906*38fd1498Szrj isgreaterequal(_Tp __f1, _Tp __f2) 907*38fd1498Szrj { 908*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 909*38fd1498Szrj return __builtin_isgreaterequal(__type(__f1), __type(__f2)); 910*38fd1498Szrj } 911*38fd1498Szrj 912*38fd1498Szrj template<typename _Tp> 913*38fd1498Szrj inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 914*38fd1498Szrj int>::__type 915*38fd1498Szrj isless(_Tp __f1, _Tp __f2) 916*38fd1498Szrj { 917*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 918*38fd1498Szrj return __builtin_isless(__type(__f1), __type(__f2)); 919*38fd1498Szrj } 920*38fd1498Szrj 921*38fd1498Szrj template<typename _Tp> 922*38fd1498Szrj inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 923*38fd1498Szrj int>::__type 924*38fd1498Szrj islessequal(_Tp __f1, _Tp __f2) 925*38fd1498Szrj { 926*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 927*38fd1498Szrj return __builtin_islessequal(__type(__f1), __type(__f2)); 928*38fd1498Szrj } 929*38fd1498Szrj 930*38fd1498Szrj template<typename _Tp> 931*38fd1498Szrj inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 932*38fd1498Szrj int>::__type 933*38fd1498Szrj islessgreater(_Tp __f1, _Tp __f2) 934*38fd1498Szrj { 935*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 936*38fd1498Szrj return __builtin_islessgreater(__type(__f1), __type(__f2)); 937*38fd1498Szrj } 938*38fd1498Szrj 939*38fd1498Szrj template<typename _Tp> 940*38fd1498Szrj inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 941*38fd1498Szrj int>::__type 942*38fd1498Szrj isunordered(_Tp __f1, _Tp __f2) 943*38fd1498Szrj { 944*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 945*38fd1498Szrj return __builtin_isunordered(__type(__f1), __type(__f2)); 946*38fd1498Szrj } 947*38fd1498Szrj 948*38fd1498Szrj#endif // C++11 949*38fd1498Szrj#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */ 950*38fd1498Szrj#endif /* _GLIBCXX_USE_C99_MATH */ 951*38fd1498Szrj 952*38fd1498Szrj#if __cplusplus >= 201103L 953*38fd1498Szrj 954*38fd1498Szrj#ifdef _GLIBCXX_USE_C99_MATH_TR1 955*38fd1498Szrj 956*38fd1498Szrj#undef acosh 957*38fd1498Szrj#undef acoshf 958*38fd1498Szrj#undef acoshl 959*38fd1498Szrj#undef asinh 960*38fd1498Szrj#undef asinhf 961*38fd1498Szrj#undef asinhl 962*38fd1498Szrj#undef atanh 963*38fd1498Szrj#undef atanhf 964*38fd1498Szrj#undef atanhl 965*38fd1498Szrj#undef cbrt 966*38fd1498Szrj#undef cbrtf 967*38fd1498Szrj#undef cbrtl 968*38fd1498Szrj#undef copysign 969*38fd1498Szrj#undef copysignf 970*38fd1498Szrj#undef copysignl 971*38fd1498Szrj#undef erf 972*38fd1498Szrj#undef erff 973*38fd1498Szrj#undef erfl 974*38fd1498Szrj#undef erfc 975*38fd1498Szrj#undef erfcf 976*38fd1498Szrj#undef erfcl 977*38fd1498Szrj#undef exp2 978*38fd1498Szrj#undef exp2f 979*38fd1498Szrj#undef exp2l 980*38fd1498Szrj#undef expm1 981*38fd1498Szrj#undef expm1f 982*38fd1498Szrj#undef expm1l 983*38fd1498Szrj#undef fdim 984*38fd1498Szrj#undef fdimf 985*38fd1498Szrj#undef fdiml 986*38fd1498Szrj#undef fma 987*38fd1498Szrj#undef fmaf 988*38fd1498Szrj#undef fmal 989*38fd1498Szrj#undef fmax 990*38fd1498Szrj#undef fmaxf 991*38fd1498Szrj#undef fmaxl 992*38fd1498Szrj#undef fmin 993*38fd1498Szrj#undef fminf 994*38fd1498Szrj#undef fminl 995*38fd1498Szrj#undef hypot 996*38fd1498Szrj#undef hypotf 997*38fd1498Szrj#undef hypotl 998*38fd1498Szrj#undef ilogb 999*38fd1498Szrj#undef ilogbf 1000*38fd1498Szrj#undef ilogbl 1001*38fd1498Szrj#undef lgamma 1002*38fd1498Szrj#undef lgammaf 1003*38fd1498Szrj#undef lgammal 1004*38fd1498Szrj#ifndef _GLIBCXX_NO_C99_ROUNDING_FUNCS 1005*38fd1498Szrj#undef llrint 1006*38fd1498Szrj#undef llrintf 1007*38fd1498Szrj#undef llrintl 1008*38fd1498Szrj#undef llround 1009*38fd1498Szrj#undef llroundf 1010*38fd1498Szrj#undef llroundl 1011*38fd1498Szrj#endif 1012*38fd1498Szrj#undef log1p 1013*38fd1498Szrj#undef log1pf 1014*38fd1498Szrj#undef log1pl 1015*38fd1498Szrj#undef log2 1016*38fd1498Szrj#undef log2f 1017*38fd1498Szrj#undef log2l 1018*38fd1498Szrj#undef logb 1019*38fd1498Szrj#undef logbf 1020*38fd1498Szrj#undef logbl 1021*38fd1498Szrj#undef lrint 1022*38fd1498Szrj#undef lrintf 1023*38fd1498Szrj#undef lrintl 1024*38fd1498Szrj#undef lround 1025*38fd1498Szrj#undef lroundf 1026*38fd1498Szrj#undef lroundl 1027*38fd1498Szrj#undef nan 1028*38fd1498Szrj#undef nanf 1029*38fd1498Szrj#undef nanl 1030*38fd1498Szrj#undef nearbyint 1031*38fd1498Szrj#undef nearbyintf 1032*38fd1498Szrj#undef nearbyintl 1033*38fd1498Szrj#undef nextafter 1034*38fd1498Szrj#undef nextafterf 1035*38fd1498Szrj#undef nextafterl 1036*38fd1498Szrj#undef nexttoward 1037*38fd1498Szrj#undef nexttowardf 1038*38fd1498Szrj#undef nexttowardl 1039*38fd1498Szrj#undef remainder 1040*38fd1498Szrj#undef remainderf 1041*38fd1498Szrj#undef remainderl 1042*38fd1498Szrj#undef remquo 1043*38fd1498Szrj#undef remquof 1044*38fd1498Szrj#undef remquol 1045*38fd1498Szrj#undef rint 1046*38fd1498Szrj#undef rintf 1047*38fd1498Szrj#undef rintl 1048*38fd1498Szrj#undef round 1049*38fd1498Szrj#undef roundf 1050*38fd1498Szrj#undef roundl 1051*38fd1498Szrj#undef scalbln 1052*38fd1498Szrj#undef scalblnf 1053*38fd1498Szrj#undef scalblnl 1054*38fd1498Szrj#undef scalbn 1055*38fd1498Szrj#undef scalbnf 1056*38fd1498Szrj#undef scalbnl 1057*38fd1498Szrj#undef tgamma 1058*38fd1498Szrj#undef tgammaf 1059*38fd1498Szrj#undef tgammal 1060*38fd1498Szrj#undef trunc 1061*38fd1498Szrj#undef truncf 1062*38fd1498Szrj#undef truncl 1063*38fd1498Szrj 1064*38fd1498Szrj // types 1065*38fd1498Szrj using ::double_t; 1066*38fd1498Szrj using ::float_t; 1067*38fd1498Szrj 1068*38fd1498Szrj // functions 1069*38fd1498Szrj using ::acosh; 1070*38fd1498Szrj using ::acoshf; 1071*38fd1498Szrj using ::acoshl; 1072*38fd1498Szrj 1073*38fd1498Szrj using ::asinh; 1074*38fd1498Szrj using ::asinhf; 1075*38fd1498Szrj using ::asinhl; 1076*38fd1498Szrj 1077*38fd1498Szrj using ::atanh; 1078*38fd1498Szrj using ::atanhf; 1079*38fd1498Szrj using ::atanhl; 1080*38fd1498Szrj 1081*38fd1498Szrj using ::cbrt; 1082*38fd1498Szrj using ::cbrtf; 1083*38fd1498Szrj using ::cbrtl; 1084*38fd1498Szrj 1085*38fd1498Szrj using ::copysign; 1086*38fd1498Szrj using ::copysignf; 1087*38fd1498Szrj using ::copysignl; 1088*38fd1498Szrj 1089*38fd1498Szrj using ::erf; 1090*38fd1498Szrj using ::erff; 1091*38fd1498Szrj using ::erfl; 1092*38fd1498Szrj 1093*38fd1498Szrj using ::erfc; 1094*38fd1498Szrj using ::erfcf; 1095*38fd1498Szrj using ::erfcl; 1096*38fd1498Szrj 1097*38fd1498Szrj using ::exp2; 1098*38fd1498Szrj using ::exp2f; 1099*38fd1498Szrj using ::exp2l; 1100*38fd1498Szrj 1101*38fd1498Szrj using ::expm1; 1102*38fd1498Szrj using ::expm1f; 1103*38fd1498Szrj using ::expm1l; 1104*38fd1498Szrj 1105*38fd1498Szrj using ::fdim; 1106*38fd1498Szrj using ::fdimf; 1107*38fd1498Szrj using ::fdiml; 1108*38fd1498Szrj 1109*38fd1498Szrj using ::fma; 1110*38fd1498Szrj using ::fmaf; 1111*38fd1498Szrj using ::fmal; 1112*38fd1498Szrj 1113*38fd1498Szrj using ::fmax; 1114*38fd1498Szrj using ::fmaxf; 1115*38fd1498Szrj using ::fmaxl; 1116*38fd1498Szrj 1117*38fd1498Szrj using ::fmin; 1118*38fd1498Szrj using ::fminf; 1119*38fd1498Szrj using ::fminl; 1120*38fd1498Szrj 1121*38fd1498Szrj using ::hypot; 1122*38fd1498Szrj using ::hypotf; 1123*38fd1498Szrj using ::hypotl; 1124*38fd1498Szrj 1125*38fd1498Szrj using ::ilogb; 1126*38fd1498Szrj using ::ilogbf; 1127*38fd1498Szrj using ::ilogbl; 1128*38fd1498Szrj 1129*38fd1498Szrj using ::lgamma; 1130*38fd1498Szrj using ::lgammaf; 1131*38fd1498Szrj using ::lgammal; 1132*38fd1498Szrj 1133*38fd1498Szrj#ifndef _GLIBCXX_NO_C99_ROUNDING_FUNCS 1134*38fd1498Szrj using ::llrint; 1135*38fd1498Szrj using ::llrintf; 1136*38fd1498Szrj using ::llrintl; 1137*38fd1498Szrj 1138*38fd1498Szrj using ::llround; 1139*38fd1498Szrj using ::llroundf; 1140*38fd1498Szrj using ::llroundl; 1141*38fd1498Szrj#endif 1142*38fd1498Szrj 1143*38fd1498Szrj using ::log1p; 1144*38fd1498Szrj using ::log1pf; 1145*38fd1498Szrj using ::log1pl; 1146*38fd1498Szrj 1147*38fd1498Szrj using ::log2; 1148*38fd1498Szrj using ::log2f; 1149*38fd1498Szrj using ::log2l; 1150*38fd1498Szrj 1151*38fd1498Szrj using ::logb; 1152*38fd1498Szrj using ::logbf; 1153*38fd1498Szrj using ::logbl; 1154*38fd1498Szrj 1155*38fd1498Szrj using ::lrint; 1156*38fd1498Szrj using ::lrintf; 1157*38fd1498Szrj using ::lrintl; 1158*38fd1498Szrj 1159*38fd1498Szrj using ::lround; 1160*38fd1498Szrj using ::lroundf; 1161*38fd1498Szrj using ::lroundl; 1162*38fd1498Szrj 1163*38fd1498Szrj using ::nan; 1164*38fd1498Szrj using ::nanf; 1165*38fd1498Szrj using ::nanl; 1166*38fd1498Szrj 1167*38fd1498Szrj using ::nearbyint; 1168*38fd1498Szrj using ::nearbyintf; 1169*38fd1498Szrj using ::nearbyintl; 1170*38fd1498Szrj 1171*38fd1498Szrj using ::nextafter; 1172*38fd1498Szrj using ::nextafterf; 1173*38fd1498Szrj using ::nextafterl; 1174*38fd1498Szrj 1175*38fd1498Szrj using ::nexttoward; 1176*38fd1498Szrj using ::nexttowardf; 1177*38fd1498Szrj using ::nexttowardl; 1178*38fd1498Szrj 1179*38fd1498Szrj using ::remainder; 1180*38fd1498Szrj using ::remainderf; 1181*38fd1498Szrj using ::remainderl; 1182*38fd1498Szrj 1183*38fd1498Szrj using ::remquo; 1184*38fd1498Szrj using ::remquof; 1185*38fd1498Szrj using ::remquol; 1186*38fd1498Szrj 1187*38fd1498Szrj using ::rint; 1188*38fd1498Szrj using ::rintf; 1189*38fd1498Szrj using ::rintl; 1190*38fd1498Szrj 1191*38fd1498Szrj using ::round; 1192*38fd1498Szrj using ::roundf; 1193*38fd1498Szrj using ::roundl; 1194*38fd1498Szrj 1195*38fd1498Szrj using ::scalbln; 1196*38fd1498Szrj using ::scalblnf; 1197*38fd1498Szrj using ::scalblnl; 1198*38fd1498Szrj 1199*38fd1498Szrj using ::scalbn; 1200*38fd1498Szrj using ::scalbnf; 1201*38fd1498Szrj using ::scalbnl; 1202*38fd1498Szrj 1203*38fd1498Szrj using ::tgamma; 1204*38fd1498Szrj using ::tgammaf; 1205*38fd1498Szrj using ::tgammal; 1206*38fd1498Szrj 1207*38fd1498Szrj using ::trunc; 1208*38fd1498Szrj using ::truncf; 1209*38fd1498Szrj using ::truncl; 1210*38fd1498Szrj 1211*38fd1498Szrj /// Additional overloads. 1212*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1213*38fd1498Szrj constexpr float 1214*38fd1498Szrj acosh(float __x) 1215*38fd1498Szrj { return __builtin_acoshf(__x); } 1216*38fd1498Szrj 1217*38fd1498Szrj constexpr long double 1218*38fd1498Szrj acosh(long double __x) 1219*38fd1498Szrj { return __builtin_acoshl(__x); } 1220*38fd1498Szrj#endif 1221*38fd1498Szrj 1222*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1223*38fd1498Szrj template<typename _Tp> 1224*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1225*38fd1498Szrj double>::__type 1226*38fd1498Szrj acosh(_Tp __x) 1227*38fd1498Szrj { return __builtin_acosh(__x); } 1228*38fd1498Szrj#endif 1229*38fd1498Szrj 1230*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1231*38fd1498Szrj constexpr float 1232*38fd1498Szrj asinh(float __x) 1233*38fd1498Szrj { return __builtin_asinhf(__x); } 1234*38fd1498Szrj 1235*38fd1498Szrj constexpr long double 1236*38fd1498Szrj asinh(long double __x) 1237*38fd1498Szrj { return __builtin_asinhl(__x); } 1238*38fd1498Szrj#endif 1239*38fd1498Szrj 1240*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1241*38fd1498Szrj template<typename _Tp> 1242*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1243*38fd1498Szrj double>::__type 1244*38fd1498Szrj asinh(_Tp __x) 1245*38fd1498Szrj { return __builtin_asinh(__x); } 1246*38fd1498Szrj#endif 1247*38fd1498Szrj 1248*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1249*38fd1498Szrj constexpr float 1250*38fd1498Szrj atanh(float __x) 1251*38fd1498Szrj { return __builtin_atanhf(__x); } 1252*38fd1498Szrj 1253*38fd1498Szrj constexpr long double 1254*38fd1498Szrj atanh(long double __x) 1255*38fd1498Szrj { return __builtin_atanhl(__x); } 1256*38fd1498Szrj#endif 1257*38fd1498Szrj 1258*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1259*38fd1498Szrj template<typename _Tp> 1260*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1261*38fd1498Szrj double>::__type 1262*38fd1498Szrj atanh(_Tp __x) 1263*38fd1498Szrj { return __builtin_atanh(__x); } 1264*38fd1498Szrj#endif 1265*38fd1498Szrj 1266*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1267*38fd1498Szrj constexpr float 1268*38fd1498Szrj cbrt(float __x) 1269*38fd1498Szrj { return __builtin_cbrtf(__x); } 1270*38fd1498Szrj 1271*38fd1498Szrj constexpr long double 1272*38fd1498Szrj cbrt(long double __x) 1273*38fd1498Szrj { return __builtin_cbrtl(__x); } 1274*38fd1498Szrj#endif 1275*38fd1498Szrj 1276*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1277*38fd1498Szrj template<typename _Tp> 1278*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1279*38fd1498Szrj double>::__type 1280*38fd1498Szrj cbrt(_Tp __x) 1281*38fd1498Szrj { return __builtin_cbrt(__x); } 1282*38fd1498Szrj#endif 1283*38fd1498Szrj 1284*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1285*38fd1498Szrj constexpr float 1286*38fd1498Szrj copysign(float __x, float __y) 1287*38fd1498Szrj { return __builtin_copysignf(__x, __y); } 1288*38fd1498Szrj 1289*38fd1498Szrj constexpr long double 1290*38fd1498Szrj copysign(long double __x, long double __y) 1291*38fd1498Szrj { return __builtin_copysignl(__x, __y); } 1292*38fd1498Szrj#endif 1293*38fd1498Szrj 1294*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1295*38fd1498Szrj template<typename _Tp, typename _Up> 1296*38fd1498Szrj constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1297*38fd1498Szrj copysign(_Tp __x, _Up __y) 1298*38fd1498Szrj { 1299*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1300*38fd1498Szrj return copysign(__type(__x), __type(__y)); 1301*38fd1498Szrj } 1302*38fd1498Szrj#endif 1303*38fd1498Szrj 1304*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1305*38fd1498Szrj constexpr float 1306*38fd1498Szrj erf(float __x) 1307*38fd1498Szrj { return __builtin_erff(__x); } 1308*38fd1498Szrj 1309*38fd1498Szrj constexpr long double 1310*38fd1498Szrj erf(long double __x) 1311*38fd1498Szrj { return __builtin_erfl(__x); } 1312*38fd1498Szrj#endif 1313*38fd1498Szrj 1314*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1315*38fd1498Szrj template<typename _Tp> 1316*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1317*38fd1498Szrj double>::__type 1318*38fd1498Szrj erf(_Tp __x) 1319*38fd1498Szrj { return __builtin_erf(__x); } 1320*38fd1498Szrj#endif 1321*38fd1498Szrj 1322*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1323*38fd1498Szrj constexpr float 1324*38fd1498Szrj erfc(float __x) 1325*38fd1498Szrj { return __builtin_erfcf(__x); } 1326*38fd1498Szrj 1327*38fd1498Szrj constexpr long double 1328*38fd1498Szrj erfc(long double __x) 1329*38fd1498Szrj { return __builtin_erfcl(__x); } 1330*38fd1498Szrj#endif 1331*38fd1498Szrj 1332*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1333*38fd1498Szrj template<typename _Tp> 1334*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1335*38fd1498Szrj double>::__type 1336*38fd1498Szrj erfc(_Tp __x) 1337*38fd1498Szrj { return __builtin_erfc(__x); } 1338*38fd1498Szrj#endif 1339*38fd1498Szrj 1340*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1341*38fd1498Szrj constexpr float 1342*38fd1498Szrj exp2(float __x) 1343*38fd1498Szrj { return __builtin_exp2f(__x); } 1344*38fd1498Szrj 1345*38fd1498Szrj constexpr long double 1346*38fd1498Szrj exp2(long double __x) 1347*38fd1498Szrj { return __builtin_exp2l(__x); } 1348*38fd1498Szrj#endif 1349*38fd1498Szrj 1350*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1351*38fd1498Szrj template<typename _Tp> 1352*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1353*38fd1498Szrj double>::__type 1354*38fd1498Szrj exp2(_Tp __x) 1355*38fd1498Szrj { return __builtin_exp2(__x); } 1356*38fd1498Szrj#endif 1357*38fd1498Szrj 1358*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1359*38fd1498Szrj constexpr float 1360*38fd1498Szrj expm1(float __x) 1361*38fd1498Szrj { return __builtin_expm1f(__x); } 1362*38fd1498Szrj 1363*38fd1498Szrj constexpr long double 1364*38fd1498Szrj expm1(long double __x) 1365*38fd1498Szrj { return __builtin_expm1l(__x); } 1366*38fd1498Szrj#endif 1367*38fd1498Szrj 1368*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1369*38fd1498Szrj template<typename _Tp> 1370*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1371*38fd1498Szrj double>::__type 1372*38fd1498Szrj expm1(_Tp __x) 1373*38fd1498Szrj { return __builtin_expm1(__x); } 1374*38fd1498Szrj#endif 1375*38fd1498Szrj 1376*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1377*38fd1498Szrj constexpr float 1378*38fd1498Szrj fdim(float __x, float __y) 1379*38fd1498Szrj { return __builtin_fdimf(__x, __y); } 1380*38fd1498Szrj 1381*38fd1498Szrj constexpr long double 1382*38fd1498Szrj fdim(long double __x, long double __y) 1383*38fd1498Szrj { return __builtin_fdiml(__x, __y); } 1384*38fd1498Szrj#endif 1385*38fd1498Szrj 1386*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1387*38fd1498Szrj template<typename _Tp, typename _Up> 1388*38fd1498Szrj constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1389*38fd1498Szrj fdim(_Tp __x, _Up __y) 1390*38fd1498Szrj { 1391*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1392*38fd1498Szrj return fdim(__type(__x), __type(__y)); 1393*38fd1498Szrj } 1394*38fd1498Szrj#endif 1395*38fd1498Szrj 1396*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1397*38fd1498Szrj constexpr float 1398*38fd1498Szrj fma(float __x, float __y, float __z) 1399*38fd1498Szrj { return __builtin_fmaf(__x, __y, __z); } 1400*38fd1498Szrj 1401*38fd1498Szrj constexpr long double 1402*38fd1498Szrj fma(long double __x, long double __y, long double __z) 1403*38fd1498Szrj { return __builtin_fmal(__x, __y, __z); } 1404*38fd1498Szrj#endif 1405*38fd1498Szrj 1406*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1407*38fd1498Szrj template<typename _Tp, typename _Up, typename _Vp> 1408*38fd1498Szrj constexpr typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type 1409*38fd1498Szrj fma(_Tp __x, _Up __y, _Vp __z) 1410*38fd1498Szrj { 1411*38fd1498Szrj typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type; 1412*38fd1498Szrj return fma(__type(__x), __type(__y), __type(__z)); 1413*38fd1498Szrj } 1414*38fd1498Szrj#endif 1415*38fd1498Szrj 1416*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1417*38fd1498Szrj constexpr float 1418*38fd1498Szrj fmax(float __x, float __y) 1419*38fd1498Szrj { return __builtin_fmaxf(__x, __y); } 1420*38fd1498Szrj 1421*38fd1498Szrj constexpr long double 1422*38fd1498Szrj fmax(long double __x, long double __y) 1423*38fd1498Szrj { return __builtin_fmaxl(__x, __y); } 1424*38fd1498Szrj#endif 1425*38fd1498Szrj 1426*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1427*38fd1498Szrj template<typename _Tp, typename _Up> 1428*38fd1498Szrj constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1429*38fd1498Szrj fmax(_Tp __x, _Up __y) 1430*38fd1498Szrj { 1431*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1432*38fd1498Szrj return fmax(__type(__x), __type(__y)); 1433*38fd1498Szrj } 1434*38fd1498Szrj#endif 1435*38fd1498Szrj 1436*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1437*38fd1498Szrj constexpr float 1438*38fd1498Szrj fmin(float __x, float __y) 1439*38fd1498Szrj { return __builtin_fminf(__x, __y); } 1440*38fd1498Szrj 1441*38fd1498Szrj constexpr long double 1442*38fd1498Szrj fmin(long double __x, long double __y) 1443*38fd1498Szrj { return __builtin_fminl(__x, __y); } 1444*38fd1498Szrj#endif 1445*38fd1498Szrj 1446*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1447*38fd1498Szrj template<typename _Tp, typename _Up> 1448*38fd1498Szrj constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1449*38fd1498Szrj fmin(_Tp __x, _Up __y) 1450*38fd1498Szrj { 1451*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1452*38fd1498Szrj return fmin(__type(__x), __type(__y)); 1453*38fd1498Szrj } 1454*38fd1498Szrj#endif 1455*38fd1498Szrj 1456*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1457*38fd1498Szrj constexpr float 1458*38fd1498Szrj hypot(float __x, float __y) 1459*38fd1498Szrj { return __builtin_hypotf(__x, __y); } 1460*38fd1498Szrj 1461*38fd1498Szrj constexpr long double 1462*38fd1498Szrj hypot(long double __x, long double __y) 1463*38fd1498Szrj { return __builtin_hypotl(__x, __y); } 1464*38fd1498Szrj#endif 1465*38fd1498Szrj 1466*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1467*38fd1498Szrj template<typename _Tp, typename _Up> 1468*38fd1498Szrj constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1469*38fd1498Szrj hypot(_Tp __x, _Up __y) 1470*38fd1498Szrj { 1471*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1472*38fd1498Szrj return hypot(__type(__x), __type(__y)); 1473*38fd1498Szrj } 1474*38fd1498Szrj#endif 1475*38fd1498Szrj 1476*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1477*38fd1498Szrj constexpr int 1478*38fd1498Szrj ilogb(float __x) 1479*38fd1498Szrj { return __builtin_ilogbf(__x); } 1480*38fd1498Szrj 1481*38fd1498Szrj constexpr int 1482*38fd1498Szrj ilogb(long double __x) 1483*38fd1498Szrj { return __builtin_ilogbl(__x); } 1484*38fd1498Szrj#endif 1485*38fd1498Szrj 1486*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1487*38fd1498Szrj template<typename _Tp> 1488*38fd1498Szrj constexpr 1489*38fd1498Szrj typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1490*38fd1498Szrj int>::__type 1491*38fd1498Szrj ilogb(_Tp __x) 1492*38fd1498Szrj { return __builtin_ilogb(__x); } 1493*38fd1498Szrj#endif 1494*38fd1498Szrj 1495*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1496*38fd1498Szrj constexpr float 1497*38fd1498Szrj lgamma(float __x) 1498*38fd1498Szrj { return __builtin_lgammaf(__x); } 1499*38fd1498Szrj 1500*38fd1498Szrj constexpr long double 1501*38fd1498Szrj lgamma(long double __x) 1502*38fd1498Szrj { return __builtin_lgammal(__x); } 1503*38fd1498Szrj#endif 1504*38fd1498Szrj 1505*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1506*38fd1498Szrj template<typename _Tp> 1507*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1508*38fd1498Szrj double>::__type 1509*38fd1498Szrj lgamma(_Tp __x) 1510*38fd1498Szrj { return __builtin_lgamma(__x); } 1511*38fd1498Szrj#endif 1512*38fd1498Szrj 1513*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1514*38fd1498Szrj constexpr long long 1515*38fd1498Szrj llrint(float __x) 1516*38fd1498Szrj { return __builtin_llrintf(__x); } 1517*38fd1498Szrj 1518*38fd1498Szrj constexpr long long 1519*38fd1498Szrj llrint(long double __x) 1520*38fd1498Szrj { return __builtin_llrintl(__x); } 1521*38fd1498Szrj#endif 1522*38fd1498Szrj 1523*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1524*38fd1498Szrj template<typename _Tp> 1525*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1526*38fd1498Szrj long long>::__type 1527*38fd1498Szrj llrint(_Tp __x) 1528*38fd1498Szrj { return __builtin_llrint(__x); } 1529*38fd1498Szrj#endif 1530*38fd1498Szrj 1531*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1532*38fd1498Szrj constexpr long long 1533*38fd1498Szrj llround(float __x) 1534*38fd1498Szrj { return __builtin_llroundf(__x); } 1535*38fd1498Szrj 1536*38fd1498Szrj constexpr long long 1537*38fd1498Szrj llround(long double __x) 1538*38fd1498Szrj { return __builtin_llroundl(__x); } 1539*38fd1498Szrj#endif 1540*38fd1498Szrj 1541*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1542*38fd1498Szrj template<typename _Tp> 1543*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1544*38fd1498Szrj long long>::__type 1545*38fd1498Szrj llround(_Tp __x) 1546*38fd1498Szrj { return __builtin_llround(__x); } 1547*38fd1498Szrj#endif 1548*38fd1498Szrj 1549*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1550*38fd1498Szrj constexpr float 1551*38fd1498Szrj log1p(float __x) 1552*38fd1498Szrj { return __builtin_log1pf(__x); } 1553*38fd1498Szrj 1554*38fd1498Szrj constexpr long double 1555*38fd1498Szrj log1p(long double __x) 1556*38fd1498Szrj { return __builtin_log1pl(__x); } 1557*38fd1498Szrj#endif 1558*38fd1498Szrj 1559*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1560*38fd1498Szrj template<typename _Tp> 1561*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1562*38fd1498Szrj double>::__type 1563*38fd1498Szrj log1p(_Tp __x) 1564*38fd1498Szrj { return __builtin_log1p(__x); } 1565*38fd1498Szrj#endif 1566*38fd1498Szrj 1567*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1568*38fd1498Szrj // DR 568. 1569*38fd1498Szrj constexpr float 1570*38fd1498Szrj log2(float __x) 1571*38fd1498Szrj { return __builtin_log2f(__x); } 1572*38fd1498Szrj 1573*38fd1498Szrj constexpr long double 1574*38fd1498Szrj log2(long double __x) 1575*38fd1498Szrj { return __builtin_log2l(__x); } 1576*38fd1498Szrj#endif 1577*38fd1498Szrj 1578*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1579*38fd1498Szrj template<typename _Tp> 1580*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1581*38fd1498Szrj double>::__type 1582*38fd1498Szrj log2(_Tp __x) 1583*38fd1498Szrj { return __builtin_log2(__x); } 1584*38fd1498Szrj#endif 1585*38fd1498Szrj 1586*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1587*38fd1498Szrj constexpr float 1588*38fd1498Szrj logb(float __x) 1589*38fd1498Szrj { return __builtin_logbf(__x); } 1590*38fd1498Szrj 1591*38fd1498Szrj constexpr long double 1592*38fd1498Szrj logb(long double __x) 1593*38fd1498Szrj { return __builtin_logbl(__x); } 1594*38fd1498Szrj#endif 1595*38fd1498Szrj 1596*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1597*38fd1498Szrj template<typename _Tp> 1598*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1599*38fd1498Szrj double>::__type 1600*38fd1498Szrj logb(_Tp __x) 1601*38fd1498Szrj { return __builtin_logb(__x); } 1602*38fd1498Szrj#endif 1603*38fd1498Szrj 1604*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1605*38fd1498Szrj constexpr long 1606*38fd1498Szrj lrint(float __x) 1607*38fd1498Szrj { return __builtin_lrintf(__x); } 1608*38fd1498Szrj 1609*38fd1498Szrj constexpr long 1610*38fd1498Szrj lrint(long double __x) 1611*38fd1498Szrj { return __builtin_lrintl(__x); } 1612*38fd1498Szrj#endif 1613*38fd1498Szrj 1614*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1615*38fd1498Szrj template<typename _Tp> 1616*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1617*38fd1498Szrj long>::__type 1618*38fd1498Szrj lrint(_Tp __x) 1619*38fd1498Szrj { return __builtin_lrint(__x); } 1620*38fd1498Szrj#endif 1621*38fd1498Szrj 1622*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1623*38fd1498Szrj constexpr long 1624*38fd1498Szrj lround(float __x) 1625*38fd1498Szrj { return __builtin_lroundf(__x); } 1626*38fd1498Szrj 1627*38fd1498Szrj constexpr long 1628*38fd1498Szrj lround(long double __x) 1629*38fd1498Szrj { return __builtin_lroundl(__x); } 1630*38fd1498Szrj#endif 1631*38fd1498Szrj 1632*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1633*38fd1498Szrj template<typename _Tp> 1634*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1635*38fd1498Szrj long>::__type 1636*38fd1498Szrj lround(_Tp __x) 1637*38fd1498Szrj { return __builtin_lround(__x); } 1638*38fd1498Szrj#endif 1639*38fd1498Szrj 1640*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1641*38fd1498Szrj constexpr float 1642*38fd1498Szrj nearbyint(float __x) 1643*38fd1498Szrj { return __builtin_nearbyintf(__x); } 1644*38fd1498Szrj 1645*38fd1498Szrj constexpr long double 1646*38fd1498Szrj nearbyint(long double __x) 1647*38fd1498Szrj { return __builtin_nearbyintl(__x); } 1648*38fd1498Szrj#endif 1649*38fd1498Szrj 1650*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1651*38fd1498Szrj template<typename _Tp> 1652*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1653*38fd1498Szrj double>::__type 1654*38fd1498Szrj nearbyint(_Tp __x) 1655*38fd1498Szrj { return __builtin_nearbyint(__x); } 1656*38fd1498Szrj#endif 1657*38fd1498Szrj 1658*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1659*38fd1498Szrj constexpr float 1660*38fd1498Szrj nextafter(float __x, float __y) 1661*38fd1498Szrj { return __builtin_nextafterf(__x, __y); } 1662*38fd1498Szrj 1663*38fd1498Szrj constexpr long double 1664*38fd1498Szrj nextafter(long double __x, long double __y) 1665*38fd1498Szrj { return __builtin_nextafterl(__x, __y); } 1666*38fd1498Szrj#endif 1667*38fd1498Szrj 1668*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1669*38fd1498Szrj template<typename _Tp, typename _Up> 1670*38fd1498Szrj constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1671*38fd1498Szrj nextafter(_Tp __x, _Up __y) 1672*38fd1498Szrj { 1673*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1674*38fd1498Szrj return nextafter(__type(__x), __type(__y)); 1675*38fd1498Szrj } 1676*38fd1498Szrj#endif 1677*38fd1498Szrj 1678*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1679*38fd1498Szrj constexpr float 1680*38fd1498Szrj nexttoward(float __x, long double __y) 1681*38fd1498Szrj { return __builtin_nexttowardf(__x, __y); } 1682*38fd1498Szrj 1683*38fd1498Szrj constexpr long double 1684*38fd1498Szrj nexttoward(long double __x, long double __y) 1685*38fd1498Szrj { return __builtin_nexttowardl(__x, __y); } 1686*38fd1498Szrj#endif 1687*38fd1498Szrj 1688*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1689*38fd1498Szrj template<typename _Tp> 1690*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1691*38fd1498Szrj double>::__type 1692*38fd1498Szrj nexttoward(_Tp __x, long double __y) 1693*38fd1498Szrj { return __builtin_nexttoward(__x, __y); } 1694*38fd1498Szrj#endif 1695*38fd1498Szrj 1696*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1697*38fd1498Szrj constexpr float 1698*38fd1498Szrj remainder(float __x, float __y) 1699*38fd1498Szrj { return __builtin_remainderf(__x, __y); } 1700*38fd1498Szrj 1701*38fd1498Szrj constexpr long double 1702*38fd1498Szrj remainder(long double __x, long double __y) 1703*38fd1498Szrj { return __builtin_remainderl(__x, __y); } 1704*38fd1498Szrj#endif 1705*38fd1498Szrj 1706*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1707*38fd1498Szrj template<typename _Tp, typename _Up> 1708*38fd1498Szrj constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1709*38fd1498Szrj remainder(_Tp __x, _Up __y) 1710*38fd1498Szrj { 1711*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1712*38fd1498Szrj return remainder(__type(__x), __type(__y)); 1713*38fd1498Szrj } 1714*38fd1498Szrj#endif 1715*38fd1498Szrj 1716*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1717*38fd1498Szrj inline float 1718*38fd1498Szrj remquo(float __x, float __y, int* __pquo) 1719*38fd1498Szrj { return __builtin_remquof(__x, __y, __pquo); } 1720*38fd1498Szrj 1721*38fd1498Szrj inline long double 1722*38fd1498Szrj remquo(long double __x, long double __y, int* __pquo) 1723*38fd1498Szrj { return __builtin_remquol(__x, __y, __pquo); } 1724*38fd1498Szrj#endif 1725*38fd1498Szrj 1726*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1727*38fd1498Szrj template<typename _Tp, typename _Up> 1728*38fd1498Szrj inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1729*38fd1498Szrj remquo(_Tp __x, _Up __y, int* __pquo) 1730*38fd1498Szrj { 1731*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1732*38fd1498Szrj return remquo(__type(__x), __type(__y), __pquo); 1733*38fd1498Szrj } 1734*38fd1498Szrj#endif 1735*38fd1498Szrj 1736*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1737*38fd1498Szrj constexpr float 1738*38fd1498Szrj rint(float __x) 1739*38fd1498Szrj { return __builtin_rintf(__x); } 1740*38fd1498Szrj 1741*38fd1498Szrj constexpr long double 1742*38fd1498Szrj rint(long double __x) 1743*38fd1498Szrj { return __builtin_rintl(__x); } 1744*38fd1498Szrj#endif 1745*38fd1498Szrj 1746*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1747*38fd1498Szrj template<typename _Tp> 1748*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1749*38fd1498Szrj double>::__type 1750*38fd1498Szrj rint(_Tp __x) 1751*38fd1498Szrj { return __builtin_rint(__x); } 1752*38fd1498Szrj#endif 1753*38fd1498Szrj 1754*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1755*38fd1498Szrj constexpr float 1756*38fd1498Szrj round(float __x) 1757*38fd1498Szrj { return __builtin_roundf(__x); } 1758*38fd1498Szrj 1759*38fd1498Szrj constexpr long double 1760*38fd1498Szrj round(long double __x) 1761*38fd1498Szrj { return __builtin_roundl(__x); } 1762*38fd1498Szrj#endif 1763*38fd1498Szrj 1764*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1765*38fd1498Szrj template<typename _Tp> 1766*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1767*38fd1498Szrj double>::__type 1768*38fd1498Szrj round(_Tp __x) 1769*38fd1498Szrj { return __builtin_round(__x); } 1770*38fd1498Szrj#endif 1771*38fd1498Szrj 1772*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1773*38fd1498Szrj constexpr float 1774*38fd1498Szrj scalbln(float __x, long __ex) 1775*38fd1498Szrj { return __builtin_scalblnf(__x, __ex); } 1776*38fd1498Szrj 1777*38fd1498Szrj constexpr long double 1778*38fd1498Szrj scalbln(long double __x, long __ex) 1779*38fd1498Szrj { return __builtin_scalblnl(__x, __ex); } 1780*38fd1498Szrj#endif 1781*38fd1498Szrj 1782*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1783*38fd1498Szrj template<typename _Tp> 1784*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1785*38fd1498Szrj double>::__type 1786*38fd1498Szrj scalbln(_Tp __x, long __ex) 1787*38fd1498Szrj { return __builtin_scalbln(__x, __ex); } 1788*38fd1498Szrj#endif 1789*38fd1498Szrj 1790*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1791*38fd1498Szrj constexpr float 1792*38fd1498Szrj scalbn(float __x, int __ex) 1793*38fd1498Szrj { return __builtin_scalbnf(__x, __ex); } 1794*38fd1498Szrj 1795*38fd1498Szrj constexpr long double 1796*38fd1498Szrj scalbn(long double __x, int __ex) 1797*38fd1498Szrj { return __builtin_scalbnl(__x, __ex); } 1798*38fd1498Szrj#endif 1799*38fd1498Szrj 1800*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1801*38fd1498Szrj template<typename _Tp> 1802*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1803*38fd1498Szrj double>::__type 1804*38fd1498Szrj scalbn(_Tp __x, int __ex) 1805*38fd1498Szrj { return __builtin_scalbn(__x, __ex); } 1806*38fd1498Szrj#endif 1807*38fd1498Szrj 1808*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1809*38fd1498Szrj constexpr float 1810*38fd1498Szrj tgamma(float __x) 1811*38fd1498Szrj { return __builtin_tgammaf(__x); } 1812*38fd1498Szrj 1813*38fd1498Szrj constexpr long double 1814*38fd1498Szrj tgamma(long double __x) 1815*38fd1498Szrj { return __builtin_tgammal(__x); } 1816*38fd1498Szrj#endif 1817*38fd1498Szrj 1818*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1819*38fd1498Szrj template<typename _Tp> 1820*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1821*38fd1498Szrj double>::__type 1822*38fd1498Szrj tgamma(_Tp __x) 1823*38fd1498Szrj { return __builtin_tgamma(__x); } 1824*38fd1498Szrj#endif 1825*38fd1498Szrj 1826*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1827*38fd1498Szrj constexpr float 1828*38fd1498Szrj trunc(float __x) 1829*38fd1498Szrj { return __builtin_truncf(__x); } 1830*38fd1498Szrj 1831*38fd1498Szrj constexpr long double 1832*38fd1498Szrj trunc(long double __x) 1833*38fd1498Szrj { return __builtin_truncl(__x); } 1834*38fd1498Szrj#endif 1835*38fd1498Szrj 1836*38fd1498Szrj#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1837*38fd1498Szrj template<typename _Tp> 1838*38fd1498Szrj constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1839*38fd1498Szrj double>::__type 1840*38fd1498Szrj trunc(_Tp __x) 1841*38fd1498Szrj { return __builtin_trunc(__x); } 1842*38fd1498Szrj#endif 1843*38fd1498Szrj 1844*38fd1498Szrj#endif // _GLIBCXX_USE_C99_MATH_TR1 1845*38fd1498Szrj#endif // C++11 1846*38fd1498Szrj 1847*38fd1498Szrj#if __cplusplus > 201402L 1848*38fd1498Szrj 1849*38fd1498Szrj // [c.math.hypot3], three-dimensional hypotenuse 1850*38fd1498Szrj#define __cpp_lib_hypot 201603 1851*38fd1498Szrj 1852*38fd1498Szrj template<typename _Tp> 1853*38fd1498Szrj inline _Tp 1854*38fd1498Szrj __hypot3(_Tp __x, _Tp __y, _Tp __z) 1855*38fd1498Szrj { 1856*38fd1498Szrj __x = std::abs(__x); 1857*38fd1498Szrj __y = std::abs(__y); 1858*38fd1498Szrj __z = std::abs(__z); 1859*38fd1498Szrj if (_Tp __a = __x < __y ? __y < __z ? __z : __y : __x < __z ? __z : __x) 1860*38fd1498Szrj return __a * std::sqrt((__x / __a) * (__x / __a) 1861*38fd1498Szrj + (__y / __a) * (__y / __a) 1862*38fd1498Szrj + (__z / __a) * (__z / __a)); 1863*38fd1498Szrj else 1864*38fd1498Szrj return {}; 1865*38fd1498Szrj } 1866*38fd1498Szrj 1867*38fd1498Szrj inline float 1868*38fd1498Szrj hypot(float __x, float __y, float __z) 1869*38fd1498Szrj { return std::__hypot3<float>(__x, __y, __z); } 1870*38fd1498Szrj 1871*38fd1498Szrj inline double 1872*38fd1498Szrj hypot(double __x, double __y, double __z) 1873*38fd1498Szrj { return std::__hypot3<double>(__x, __y, __z); } 1874*38fd1498Szrj 1875*38fd1498Szrj inline long double 1876*38fd1498Szrj hypot(long double __x, long double __y, long double __z) 1877*38fd1498Szrj { return std::__hypot3<long double>(__x, __y, __z); } 1878*38fd1498Szrj 1879*38fd1498Szrj template<typename _Tp, typename _Up, typename _Vp> 1880*38fd1498Szrj typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type 1881*38fd1498Szrj hypot(_Tp __x, _Up __y, _Vp __z) 1882*38fd1498Szrj { 1883*38fd1498Szrj using __type = typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type; 1884*38fd1498Szrj return std::__hypot3<__type>(__x, __y, __z); 1885*38fd1498Szrj } 1886*38fd1498Szrj#endif // C++17 1887*38fd1498Szrj 1888*38fd1498Szrj_GLIBCXX_END_NAMESPACE_VERSION 1889*38fd1498Szrj} // namespace 1890*38fd1498Szrj 1891*38fd1498Szrj#if _GLIBCXX_USE_STD_SPEC_FUNCS 1892*38fd1498Szrj# include <bits/specfun.h> 1893*38fd1498Szrj#endif 1894*38fd1498Szrj 1895*38fd1498Szrj} // extern "C++" 1896*38fd1498Szrj 1897*38fd1498Szrj#endif 1898