1*e4b17023SJohn Marino// TR1 cmath -*- C++ -*- 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino// Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 4*e4b17023SJohn Marino// Free Software Foundation, Inc. 5*e4b17023SJohn Marino// 6*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library. This library is free 7*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the 8*e4b17023SJohn Marino// terms of the GNU General Public License as published by the 9*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option) 10*e4b17023SJohn Marino// any later version. 11*e4b17023SJohn Marino 12*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful, 13*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of 14*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*e4b17023SJohn Marino// GNU General Public License for more details. 16*e4b17023SJohn Marino 17*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional 18*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version 19*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation. 20*e4b17023SJohn Marino 21*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License and 22*e4b17023SJohn Marino// a copy of the GCC Runtime Library Exception along with this program; 23*e4b17023SJohn Marino// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>. 25*e4b17023SJohn Marino 26*e4b17023SJohn Marino/** @file tr1/cmath 27*e4b17023SJohn Marino * This is a TR1 C++ Library header. 28*e4b17023SJohn Marino */ 29*e4b17023SJohn Marino 30*e4b17023SJohn Marino#ifndef _GLIBCXX_TR1_CMATH 31*e4b17023SJohn Marino#define _GLIBCXX_TR1_CMATH 1 32*e4b17023SJohn Marino 33*e4b17023SJohn Marino#pragma GCC system_header 34*e4b17023SJohn Marino 35*e4b17023SJohn Marino#include <cmath> 36*e4b17023SJohn Marino 37*e4b17023SJohn Marino#ifdef _GLIBCXX_USE_C99_MATH_TR1 38*e4b17023SJohn Marino 39*e4b17023SJohn Marino#undef acosh 40*e4b17023SJohn Marino#undef acoshf 41*e4b17023SJohn Marino#undef acoshl 42*e4b17023SJohn Marino#undef asinh 43*e4b17023SJohn Marino#undef asinhf 44*e4b17023SJohn Marino#undef asinhl 45*e4b17023SJohn Marino#undef atanh 46*e4b17023SJohn Marino#undef atanhf 47*e4b17023SJohn Marino#undef atanhl 48*e4b17023SJohn Marino#undef cbrt 49*e4b17023SJohn Marino#undef cbrtf 50*e4b17023SJohn Marino#undef cbrtl 51*e4b17023SJohn Marino#undef copysign 52*e4b17023SJohn Marino#undef copysignf 53*e4b17023SJohn Marino#undef copysignl 54*e4b17023SJohn Marino#undef erf 55*e4b17023SJohn Marino#undef erff 56*e4b17023SJohn Marino#undef erfl 57*e4b17023SJohn Marino#undef erfc 58*e4b17023SJohn Marino#undef erfcf 59*e4b17023SJohn Marino#undef erfcl 60*e4b17023SJohn Marino#undef exp2 61*e4b17023SJohn Marino#undef exp2f 62*e4b17023SJohn Marino#undef exp2l 63*e4b17023SJohn Marino#undef expm1 64*e4b17023SJohn Marino#undef expm1f 65*e4b17023SJohn Marino#undef expm1l 66*e4b17023SJohn Marino#undef fdim 67*e4b17023SJohn Marino#undef fdimf 68*e4b17023SJohn Marino#undef fdiml 69*e4b17023SJohn Marino#undef fma 70*e4b17023SJohn Marino#undef fmaf 71*e4b17023SJohn Marino#undef fmal 72*e4b17023SJohn Marino#undef fmax 73*e4b17023SJohn Marino#undef fmaxf 74*e4b17023SJohn Marino#undef fmaxl 75*e4b17023SJohn Marino#undef fmin 76*e4b17023SJohn Marino#undef fminf 77*e4b17023SJohn Marino#undef fminl 78*e4b17023SJohn Marino#undef hypot 79*e4b17023SJohn Marino#undef hypotf 80*e4b17023SJohn Marino#undef hypotl 81*e4b17023SJohn Marino#undef ilogb 82*e4b17023SJohn Marino#undef ilogbf 83*e4b17023SJohn Marino#undef ilogbl 84*e4b17023SJohn Marino#undef lgamma 85*e4b17023SJohn Marino#undef lgammaf 86*e4b17023SJohn Marino#undef lgammal 87*e4b17023SJohn Marino#undef llrint 88*e4b17023SJohn Marino#undef llrintf 89*e4b17023SJohn Marino#undef llrintl 90*e4b17023SJohn Marino#undef llround 91*e4b17023SJohn Marino#undef llroundf 92*e4b17023SJohn Marino#undef llroundl 93*e4b17023SJohn Marino#undef log1p 94*e4b17023SJohn Marino#undef log1pf 95*e4b17023SJohn Marino#undef log1pl 96*e4b17023SJohn Marino#undef log2 97*e4b17023SJohn Marino#undef log2f 98*e4b17023SJohn Marino#undef log2l 99*e4b17023SJohn Marino#undef logb 100*e4b17023SJohn Marino#undef logbf 101*e4b17023SJohn Marino#undef logbl 102*e4b17023SJohn Marino#undef lrint 103*e4b17023SJohn Marino#undef lrintf 104*e4b17023SJohn Marino#undef lrintl 105*e4b17023SJohn Marino#undef lround 106*e4b17023SJohn Marino#undef lroundf 107*e4b17023SJohn Marino#undef lroundl 108*e4b17023SJohn Marino#undef nan 109*e4b17023SJohn Marino#undef nanf 110*e4b17023SJohn Marino#undef nanl 111*e4b17023SJohn Marino#undef nearbyint 112*e4b17023SJohn Marino#undef nearbyintf 113*e4b17023SJohn Marino#undef nearbyintl 114*e4b17023SJohn Marino#undef nextafter 115*e4b17023SJohn Marino#undef nextafterf 116*e4b17023SJohn Marino#undef nextafterl 117*e4b17023SJohn Marino#undef nexttoward 118*e4b17023SJohn Marino#undef nexttowardf 119*e4b17023SJohn Marino#undef nexttowardl 120*e4b17023SJohn Marino#undef remainder 121*e4b17023SJohn Marino#undef remainderf 122*e4b17023SJohn Marino#undef remainderl 123*e4b17023SJohn Marino#undef remquo 124*e4b17023SJohn Marino#undef remquof 125*e4b17023SJohn Marino#undef remquol 126*e4b17023SJohn Marino#undef rint 127*e4b17023SJohn Marino#undef rintf 128*e4b17023SJohn Marino#undef rintl 129*e4b17023SJohn Marino#undef round 130*e4b17023SJohn Marino#undef roundf 131*e4b17023SJohn Marino#undef roundl 132*e4b17023SJohn Marino#undef scalbln 133*e4b17023SJohn Marino#undef scalblnf 134*e4b17023SJohn Marino#undef scalblnl 135*e4b17023SJohn Marino#undef scalbn 136*e4b17023SJohn Marino#undef scalbnf 137*e4b17023SJohn Marino#undef scalbnl 138*e4b17023SJohn Marino#undef tgamma 139*e4b17023SJohn Marino#undef tgammaf 140*e4b17023SJohn Marino#undef tgammal 141*e4b17023SJohn Marino#undef trunc 142*e4b17023SJohn Marino#undef truncf 143*e4b17023SJohn Marino#undef truncl 144*e4b17023SJohn Marino 145*e4b17023SJohn Marino#endif 146*e4b17023SJohn Marino 147*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default) 148*e4b17023SJohn Marino{ 149*e4b17023SJohn Marinonamespace tr1 150*e4b17023SJohn Marino{ 151*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 152*e4b17023SJohn Marino 153*e4b17023SJohn Marino#if _GLIBCXX_USE_C99_MATH_TR1 154*e4b17023SJohn Marino 155*e4b17023SJohn Marino // types 156*e4b17023SJohn Marino using ::double_t; 157*e4b17023SJohn Marino using ::float_t; 158*e4b17023SJohn Marino 159*e4b17023SJohn Marino // functions 160*e4b17023SJohn Marino using ::acosh; 161*e4b17023SJohn Marino using ::acoshf; 162*e4b17023SJohn Marino using ::acoshl; 163*e4b17023SJohn Marino 164*e4b17023SJohn Marino using ::asinh; 165*e4b17023SJohn Marino using ::asinhf; 166*e4b17023SJohn Marino using ::asinhl; 167*e4b17023SJohn Marino 168*e4b17023SJohn Marino using ::atanh; 169*e4b17023SJohn Marino using ::atanhf; 170*e4b17023SJohn Marino using ::atanhl; 171*e4b17023SJohn Marino 172*e4b17023SJohn Marino using ::cbrt; 173*e4b17023SJohn Marino using ::cbrtf; 174*e4b17023SJohn Marino using ::cbrtl; 175*e4b17023SJohn Marino 176*e4b17023SJohn Marino using ::copysign; 177*e4b17023SJohn Marino using ::copysignf; 178*e4b17023SJohn Marino using ::copysignl; 179*e4b17023SJohn Marino 180*e4b17023SJohn Marino using ::erf; 181*e4b17023SJohn Marino using ::erff; 182*e4b17023SJohn Marino using ::erfl; 183*e4b17023SJohn Marino 184*e4b17023SJohn Marino using ::erfc; 185*e4b17023SJohn Marino using ::erfcf; 186*e4b17023SJohn Marino using ::erfcl; 187*e4b17023SJohn Marino 188*e4b17023SJohn Marino using ::exp2; 189*e4b17023SJohn Marino using ::exp2f; 190*e4b17023SJohn Marino using ::exp2l; 191*e4b17023SJohn Marino 192*e4b17023SJohn Marino using ::expm1; 193*e4b17023SJohn Marino using ::expm1f; 194*e4b17023SJohn Marino using ::expm1l; 195*e4b17023SJohn Marino 196*e4b17023SJohn Marino using ::fdim; 197*e4b17023SJohn Marino using ::fdimf; 198*e4b17023SJohn Marino using ::fdiml; 199*e4b17023SJohn Marino 200*e4b17023SJohn Marino using ::fma; 201*e4b17023SJohn Marino using ::fmaf; 202*e4b17023SJohn Marino using ::fmal; 203*e4b17023SJohn Marino 204*e4b17023SJohn Marino using ::fmax; 205*e4b17023SJohn Marino using ::fmaxf; 206*e4b17023SJohn Marino using ::fmaxl; 207*e4b17023SJohn Marino 208*e4b17023SJohn Marino using ::fmin; 209*e4b17023SJohn Marino using ::fminf; 210*e4b17023SJohn Marino using ::fminl; 211*e4b17023SJohn Marino 212*e4b17023SJohn Marino using ::hypot; 213*e4b17023SJohn Marino using ::hypotf; 214*e4b17023SJohn Marino using ::hypotl; 215*e4b17023SJohn Marino 216*e4b17023SJohn Marino using ::ilogb; 217*e4b17023SJohn Marino using ::ilogbf; 218*e4b17023SJohn Marino using ::ilogbl; 219*e4b17023SJohn Marino 220*e4b17023SJohn Marino using ::lgamma; 221*e4b17023SJohn Marino using ::lgammaf; 222*e4b17023SJohn Marino using ::lgammal; 223*e4b17023SJohn Marino 224*e4b17023SJohn Marino using ::llrint; 225*e4b17023SJohn Marino using ::llrintf; 226*e4b17023SJohn Marino using ::llrintl; 227*e4b17023SJohn Marino 228*e4b17023SJohn Marino using ::llround; 229*e4b17023SJohn Marino using ::llroundf; 230*e4b17023SJohn Marino using ::llroundl; 231*e4b17023SJohn Marino 232*e4b17023SJohn Marino using ::log1p; 233*e4b17023SJohn Marino using ::log1pf; 234*e4b17023SJohn Marino using ::log1pl; 235*e4b17023SJohn Marino 236*e4b17023SJohn Marino using ::log2; 237*e4b17023SJohn Marino using ::log2f; 238*e4b17023SJohn Marino using ::log2l; 239*e4b17023SJohn Marino 240*e4b17023SJohn Marino using ::logb; 241*e4b17023SJohn Marino using ::logbf; 242*e4b17023SJohn Marino using ::logbl; 243*e4b17023SJohn Marino 244*e4b17023SJohn Marino using ::lrint; 245*e4b17023SJohn Marino using ::lrintf; 246*e4b17023SJohn Marino using ::lrintl; 247*e4b17023SJohn Marino 248*e4b17023SJohn Marino using ::lround; 249*e4b17023SJohn Marino using ::lroundf; 250*e4b17023SJohn Marino using ::lroundl; 251*e4b17023SJohn Marino 252*e4b17023SJohn Marino using ::nan; 253*e4b17023SJohn Marino using ::nanf; 254*e4b17023SJohn Marino using ::nanl; 255*e4b17023SJohn Marino 256*e4b17023SJohn Marino using ::nearbyint; 257*e4b17023SJohn Marino using ::nearbyintf; 258*e4b17023SJohn Marino using ::nearbyintl; 259*e4b17023SJohn Marino 260*e4b17023SJohn Marino using ::nextafter; 261*e4b17023SJohn Marino using ::nextafterf; 262*e4b17023SJohn Marino using ::nextafterl; 263*e4b17023SJohn Marino 264*e4b17023SJohn Marino using ::nexttoward; 265*e4b17023SJohn Marino using ::nexttowardf; 266*e4b17023SJohn Marino using ::nexttowardl; 267*e4b17023SJohn Marino 268*e4b17023SJohn Marino using ::remainder; 269*e4b17023SJohn Marino using ::remainderf; 270*e4b17023SJohn Marino using ::remainderl; 271*e4b17023SJohn Marino 272*e4b17023SJohn Marino using ::remquo; 273*e4b17023SJohn Marino using ::remquof; 274*e4b17023SJohn Marino using ::remquol; 275*e4b17023SJohn Marino 276*e4b17023SJohn Marino using ::rint; 277*e4b17023SJohn Marino using ::rintf; 278*e4b17023SJohn Marino using ::rintl; 279*e4b17023SJohn Marino 280*e4b17023SJohn Marino using ::round; 281*e4b17023SJohn Marino using ::roundf; 282*e4b17023SJohn Marino using ::roundl; 283*e4b17023SJohn Marino 284*e4b17023SJohn Marino using ::scalbln; 285*e4b17023SJohn Marino using ::scalblnf; 286*e4b17023SJohn Marino using ::scalblnl; 287*e4b17023SJohn Marino 288*e4b17023SJohn Marino using ::scalbn; 289*e4b17023SJohn Marino using ::scalbnf; 290*e4b17023SJohn Marino using ::scalbnl; 291*e4b17023SJohn Marino 292*e4b17023SJohn Marino using ::tgamma; 293*e4b17023SJohn Marino using ::tgammaf; 294*e4b17023SJohn Marino using ::tgammal; 295*e4b17023SJohn Marino 296*e4b17023SJohn Marino using ::trunc; 297*e4b17023SJohn Marino using ::truncf; 298*e4b17023SJohn Marino using ::truncl; 299*e4b17023SJohn Marino 300*e4b17023SJohn Marino#endif 301*e4b17023SJohn Marino 302*e4b17023SJohn Marino#if _GLIBCXX_USE_C99_MATH 303*e4b17023SJohn Marino#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC 304*e4b17023SJohn Marino 305*e4b17023SJohn Marino /// Function template definitions [8.16.3]. 306*e4b17023SJohn Marino template<typename _Tp> 307*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 308*e4b17023SJohn Marino int>::__type 309*e4b17023SJohn Marino fpclassify(_Tp __f) 310*e4b17023SJohn Marino { 311*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 312*e4b17023SJohn Marino return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 313*e4b17023SJohn Marino FP_SUBNORMAL, FP_ZERO, __type(__f)); 314*e4b17023SJohn Marino } 315*e4b17023SJohn Marino 316*e4b17023SJohn Marino template<typename _Tp> 317*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 318*e4b17023SJohn Marino int>::__type 319*e4b17023SJohn Marino isfinite(_Tp __f) 320*e4b17023SJohn Marino { 321*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 322*e4b17023SJohn Marino return __builtin_isfinite(__type(__f)); 323*e4b17023SJohn Marino } 324*e4b17023SJohn Marino 325*e4b17023SJohn Marino template<typename _Tp> 326*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 327*e4b17023SJohn Marino int>::__type 328*e4b17023SJohn Marino isinf(_Tp __f) 329*e4b17023SJohn Marino { 330*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 331*e4b17023SJohn Marino return __builtin_isinf(__type(__f)); 332*e4b17023SJohn Marino } 333*e4b17023SJohn Marino 334*e4b17023SJohn Marino template<typename _Tp> 335*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 336*e4b17023SJohn Marino int>::__type 337*e4b17023SJohn Marino isnan(_Tp __f) 338*e4b17023SJohn Marino { 339*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 340*e4b17023SJohn Marino return __builtin_isnan(__type(__f)); 341*e4b17023SJohn Marino } 342*e4b17023SJohn Marino 343*e4b17023SJohn Marino template<typename _Tp> 344*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 345*e4b17023SJohn Marino int>::__type 346*e4b17023SJohn Marino isnormal(_Tp __f) 347*e4b17023SJohn Marino { 348*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 349*e4b17023SJohn Marino return __builtin_isnormal(__type(__f)); 350*e4b17023SJohn Marino } 351*e4b17023SJohn Marino 352*e4b17023SJohn Marino template<typename _Tp> 353*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 354*e4b17023SJohn Marino int>::__type 355*e4b17023SJohn Marino signbit(_Tp __f) 356*e4b17023SJohn Marino { 357*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 358*e4b17023SJohn Marino return __builtin_signbit(__type(__f)); 359*e4b17023SJohn Marino } 360*e4b17023SJohn Marino 361*e4b17023SJohn Marino template<typename _Tp> 362*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 363*e4b17023SJohn Marino int>::__type 364*e4b17023SJohn Marino isgreater(_Tp __f1, _Tp __f2) 365*e4b17023SJohn Marino { 366*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 367*e4b17023SJohn Marino return __builtin_isgreater(__type(__f1), __type(__f2)); 368*e4b17023SJohn Marino } 369*e4b17023SJohn Marino 370*e4b17023SJohn Marino template<typename _Tp> 371*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 372*e4b17023SJohn Marino int>::__type 373*e4b17023SJohn Marino isgreaterequal(_Tp __f1, _Tp __f2) 374*e4b17023SJohn Marino { 375*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 376*e4b17023SJohn Marino return __builtin_isgreaterequal(__type(__f1), __type(__f2)); 377*e4b17023SJohn Marino } 378*e4b17023SJohn Marino 379*e4b17023SJohn Marino template<typename _Tp> 380*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 381*e4b17023SJohn Marino int>::__type 382*e4b17023SJohn Marino isless(_Tp __f1, _Tp __f2) 383*e4b17023SJohn Marino { 384*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 385*e4b17023SJohn Marino return __builtin_isless(__type(__f1), __type(__f2)); 386*e4b17023SJohn Marino } 387*e4b17023SJohn Marino 388*e4b17023SJohn Marino template<typename _Tp> 389*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 390*e4b17023SJohn Marino int>::__type 391*e4b17023SJohn Marino islessequal(_Tp __f1, _Tp __f2) 392*e4b17023SJohn Marino { 393*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 394*e4b17023SJohn Marino return __builtin_islessequal(__type(__f1), __type(__f2)); 395*e4b17023SJohn Marino } 396*e4b17023SJohn Marino 397*e4b17023SJohn Marino template<typename _Tp> 398*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 399*e4b17023SJohn Marino int>::__type 400*e4b17023SJohn Marino islessgreater(_Tp __f1, _Tp __f2) 401*e4b17023SJohn Marino { 402*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 403*e4b17023SJohn Marino return __builtin_islessgreater(__type(__f1), __type(__f2)); 404*e4b17023SJohn Marino } 405*e4b17023SJohn Marino 406*e4b17023SJohn Marino template<typename _Tp> 407*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 408*e4b17023SJohn Marino int>::__type 409*e4b17023SJohn Marino isunordered(_Tp __f1, _Tp __f2) 410*e4b17023SJohn Marino { 411*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 412*e4b17023SJohn Marino return __builtin_isunordered(__type(__f1), __type(__f2)); 413*e4b17023SJohn Marino } 414*e4b17023SJohn Marino 415*e4b17023SJohn Marino#endif 416*e4b17023SJohn Marino#endif 417*e4b17023SJohn Marino 418*e4b17023SJohn Marino#if _GLIBCXX_USE_C99_MATH_TR1 419*e4b17023SJohn Marino 420*e4b17023SJohn Marino /// Additional overloads [8.16.4]. 421*e4b17023SJohn Marino using std::acos; 422*e4b17023SJohn Marino 423*e4b17023SJohn Marino inline float 424*e4b17023SJohn Marino acosh(float __x) 425*e4b17023SJohn Marino { return __builtin_acoshf(__x); } 426*e4b17023SJohn Marino 427*e4b17023SJohn Marino inline long double 428*e4b17023SJohn Marino acosh(long double __x) 429*e4b17023SJohn Marino { return __builtin_acoshl(__x); } 430*e4b17023SJohn Marino 431*e4b17023SJohn Marino template<typename _Tp> 432*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 433*e4b17023SJohn Marino double>::__type 434*e4b17023SJohn Marino acosh(_Tp __x) 435*e4b17023SJohn Marino { return __builtin_acosh(__x); } 436*e4b17023SJohn Marino 437*e4b17023SJohn Marino using std::asin; 438*e4b17023SJohn Marino 439*e4b17023SJohn Marino inline float 440*e4b17023SJohn Marino asinh(float __x) 441*e4b17023SJohn Marino { return __builtin_asinhf(__x); } 442*e4b17023SJohn Marino 443*e4b17023SJohn Marino inline long double 444*e4b17023SJohn Marino asinh(long double __x) 445*e4b17023SJohn Marino { return __builtin_asinhl(__x); } 446*e4b17023SJohn Marino 447*e4b17023SJohn Marino template<typename _Tp> 448*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 449*e4b17023SJohn Marino double>::__type 450*e4b17023SJohn Marino asinh(_Tp __x) 451*e4b17023SJohn Marino { return __builtin_asinh(__x); } 452*e4b17023SJohn Marino 453*e4b17023SJohn Marino using std::atan; 454*e4b17023SJohn Marino using std::atan2; 455*e4b17023SJohn Marino 456*e4b17023SJohn Marino inline float 457*e4b17023SJohn Marino atanh(float __x) 458*e4b17023SJohn Marino { return __builtin_atanhf(__x); } 459*e4b17023SJohn Marino 460*e4b17023SJohn Marino inline long double 461*e4b17023SJohn Marino atanh(long double __x) 462*e4b17023SJohn Marino { return __builtin_atanhl(__x); } 463*e4b17023SJohn Marino 464*e4b17023SJohn Marino template<typename _Tp> 465*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 466*e4b17023SJohn Marino double>::__type 467*e4b17023SJohn Marino atanh(_Tp __x) 468*e4b17023SJohn Marino { return __builtin_atanh(__x); } 469*e4b17023SJohn Marino 470*e4b17023SJohn Marino inline float 471*e4b17023SJohn Marino cbrt(float __x) 472*e4b17023SJohn Marino { return __builtin_cbrtf(__x); } 473*e4b17023SJohn Marino 474*e4b17023SJohn Marino inline long double 475*e4b17023SJohn Marino cbrt(long double __x) 476*e4b17023SJohn Marino { return __builtin_cbrtl(__x); } 477*e4b17023SJohn Marino 478*e4b17023SJohn Marino template<typename _Tp> 479*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 480*e4b17023SJohn Marino double>::__type 481*e4b17023SJohn Marino cbrt(_Tp __x) 482*e4b17023SJohn Marino { return __builtin_cbrt(__x); } 483*e4b17023SJohn Marino 484*e4b17023SJohn Marino using std::ceil; 485*e4b17023SJohn Marino 486*e4b17023SJohn Marino inline float 487*e4b17023SJohn Marino copysign(float __x, float __y) 488*e4b17023SJohn Marino { return __builtin_copysignf(__x, __y); } 489*e4b17023SJohn Marino 490*e4b17023SJohn Marino inline long double 491*e4b17023SJohn Marino copysign(long double __x, long double __y) 492*e4b17023SJohn Marino { return __builtin_copysignl(__x, __y); } 493*e4b17023SJohn Marino 494*e4b17023SJohn Marino template<typename _Tp, typename _Up> 495*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 496*e4b17023SJohn Marino copysign(_Tp __x, _Up __y) 497*e4b17023SJohn Marino { 498*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 499*e4b17023SJohn Marino return copysign(__type(__x), __type(__y)); 500*e4b17023SJohn Marino } 501*e4b17023SJohn Marino 502*e4b17023SJohn Marino using std::cos; 503*e4b17023SJohn Marino using std::cosh; 504*e4b17023SJohn Marino 505*e4b17023SJohn Marino inline float 506*e4b17023SJohn Marino erf(float __x) 507*e4b17023SJohn Marino { return __builtin_erff(__x); } 508*e4b17023SJohn Marino 509*e4b17023SJohn Marino inline long double 510*e4b17023SJohn Marino erf(long double __x) 511*e4b17023SJohn Marino { return __builtin_erfl(__x); } 512*e4b17023SJohn Marino 513*e4b17023SJohn Marino template<typename _Tp> 514*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 515*e4b17023SJohn Marino double>::__type 516*e4b17023SJohn Marino erf(_Tp __x) 517*e4b17023SJohn Marino { return __builtin_erf(__x); } 518*e4b17023SJohn Marino 519*e4b17023SJohn Marino inline float 520*e4b17023SJohn Marino erfc(float __x) 521*e4b17023SJohn Marino { return __builtin_erfcf(__x); } 522*e4b17023SJohn Marino 523*e4b17023SJohn Marino inline long double 524*e4b17023SJohn Marino erfc(long double __x) 525*e4b17023SJohn Marino { return __builtin_erfcl(__x); } 526*e4b17023SJohn Marino 527*e4b17023SJohn Marino template<typename _Tp> 528*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 529*e4b17023SJohn Marino double>::__type 530*e4b17023SJohn Marino erfc(_Tp __x) 531*e4b17023SJohn Marino { return __builtin_erfc(__x); } 532*e4b17023SJohn Marino 533*e4b17023SJohn Marino using std::exp; 534*e4b17023SJohn Marino 535*e4b17023SJohn Marino inline float 536*e4b17023SJohn Marino exp2(float __x) 537*e4b17023SJohn Marino { return __builtin_exp2f(__x); } 538*e4b17023SJohn Marino 539*e4b17023SJohn Marino inline long double 540*e4b17023SJohn Marino exp2(long double __x) 541*e4b17023SJohn Marino { return __builtin_exp2l(__x); } 542*e4b17023SJohn Marino 543*e4b17023SJohn Marino template<typename _Tp> 544*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 545*e4b17023SJohn Marino double>::__type 546*e4b17023SJohn Marino exp2(_Tp __x) 547*e4b17023SJohn Marino { return __builtin_exp2(__x); } 548*e4b17023SJohn Marino 549*e4b17023SJohn Marino inline float 550*e4b17023SJohn Marino expm1(float __x) 551*e4b17023SJohn Marino { return __builtin_expm1f(__x); } 552*e4b17023SJohn Marino 553*e4b17023SJohn Marino inline long double 554*e4b17023SJohn Marino expm1(long double __x) 555*e4b17023SJohn Marino { return __builtin_expm1l(__x); } 556*e4b17023SJohn Marino 557*e4b17023SJohn Marino template<typename _Tp> 558*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 559*e4b17023SJohn Marino double>::__type 560*e4b17023SJohn Marino expm1(_Tp __x) 561*e4b17023SJohn Marino { return __builtin_expm1(__x); } 562*e4b17023SJohn Marino 563*e4b17023SJohn Marino // Note: we deal with fabs in a special way, because an using std::fabs 564*e4b17023SJohn Marino // would bring in also the overloads for complex types, which in C++0x 565*e4b17023SJohn Marino // mode have a different return type. 566*e4b17023SJohn Marino // With __CORRECT_ISO_CPP_MATH_H_PROTO1, math.h imports std::fabs in the 567*e4b17023SJohn Marino // global namespace after the declarations of the float / double / long 568*e4b17023SJohn Marino // double overloads but before the std::complex overloads. 569*e4b17023SJohn Marino using ::fabs; 570*e4b17023SJohn Marino 571*e4b17023SJohn Marino#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO1 572*e4b17023SJohn Marino inline float 573*e4b17023SJohn Marino fabs(float __x) 574*e4b17023SJohn Marino { return __builtin_fabsf(__x); } 575*e4b17023SJohn Marino 576*e4b17023SJohn Marino inline long double 577*e4b17023SJohn Marino fabs(long double __x) 578*e4b17023SJohn Marino { return __builtin_fabsl(__x); } 579*e4b17023SJohn Marino 580*e4b17023SJohn Marino template<typename _Tp> 581*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 582*e4b17023SJohn Marino double>::__type 583*e4b17023SJohn Marino fabs(_Tp __x) 584*e4b17023SJohn Marino { return __builtin_fabs(__x); } 585*e4b17023SJohn Marino#endif 586*e4b17023SJohn Marino 587*e4b17023SJohn Marino inline float 588*e4b17023SJohn Marino fdim(float __x, float __y) 589*e4b17023SJohn Marino { return __builtin_fdimf(__x, __y); } 590*e4b17023SJohn Marino 591*e4b17023SJohn Marino inline long double 592*e4b17023SJohn Marino fdim(long double __x, long double __y) 593*e4b17023SJohn Marino { return __builtin_fdiml(__x, __y); } 594*e4b17023SJohn Marino 595*e4b17023SJohn Marino template<typename _Tp, typename _Up> 596*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 597*e4b17023SJohn Marino fdim(_Tp __x, _Up __y) 598*e4b17023SJohn Marino { 599*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 600*e4b17023SJohn Marino return fdim(__type(__x), __type(__y)); 601*e4b17023SJohn Marino } 602*e4b17023SJohn Marino 603*e4b17023SJohn Marino using std::floor; 604*e4b17023SJohn Marino 605*e4b17023SJohn Marino inline float 606*e4b17023SJohn Marino fma(float __x, float __y, float __z) 607*e4b17023SJohn Marino { return __builtin_fmaf(__x, __y, __z); } 608*e4b17023SJohn Marino 609*e4b17023SJohn Marino inline long double 610*e4b17023SJohn Marino fma(long double __x, long double __y, long double __z) 611*e4b17023SJohn Marino { return __builtin_fmal(__x, __y, __z); } 612*e4b17023SJohn Marino 613*e4b17023SJohn Marino template<typename _Tp, typename _Up, typename _Vp> 614*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type 615*e4b17023SJohn Marino fma(_Tp __x, _Up __y, _Vp __z) 616*e4b17023SJohn Marino { 617*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type; 618*e4b17023SJohn Marino return fma(__type(__x), __type(__y), __type(__z)); 619*e4b17023SJohn Marino } 620*e4b17023SJohn Marino 621*e4b17023SJohn Marino inline float 622*e4b17023SJohn Marino fmax(float __x, float __y) 623*e4b17023SJohn Marino { return __builtin_fmaxf(__x, __y); } 624*e4b17023SJohn Marino 625*e4b17023SJohn Marino inline long double 626*e4b17023SJohn Marino fmax(long double __x, long double __y) 627*e4b17023SJohn Marino { return __builtin_fmaxl(__x, __y); } 628*e4b17023SJohn Marino 629*e4b17023SJohn Marino template<typename _Tp, typename _Up> 630*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 631*e4b17023SJohn Marino fmax(_Tp __x, _Up __y) 632*e4b17023SJohn Marino { 633*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 634*e4b17023SJohn Marino return fmax(__type(__x), __type(__y)); 635*e4b17023SJohn Marino } 636*e4b17023SJohn Marino 637*e4b17023SJohn Marino inline float 638*e4b17023SJohn Marino fmin(float __x, float __y) 639*e4b17023SJohn Marino { return __builtin_fminf(__x, __y); } 640*e4b17023SJohn Marino 641*e4b17023SJohn Marino inline long double 642*e4b17023SJohn Marino fmin(long double __x, long double __y) 643*e4b17023SJohn Marino { return __builtin_fminl(__x, __y); } 644*e4b17023SJohn Marino 645*e4b17023SJohn Marino template<typename _Tp, typename _Up> 646*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 647*e4b17023SJohn Marino fmin(_Tp __x, _Up __y) 648*e4b17023SJohn Marino { 649*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 650*e4b17023SJohn Marino return fmin(__type(__x), __type(__y)); 651*e4b17023SJohn Marino } 652*e4b17023SJohn Marino 653*e4b17023SJohn Marino using std::fmod; 654*e4b17023SJohn Marino using std::frexp; 655*e4b17023SJohn Marino 656*e4b17023SJohn Marino inline float 657*e4b17023SJohn Marino hypot(float __x, float __y) 658*e4b17023SJohn Marino { return __builtin_hypotf(__x, __y); } 659*e4b17023SJohn Marino 660*e4b17023SJohn Marino inline long double 661*e4b17023SJohn Marino hypot(long double __x, long double __y) 662*e4b17023SJohn Marino { return __builtin_hypotl(__x, __y); } 663*e4b17023SJohn Marino 664*e4b17023SJohn Marino template<typename _Tp, typename _Up> 665*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 666*e4b17023SJohn Marino hypot(_Tp __y, _Up __x) 667*e4b17023SJohn Marino { 668*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 669*e4b17023SJohn Marino return hypot(__type(__y), __type(__x)); 670*e4b17023SJohn Marino } 671*e4b17023SJohn Marino 672*e4b17023SJohn Marino inline int 673*e4b17023SJohn Marino ilogb(float __x) 674*e4b17023SJohn Marino { return __builtin_ilogbf(__x); } 675*e4b17023SJohn Marino 676*e4b17023SJohn Marino inline int 677*e4b17023SJohn Marino ilogb(long double __x) 678*e4b17023SJohn Marino { return __builtin_ilogbl(__x); } 679*e4b17023SJohn Marino 680*e4b17023SJohn Marino template<typename _Tp> 681*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 682*e4b17023SJohn Marino int>::__type 683*e4b17023SJohn Marino ilogb(_Tp __x) 684*e4b17023SJohn Marino { return __builtin_ilogb(__x); } 685*e4b17023SJohn Marino 686*e4b17023SJohn Marino using std::ldexp; 687*e4b17023SJohn Marino 688*e4b17023SJohn Marino inline float 689*e4b17023SJohn Marino lgamma(float __x) 690*e4b17023SJohn Marino { return __builtin_lgammaf(__x); } 691*e4b17023SJohn Marino 692*e4b17023SJohn Marino inline long double 693*e4b17023SJohn Marino lgamma(long double __x) 694*e4b17023SJohn Marino { return __builtin_lgammal(__x); } 695*e4b17023SJohn Marino 696*e4b17023SJohn Marino template<typename _Tp> 697*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 698*e4b17023SJohn Marino double>::__type 699*e4b17023SJohn Marino lgamma(_Tp __x) 700*e4b17023SJohn Marino { return __builtin_lgamma(__x); } 701*e4b17023SJohn Marino 702*e4b17023SJohn Marino inline long long 703*e4b17023SJohn Marino llrint(float __x) 704*e4b17023SJohn Marino { return __builtin_llrintf(__x); } 705*e4b17023SJohn Marino 706*e4b17023SJohn Marino inline long long 707*e4b17023SJohn Marino llrint(long double __x) 708*e4b17023SJohn Marino { return __builtin_llrintl(__x); } 709*e4b17023SJohn Marino 710*e4b17023SJohn Marino template<typename _Tp> 711*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 712*e4b17023SJohn Marino long long>::__type 713*e4b17023SJohn Marino llrint(_Tp __x) 714*e4b17023SJohn Marino { return __builtin_llrint(__x); } 715*e4b17023SJohn Marino 716*e4b17023SJohn Marino inline long long 717*e4b17023SJohn Marino llround(float __x) 718*e4b17023SJohn Marino { return __builtin_llroundf(__x); } 719*e4b17023SJohn Marino 720*e4b17023SJohn Marino inline long long 721*e4b17023SJohn Marino llround(long double __x) 722*e4b17023SJohn Marino { return __builtin_llroundl(__x); } 723*e4b17023SJohn Marino 724*e4b17023SJohn Marino template<typename _Tp> 725*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 726*e4b17023SJohn Marino long long>::__type 727*e4b17023SJohn Marino llround(_Tp __x) 728*e4b17023SJohn Marino { return __builtin_llround(__x); } 729*e4b17023SJohn Marino 730*e4b17023SJohn Marino using std::log; 731*e4b17023SJohn Marino using std::log10; 732*e4b17023SJohn Marino 733*e4b17023SJohn Marino inline float 734*e4b17023SJohn Marino log1p(float __x) 735*e4b17023SJohn Marino { return __builtin_log1pf(__x); } 736*e4b17023SJohn Marino 737*e4b17023SJohn Marino inline long double 738*e4b17023SJohn Marino log1p(long double __x) 739*e4b17023SJohn Marino { return __builtin_log1pl(__x); } 740*e4b17023SJohn Marino 741*e4b17023SJohn Marino template<typename _Tp> 742*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 743*e4b17023SJohn Marino double>::__type 744*e4b17023SJohn Marino log1p(_Tp __x) 745*e4b17023SJohn Marino { return __builtin_log1p(__x); } 746*e4b17023SJohn Marino 747*e4b17023SJohn Marino // DR 568. 748*e4b17023SJohn Marino inline float 749*e4b17023SJohn Marino log2(float __x) 750*e4b17023SJohn Marino { return __builtin_log2f(__x); } 751*e4b17023SJohn Marino 752*e4b17023SJohn Marino inline long double 753*e4b17023SJohn Marino log2(long double __x) 754*e4b17023SJohn Marino { return __builtin_log2l(__x); } 755*e4b17023SJohn Marino 756*e4b17023SJohn Marino template<typename _Tp> 757*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 758*e4b17023SJohn Marino double>::__type 759*e4b17023SJohn Marino log2(_Tp __x) 760*e4b17023SJohn Marino { return __builtin_log2(__x); } 761*e4b17023SJohn Marino 762*e4b17023SJohn Marino inline float 763*e4b17023SJohn Marino logb(float __x) 764*e4b17023SJohn Marino { return __builtin_logbf(__x); } 765*e4b17023SJohn Marino 766*e4b17023SJohn Marino inline long double 767*e4b17023SJohn Marino logb(long double __x) 768*e4b17023SJohn Marino { return __builtin_logbl(__x); } 769*e4b17023SJohn Marino 770*e4b17023SJohn Marino template<typename _Tp> 771*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 772*e4b17023SJohn Marino double>::__type 773*e4b17023SJohn Marino logb(_Tp __x) 774*e4b17023SJohn Marino { 775*e4b17023SJohn Marino return __builtin_logb(__x); 776*e4b17023SJohn Marino } 777*e4b17023SJohn Marino 778*e4b17023SJohn Marino inline long 779*e4b17023SJohn Marino lrint(float __x) 780*e4b17023SJohn Marino { return __builtin_lrintf(__x); } 781*e4b17023SJohn Marino 782*e4b17023SJohn Marino inline long 783*e4b17023SJohn Marino lrint(long double __x) 784*e4b17023SJohn Marino { return __builtin_lrintl(__x); } 785*e4b17023SJohn Marino 786*e4b17023SJohn Marino template<typename _Tp> 787*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 788*e4b17023SJohn Marino long>::__type 789*e4b17023SJohn Marino lrint(_Tp __x) 790*e4b17023SJohn Marino { return __builtin_lrint(__x); } 791*e4b17023SJohn Marino 792*e4b17023SJohn Marino inline long 793*e4b17023SJohn Marino lround(float __x) 794*e4b17023SJohn Marino { return __builtin_lroundf(__x); } 795*e4b17023SJohn Marino 796*e4b17023SJohn Marino inline long 797*e4b17023SJohn Marino lround(long double __x) 798*e4b17023SJohn Marino { return __builtin_lroundl(__x); } 799*e4b17023SJohn Marino 800*e4b17023SJohn Marino template<typename _Tp> 801*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 802*e4b17023SJohn Marino long>::__type 803*e4b17023SJohn Marino lround(_Tp __x) 804*e4b17023SJohn Marino { return __builtin_lround(__x); } 805*e4b17023SJohn Marino 806*e4b17023SJohn Marino inline float 807*e4b17023SJohn Marino nearbyint(float __x) 808*e4b17023SJohn Marino { return __builtin_nearbyintf(__x); } 809*e4b17023SJohn Marino 810*e4b17023SJohn Marino inline long double 811*e4b17023SJohn Marino nearbyint(long double __x) 812*e4b17023SJohn Marino { return __builtin_nearbyintl(__x); } 813*e4b17023SJohn Marino 814*e4b17023SJohn Marino template<typename _Tp> 815*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 816*e4b17023SJohn Marino double>::__type 817*e4b17023SJohn Marino nearbyint(_Tp __x) 818*e4b17023SJohn Marino { return __builtin_nearbyint(__x); } 819*e4b17023SJohn Marino 820*e4b17023SJohn Marino inline float 821*e4b17023SJohn Marino nextafter(float __x, float __y) 822*e4b17023SJohn Marino { return __builtin_nextafterf(__x, __y); } 823*e4b17023SJohn Marino 824*e4b17023SJohn Marino inline long double 825*e4b17023SJohn Marino nextafter(long double __x, long double __y) 826*e4b17023SJohn Marino { return __builtin_nextafterl(__x, __y); } 827*e4b17023SJohn Marino 828*e4b17023SJohn Marino template<typename _Tp, typename _Up> 829*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 830*e4b17023SJohn Marino nextafter(_Tp __x, _Up __y) 831*e4b17023SJohn Marino { 832*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 833*e4b17023SJohn Marino return nextafter(__type(__x), __type(__y)); 834*e4b17023SJohn Marino } 835*e4b17023SJohn Marino 836*e4b17023SJohn Marino inline float 837*e4b17023SJohn Marino nexttoward(float __x, long double __y) 838*e4b17023SJohn Marino { return __builtin_nexttowardf(__x, __y); } 839*e4b17023SJohn Marino 840*e4b17023SJohn Marino inline long double 841*e4b17023SJohn Marino nexttoward(long double __x, long double __y) 842*e4b17023SJohn Marino { return __builtin_nexttowardl(__x, __y); } 843*e4b17023SJohn Marino 844*e4b17023SJohn Marino template<typename _Tp> 845*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 846*e4b17023SJohn Marino double>::__type 847*e4b17023SJohn Marino nexttoward(_Tp __x, long double __y) 848*e4b17023SJohn Marino { return __builtin_nexttoward(__x, __y); } 849*e4b17023SJohn Marino 850*e4b17023SJohn Marino // DR 550. What should the return type of pow(float,int) be? 851*e4b17023SJohn Marino // NB: C++0x and TR1 != C++03. 852*e4b17023SJohn Marino // using std::pow; 853*e4b17023SJohn Marino 854*e4b17023SJohn Marino inline float 855*e4b17023SJohn Marino remainder(float __x, float __y) 856*e4b17023SJohn Marino { return __builtin_remainderf(__x, __y); } 857*e4b17023SJohn Marino 858*e4b17023SJohn Marino inline long double 859*e4b17023SJohn Marino remainder(long double __x, long double __y) 860*e4b17023SJohn Marino { return __builtin_remainderl(__x, __y); } 861*e4b17023SJohn Marino 862*e4b17023SJohn Marino template<typename _Tp, typename _Up> 863*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 864*e4b17023SJohn Marino remainder(_Tp __x, _Up __y) 865*e4b17023SJohn Marino { 866*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 867*e4b17023SJohn Marino return remainder(__type(__x), __type(__y)); 868*e4b17023SJohn Marino } 869*e4b17023SJohn Marino 870*e4b17023SJohn Marino inline float 871*e4b17023SJohn Marino remquo(float __x, float __y, int* __pquo) 872*e4b17023SJohn Marino { return __builtin_remquof(__x, __y, __pquo); } 873*e4b17023SJohn Marino 874*e4b17023SJohn Marino inline long double 875*e4b17023SJohn Marino remquo(long double __x, long double __y, int* __pquo) 876*e4b17023SJohn Marino { return __builtin_remquol(__x, __y, __pquo); } 877*e4b17023SJohn Marino 878*e4b17023SJohn Marino template<typename _Tp, typename _Up> 879*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 880*e4b17023SJohn Marino remquo(_Tp __x, _Up __y, int* __pquo) 881*e4b17023SJohn Marino { 882*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 883*e4b17023SJohn Marino return remquo(__type(__x), __type(__y), __pquo); 884*e4b17023SJohn Marino } 885*e4b17023SJohn Marino 886*e4b17023SJohn Marino inline float 887*e4b17023SJohn Marino rint(float __x) 888*e4b17023SJohn Marino { return __builtin_rintf(__x); } 889*e4b17023SJohn Marino 890*e4b17023SJohn Marino inline long double 891*e4b17023SJohn Marino rint(long double __x) 892*e4b17023SJohn Marino { return __builtin_rintl(__x); } 893*e4b17023SJohn Marino 894*e4b17023SJohn Marino template<typename _Tp> 895*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 896*e4b17023SJohn Marino double>::__type 897*e4b17023SJohn Marino rint(_Tp __x) 898*e4b17023SJohn Marino { return __builtin_rint(__x); } 899*e4b17023SJohn Marino 900*e4b17023SJohn Marino inline float 901*e4b17023SJohn Marino round(float __x) 902*e4b17023SJohn Marino { return __builtin_roundf(__x); } 903*e4b17023SJohn Marino 904*e4b17023SJohn Marino inline long double 905*e4b17023SJohn Marino round(long double __x) 906*e4b17023SJohn Marino { return __builtin_roundl(__x); } 907*e4b17023SJohn Marino 908*e4b17023SJohn Marino template<typename _Tp> 909*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 910*e4b17023SJohn Marino double>::__type 911*e4b17023SJohn Marino round(_Tp __x) 912*e4b17023SJohn Marino { return __builtin_round(__x); } 913*e4b17023SJohn Marino 914*e4b17023SJohn Marino inline float 915*e4b17023SJohn Marino scalbln(float __x, long __ex) 916*e4b17023SJohn Marino { return __builtin_scalblnf(__x, __ex); } 917*e4b17023SJohn Marino 918*e4b17023SJohn Marino inline long double 919*e4b17023SJohn Marino scalbln(long double __x, long __ex) 920*e4b17023SJohn Marino { return __builtin_scalblnl(__x, __ex); } 921*e4b17023SJohn Marino 922*e4b17023SJohn Marino template<typename _Tp> 923*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 924*e4b17023SJohn Marino double>::__type 925*e4b17023SJohn Marino scalbln(_Tp __x, long __ex) 926*e4b17023SJohn Marino { return __builtin_scalbln(__x, __ex); } 927*e4b17023SJohn Marino 928*e4b17023SJohn Marino inline float 929*e4b17023SJohn Marino scalbn(float __x, int __ex) 930*e4b17023SJohn Marino { return __builtin_scalbnf(__x, __ex); } 931*e4b17023SJohn Marino 932*e4b17023SJohn Marino inline long double 933*e4b17023SJohn Marino scalbn(long double __x, int __ex) 934*e4b17023SJohn Marino { return __builtin_scalbnl(__x, __ex); } 935*e4b17023SJohn Marino 936*e4b17023SJohn Marino template<typename _Tp> 937*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 938*e4b17023SJohn Marino double>::__type 939*e4b17023SJohn Marino scalbn(_Tp __x, int __ex) 940*e4b17023SJohn Marino { return __builtin_scalbn(__x, __ex); } 941*e4b17023SJohn Marino 942*e4b17023SJohn Marino using std::sin; 943*e4b17023SJohn Marino using std::sinh; 944*e4b17023SJohn Marino using std::sqrt; 945*e4b17023SJohn Marino using std::tan; 946*e4b17023SJohn Marino using std::tanh; 947*e4b17023SJohn Marino 948*e4b17023SJohn Marino inline float 949*e4b17023SJohn Marino tgamma(float __x) 950*e4b17023SJohn Marino { return __builtin_tgammaf(__x); } 951*e4b17023SJohn Marino 952*e4b17023SJohn Marino inline long double 953*e4b17023SJohn Marino tgamma(long double __x) 954*e4b17023SJohn Marino { return __builtin_tgammal(__x); } 955*e4b17023SJohn Marino 956*e4b17023SJohn Marino template<typename _Tp> 957*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 958*e4b17023SJohn Marino double>::__type 959*e4b17023SJohn Marino tgamma(_Tp __x) 960*e4b17023SJohn Marino { return __builtin_tgamma(__x); } 961*e4b17023SJohn Marino 962*e4b17023SJohn Marino inline float 963*e4b17023SJohn Marino trunc(float __x) 964*e4b17023SJohn Marino { return __builtin_truncf(__x); } 965*e4b17023SJohn Marino 966*e4b17023SJohn Marino inline long double 967*e4b17023SJohn Marino trunc(long double __x) 968*e4b17023SJohn Marino { return __builtin_truncl(__x); } 969*e4b17023SJohn Marino 970*e4b17023SJohn Marino template<typename _Tp> 971*e4b17023SJohn Marino inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 972*e4b17023SJohn Marino double>::__type 973*e4b17023SJohn Marino trunc(_Tp __x) 974*e4b17023SJohn Marino { return __builtin_trunc(__x); } 975*e4b17023SJohn Marino 976*e4b17023SJohn Marino#endif 977*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 978*e4b17023SJohn Marino} 979*e4b17023SJohn Marino} 980*e4b17023SJohn Marino 981*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default) 982*e4b17023SJohn Marino{ 983*e4b17023SJohn Marinonamespace tr1 984*e4b17023SJohn Marino{ 985*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 986*e4b17023SJohn Marino 987*e4b17023SJohn Marino // DR 550. What should the return type of pow(float,int) be? 988*e4b17023SJohn Marino // NB: C++0x and TR1 != C++03. 989*e4b17023SJohn Marino inline double 990*e4b17023SJohn Marino pow(double __x, double __y) 991*e4b17023SJohn Marino { return std::pow(__x, __y); } 992*e4b17023SJohn Marino 993*e4b17023SJohn Marino inline float 994*e4b17023SJohn Marino pow(float __x, float __y) 995*e4b17023SJohn Marino { return std::pow(__x, __y); } 996*e4b17023SJohn Marino 997*e4b17023SJohn Marino inline long double 998*e4b17023SJohn Marino pow(long double __x, long double __y) 999*e4b17023SJohn Marino { return std::pow(__x, __y); } 1000*e4b17023SJohn Marino 1001*e4b17023SJohn Marino template<typename _Tp, typename _Up> 1002*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1003*e4b17023SJohn Marino pow(_Tp __x, _Up __y) 1004*e4b17023SJohn Marino { 1005*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1006*e4b17023SJohn Marino return std::pow(__type(__x), __type(__y)); 1007*e4b17023SJohn Marino } 1008*e4b17023SJohn Marino 1009*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 1010*e4b17023SJohn Marino} 1011*e4b17023SJohn Marino} 1012*e4b17023SJohn Marino 1013*e4b17023SJohn Marino#include <bits/stl_algobase.h> 1014*e4b17023SJohn Marino#include <limits> 1015*e4b17023SJohn Marino#include <tr1/type_traits> 1016*e4b17023SJohn Marino 1017*e4b17023SJohn Marino#include <tr1/gamma.tcc> 1018*e4b17023SJohn Marino#include <tr1/bessel_function.tcc> 1019*e4b17023SJohn Marino#include <tr1/beta_function.tcc> 1020*e4b17023SJohn Marino#include <tr1/ell_integral.tcc> 1021*e4b17023SJohn Marino#include <tr1/exp_integral.tcc> 1022*e4b17023SJohn Marino#include <tr1/hypergeometric.tcc> 1023*e4b17023SJohn Marino#include <tr1/legendre_function.tcc> 1024*e4b17023SJohn Marino#include <tr1/modified_bessel_func.tcc> 1025*e4b17023SJohn Marino#include <tr1/poly_hermite.tcc> 1026*e4b17023SJohn Marino#include <tr1/poly_laguerre.tcc> 1027*e4b17023SJohn Marino#include <tr1/riemann_zeta.tcc> 1028*e4b17023SJohn Marino 1029*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default) 1030*e4b17023SJohn Marino{ 1031*e4b17023SJohn Marinonamespace tr1 1032*e4b17023SJohn Marino{ 1033*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 1034*e4b17023SJohn Marino 1035*e4b17023SJohn Marino /** 1036*e4b17023SJohn Marino * @defgroup tr1_math_spec_func Mathematical Special Functions 1037*e4b17023SJohn Marino * @ingroup numerics 1038*e4b17023SJohn Marino * 1039*e4b17023SJohn Marino * A collection of advanced mathematical special functions. 1040*e4b17023SJohn Marino * @{ 1041*e4b17023SJohn Marino */ 1042*e4b17023SJohn Marino 1043*e4b17023SJohn Marino inline float 1044*e4b17023SJohn Marino assoc_laguerref(unsigned int __n, unsigned int __m, float __x) 1045*e4b17023SJohn Marino { return __detail::__assoc_laguerre<float>(__n, __m, __x); } 1046*e4b17023SJohn Marino 1047*e4b17023SJohn Marino inline long double 1048*e4b17023SJohn Marino assoc_laguerrel(unsigned int __n, unsigned int __m, long double __x) 1049*e4b17023SJohn Marino { 1050*e4b17023SJohn Marino return __detail::__assoc_laguerre<long double>(__n, __m, __x); 1051*e4b17023SJohn Marino } 1052*e4b17023SJohn Marino 1053*e4b17023SJohn Marino /// 5.2.1.1 Associated Laguerre polynomials. 1054*e4b17023SJohn Marino template<typename _Tp> 1055*e4b17023SJohn Marino inline typename __gnu_cxx::__promote<_Tp>::__type 1056*e4b17023SJohn Marino assoc_laguerre(unsigned int __n, unsigned int __m, _Tp __x) 1057*e4b17023SJohn Marino { 1058*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1059*e4b17023SJohn Marino return __detail::__assoc_laguerre<__type>(__n, __m, __x); 1060*e4b17023SJohn Marino } 1061*e4b17023SJohn Marino 1062*e4b17023SJohn Marino inline float 1063*e4b17023SJohn Marino assoc_legendref(unsigned int __l, unsigned int __m, float __x) 1064*e4b17023SJohn Marino { return __detail::__assoc_legendre_p<float>(__l, __m, __x); } 1065*e4b17023SJohn Marino 1066*e4b17023SJohn Marino inline long double 1067*e4b17023SJohn Marino assoc_legendrel(unsigned int __l, unsigned int __m, long double __x) 1068*e4b17023SJohn Marino { return __detail::__assoc_legendre_p<long double>(__l, __m, __x); } 1069*e4b17023SJohn Marino 1070*e4b17023SJohn Marino /// 5.2.1.2 Associated Legendre functions. 1071*e4b17023SJohn Marino template<typename _Tp> 1072*e4b17023SJohn Marino inline typename __gnu_cxx::__promote<_Tp>::__type 1073*e4b17023SJohn Marino assoc_legendre(unsigned int __l, unsigned int __m, _Tp __x) 1074*e4b17023SJohn Marino { 1075*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1076*e4b17023SJohn Marino return __detail::__assoc_legendre_p<__type>(__l, __m, __x); 1077*e4b17023SJohn Marino } 1078*e4b17023SJohn Marino 1079*e4b17023SJohn Marino inline float 1080*e4b17023SJohn Marino betaf(float __x, float __y) 1081*e4b17023SJohn Marino { return __detail::__beta<float>(__x, __y); } 1082*e4b17023SJohn Marino 1083*e4b17023SJohn Marino inline long double 1084*e4b17023SJohn Marino betal(long double __x, long double __y) 1085*e4b17023SJohn Marino { return __detail::__beta<long double>(__x, __y); } 1086*e4b17023SJohn Marino 1087*e4b17023SJohn Marino /// 5.2.1.3 Beta functions. 1088*e4b17023SJohn Marino template<typename _Tpx, typename _Tpy> 1089*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tpx, _Tpy>::__type 1090*e4b17023SJohn Marino beta(_Tpx __x, _Tpy __y) 1091*e4b17023SJohn Marino { 1092*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tpx, _Tpy>::__type __type; 1093*e4b17023SJohn Marino return __detail::__beta<__type>(__x, __y); 1094*e4b17023SJohn Marino } 1095*e4b17023SJohn Marino 1096*e4b17023SJohn Marino inline float 1097*e4b17023SJohn Marino comp_ellint_1f(float __k) 1098*e4b17023SJohn Marino { return __detail::__comp_ellint_1<float>(__k); } 1099*e4b17023SJohn Marino 1100*e4b17023SJohn Marino inline long double 1101*e4b17023SJohn Marino comp_ellint_1l(long double __k) 1102*e4b17023SJohn Marino { return __detail::__comp_ellint_1<long double>(__k); } 1103*e4b17023SJohn Marino 1104*e4b17023SJohn Marino /// 5.2.1.4 Complete elliptic integrals of the first kind. 1105*e4b17023SJohn Marino template<typename _Tp> 1106*e4b17023SJohn Marino inline typename __gnu_cxx::__promote<_Tp>::__type 1107*e4b17023SJohn Marino comp_ellint_1(_Tp __k) 1108*e4b17023SJohn Marino { 1109*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1110*e4b17023SJohn Marino return __detail::__comp_ellint_1<__type>(__k); 1111*e4b17023SJohn Marino } 1112*e4b17023SJohn Marino 1113*e4b17023SJohn Marino inline float 1114*e4b17023SJohn Marino comp_ellint_2f(float __k) 1115*e4b17023SJohn Marino { return __detail::__comp_ellint_2<float>(__k); } 1116*e4b17023SJohn Marino 1117*e4b17023SJohn Marino inline long double 1118*e4b17023SJohn Marino comp_ellint_2l(long double __k) 1119*e4b17023SJohn Marino { return __detail::__comp_ellint_2<long double>(__k); } 1120*e4b17023SJohn Marino 1121*e4b17023SJohn Marino /// 5.2.1.5 Complete elliptic integrals of the second kind. 1122*e4b17023SJohn Marino template<typename _Tp> 1123*e4b17023SJohn Marino inline typename __gnu_cxx::__promote<_Tp>::__type 1124*e4b17023SJohn Marino comp_ellint_2(_Tp __k) 1125*e4b17023SJohn Marino { 1126*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1127*e4b17023SJohn Marino return __detail::__comp_ellint_2<__type>(__k); 1128*e4b17023SJohn Marino } 1129*e4b17023SJohn Marino 1130*e4b17023SJohn Marino inline float 1131*e4b17023SJohn Marino comp_ellint_3f(float __k, float __nu) 1132*e4b17023SJohn Marino { return __detail::__comp_ellint_3<float>(__k, __nu); } 1133*e4b17023SJohn Marino 1134*e4b17023SJohn Marino inline long double 1135*e4b17023SJohn Marino comp_ellint_3l(long double __k, long double __nu) 1136*e4b17023SJohn Marino { return __detail::__comp_ellint_3<long double>(__k, __nu); } 1137*e4b17023SJohn Marino 1138*e4b17023SJohn Marino /// 5.2.1.6 Complete elliptic integrals of the third kind. 1139*e4b17023SJohn Marino template<typename _Tp, typename _Tpn> 1140*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type 1141*e4b17023SJohn Marino comp_ellint_3(_Tp __k, _Tpn __nu) 1142*e4b17023SJohn Marino { 1143*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type __type; 1144*e4b17023SJohn Marino return __detail::__comp_ellint_3<__type>(__k, __nu); 1145*e4b17023SJohn Marino } 1146*e4b17023SJohn Marino 1147*e4b17023SJohn Marino inline float 1148*e4b17023SJohn Marino conf_hypergf(float __a, float __c, float __x) 1149*e4b17023SJohn Marino { return __detail::__conf_hyperg<float>(__a, __c, __x); } 1150*e4b17023SJohn Marino 1151*e4b17023SJohn Marino inline long double 1152*e4b17023SJohn Marino conf_hypergl(long double __a, long double __c, long double __x) 1153*e4b17023SJohn Marino { return __detail::__conf_hyperg<long double>(__a, __c, __x); } 1154*e4b17023SJohn Marino 1155*e4b17023SJohn Marino /// 5.2.1.7 Confluent hypergeometric functions. 1156*e4b17023SJohn Marino template<typename _Tpa, typename _Tpc, typename _Tp> 1157*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type 1158*e4b17023SJohn Marino conf_hyperg(_Tpa __a, _Tpc __c, _Tp __x) 1159*e4b17023SJohn Marino { 1160*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type __type; 1161*e4b17023SJohn Marino return __detail::__conf_hyperg<__type>(__a, __c, __x); 1162*e4b17023SJohn Marino } 1163*e4b17023SJohn Marino 1164*e4b17023SJohn Marino inline float 1165*e4b17023SJohn Marino cyl_bessel_if(float __nu, float __x) 1166*e4b17023SJohn Marino { return __detail::__cyl_bessel_i<float>(__nu, __x); } 1167*e4b17023SJohn Marino 1168*e4b17023SJohn Marino inline long double 1169*e4b17023SJohn Marino cyl_bessel_il(long double __nu, long double __x) 1170*e4b17023SJohn Marino { return __detail::__cyl_bessel_i<long double>(__nu, __x); } 1171*e4b17023SJohn Marino 1172*e4b17023SJohn Marino /// 5.2.1.8 Regular modified cylindrical Bessel functions. 1173*e4b17023SJohn Marino template<typename _Tpnu, typename _Tp> 1174*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type 1175*e4b17023SJohn Marino cyl_bessel_i(_Tpnu __nu, _Tp __x) 1176*e4b17023SJohn Marino { 1177*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type; 1178*e4b17023SJohn Marino return __detail::__cyl_bessel_i<__type>(__nu, __x); 1179*e4b17023SJohn Marino } 1180*e4b17023SJohn Marino 1181*e4b17023SJohn Marino inline float 1182*e4b17023SJohn Marino cyl_bessel_jf(float __nu, float __x) 1183*e4b17023SJohn Marino { return __detail::__cyl_bessel_j<float>(__nu, __x); } 1184*e4b17023SJohn Marino 1185*e4b17023SJohn Marino inline long double 1186*e4b17023SJohn Marino cyl_bessel_jl(long double __nu, long double __x) 1187*e4b17023SJohn Marino { return __detail::__cyl_bessel_j<long double>(__nu, __x); } 1188*e4b17023SJohn Marino 1189*e4b17023SJohn Marino /// 5.2.1.9 Cylindrical Bessel functions (of the first kind). 1190*e4b17023SJohn Marino template<typename _Tpnu, typename _Tp> 1191*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type 1192*e4b17023SJohn Marino cyl_bessel_j(_Tpnu __nu, _Tp __x) 1193*e4b17023SJohn Marino { 1194*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type; 1195*e4b17023SJohn Marino return __detail::__cyl_bessel_j<__type>(__nu, __x); 1196*e4b17023SJohn Marino } 1197*e4b17023SJohn Marino 1198*e4b17023SJohn Marino inline float 1199*e4b17023SJohn Marino cyl_bessel_kf(float __nu, float __x) 1200*e4b17023SJohn Marino { return __detail::__cyl_bessel_k<float>(__nu, __x); } 1201*e4b17023SJohn Marino 1202*e4b17023SJohn Marino inline long double 1203*e4b17023SJohn Marino cyl_bessel_kl(long double __nu, long double __x) 1204*e4b17023SJohn Marino { return __detail::__cyl_bessel_k<long double>(__nu, __x); } 1205*e4b17023SJohn Marino 1206*e4b17023SJohn Marino /// 5.2.1.10 Irregular modified cylindrical Bessel functions. 1207*e4b17023SJohn Marino template<typename _Tpnu, typename _Tp> 1208*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type 1209*e4b17023SJohn Marino cyl_bessel_k(_Tpnu __nu, _Tp __x) 1210*e4b17023SJohn Marino { 1211*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type; 1212*e4b17023SJohn Marino return __detail::__cyl_bessel_k<__type>(__nu, __x); 1213*e4b17023SJohn Marino } 1214*e4b17023SJohn Marino 1215*e4b17023SJohn Marino inline float 1216*e4b17023SJohn Marino cyl_neumannf(float __nu, float __x) 1217*e4b17023SJohn Marino { return __detail::__cyl_neumann_n<float>(__nu, __x); } 1218*e4b17023SJohn Marino 1219*e4b17023SJohn Marino inline long double 1220*e4b17023SJohn Marino cyl_neumannl(long double __nu, long double __x) 1221*e4b17023SJohn Marino { return __detail::__cyl_neumann_n<long double>(__nu, __x); } 1222*e4b17023SJohn Marino 1223*e4b17023SJohn Marino /// 5.2.1.11 Cylindrical Neumann functions. 1224*e4b17023SJohn Marino template<typename _Tpnu, typename _Tp> 1225*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type 1226*e4b17023SJohn Marino cyl_neumann(_Tpnu __nu, _Tp __x) 1227*e4b17023SJohn Marino { 1228*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type; 1229*e4b17023SJohn Marino return __detail::__cyl_neumann_n<__type>(__nu, __x); 1230*e4b17023SJohn Marino } 1231*e4b17023SJohn Marino 1232*e4b17023SJohn Marino inline float 1233*e4b17023SJohn Marino ellint_1f(float __k, float __phi) 1234*e4b17023SJohn Marino { return __detail::__ellint_1<float>(__k, __phi); } 1235*e4b17023SJohn Marino 1236*e4b17023SJohn Marino inline long double 1237*e4b17023SJohn Marino ellint_1l(long double __k, long double __phi) 1238*e4b17023SJohn Marino { return __detail::__ellint_1<long double>(__k, __phi); } 1239*e4b17023SJohn Marino 1240*e4b17023SJohn Marino /// 5.2.1.12 Incomplete elliptic integrals of the first kind. 1241*e4b17023SJohn Marino template<typename _Tp, typename _Tpp> 1242*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type 1243*e4b17023SJohn Marino ellint_1(_Tp __k, _Tpp __phi) 1244*e4b17023SJohn Marino { 1245*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type; 1246*e4b17023SJohn Marino return __detail::__ellint_1<__type>(__k, __phi); 1247*e4b17023SJohn Marino } 1248*e4b17023SJohn Marino 1249*e4b17023SJohn Marino inline float 1250*e4b17023SJohn Marino ellint_2f(float __k, float __phi) 1251*e4b17023SJohn Marino { return __detail::__ellint_2<float>(__k, __phi); } 1252*e4b17023SJohn Marino 1253*e4b17023SJohn Marino inline long double 1254*e4b17023SJohn Marino ellint_2l(long double __k, long double __phi) 1255*e4b17023SJohn Marino { return __detail::__ellint_2<long double>(__k, __phi); } 1256*e4b17023SJohn Marino 1257*e4b17023SJohn Marino /// 5.2.1.13 Incomplete elliptic integrals of the second kind. 1258*e4b17023SJohn Marino template<typename _Tp, typename _Tpp> 1259*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type 1260*e4b17023SJohn Marino ellint_2(_Tp __k, _Tpp __phi) 1261*e4b17023SJohn Marino { 1262*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type; 1263*e4b17023SJohn Marino return __detail::__ellint_2<__type>(__k, __phi); 1264*e4b17023SJohn Marino } 1265*e4b17023SJohn Marino 1266*e4b17023SJohn Marino inline float 1267*e4b17023SJohn Marino ellint_3f(float __k, float __nu, float __phi) 1268*e4b17023SJohn Marino { return __detail::__ellint_3<float>(__k, __nu, __phi); } 1269*e4b17023SJohn Marino 1270*e4b17023SJohn Marino inline long double 1271*e4b17023SJohn Marino ellint_3l(long double __k, long double __nu, long double __phi) 1272*e4b17023SJohn Marino { return __detail::__ellint_3<long double>(__k, __nu, __phi); } 1273*e4b17023SJohn Marino 1274*e4b17023SJohn Marino /// 5.2.1.14 Incomplete elliptic integrals of the third kind. 1275*e4b17023SJohn Marino template<typename _Tp, typename _Tpn, typename _Tpp> 1276*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type 1277*e4b17023SJohn Marino ellint_3(_Tp __k, _Tpn __nu, _Tpp __phi) 1278*e4b17023SJohn Marino { 1279*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type __type; 1280*e4b17023SJohn Marino return __detail::__ellint_3<__type>(__k, __nu, __phi); 1281*e4b17023SJohn Marino } 1282*e4b17023SJohn Marino 1283*e4b17023SJohn Marino inline float 1284*e4b17023SJohn Marino expintf(float __x) 1285*e4b17023SJohn Marino { return __detail::__expint<float>(__x); } 1286*e4b17023SJohn Marino 1287*e4b17023SJohn Marino inline long double 1288*e4b17023SJohn Marino expintl(long double __x) 1289*e4b17023SJohn Marino { return __detail::__expint<long double>(__x); } 1290*e4b17023SJohn Marino 1291*e4b17023SJohn Marino /// 5.2.1.15 Exponential integrals. 1292*e4b17023SJohn Marino template<typename _Tp> 1293*e4b17023SJohn Marino inline typename __gnu_cxx::__promote<_Tp>::__type 1294*e4b17023SJohn Marino expint(_Tp __x) 1295*e4b17023SJohn Marino { 1296*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1297*e4b17023SJohn Marino return __detail::__expint<__type>(__x); 1298*e4b17023SJohn Marino } 1299*e4b17023SJohn Marino 1300*e4b17023SJohn Marino inline float 1301*e4b17023SJohn Marino hermitef(unsigned int __n, float __x) 1302*e4b17023SJohn Marino { return __detail::__poly_hermite<float>(__n, __x); } 1303*e4b17023SJohn Marino 1304*e4b17023SJohn Marino inline long double 1305*e4b17023SJohn Marino hermitel(unsigned int __n, long double __x) 1306*e4b17023SJohn Marino { return __detail::__poly_hermite<long double>(__n, __x); } 1307*e4b17023SJohn Marino 1308*e4b17023SJohn Marino /// 5.2.1.16 Hermite polynomials. 1309*e4b17023SJohn Marino template<typename _Tp> 1310*e4b17023SJohn Marino inline typename __gnu_cxx::__promote<_Tp>::__type 1311*e4b17023SJohn Marino hermite(unsigned int __n, _Tp __x) 1312*e4b17023SJohn Marino { 1313*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1314*e4b17023SJohn Marino return __detail::__poly_hermite<__type>(__n, __x); 1315*e4b17023SJohn Marino } 1316*e4b17023SJohn Marino 1317*e4b17023SJohn Marino inline float 1318*e4b17023SJohn Marino hypergf(float __a, float __b, float __c, float __x) 1319*e4b17023SJohn Marino { return __detail::__hyperg<float>(__a, __b, __c, __x); } 1320*e4b17023SJohn Marino 1321*e4b17023SJohn Marino inline long double 1322*e4b17023SJohn Marino hypergl(long double __a, long double __b, long double __c, long double __x) 1323*e4b17023SJohn Marino { return __detail::__hyperg<long double>(__a, __b, __c, __x); } 1324*e4b17023SJohn Marino 1325*e4b17023SJohn Marino /// 5.2.1.17 Hypergeometric functions. 1326*e4b17023SJohn Marino template<typename _Tpa, typename _Tpb, typename _Tpc, typename _Tp> 1327*e4b17023SJohn Marino inline typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>::__type 1328*e4b17023SJohn Marino hyperg(_Tpa __a, _Tpb __b, _Tpc __c, _Tp __x) 1329*e4b17023SJohn Marino { 1330*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>::__type __type; 1331*e4b17023SJohn Marino return __detail::__hyperg<__type>(__a, __b, __c, __x); 1332*e4b17023SJohn Marino } 1333*e4b17023SJohn Marino 1334*e4b17023SJohn Marino inline float 1335*e4b17023SJohn Marino laguerref(unsigned int __n, float __x) 1336*e4b17023SJohn Marino { return __detail::__laguerre<float>(__n, __x); } 1337*e4b17023SJohn Marino 1338*e4b17023SJohn Marino inline long double 1339*e4b17023SJohn Marino laguerrel(unsigned int __n, long double __x) 1340*e4b17023SJohn Marino { return __detail::__laguerre<long double>(__n, __x); } 1341*e4b17023SJohn Marino 1342*e4b17023SJohn Marino /// 5.2.1.18 Laguerre polynomials. 1343*e4b17023SJohn Marino template<typename _Tp> 1344*e4b17023SJohn Marino inline typename __gnu_cxx::__promote<_Tp>::__type 1345*e4b17023SJohn Marino laguerre(unsigned int __n, _Tp __x) 1346*e4b17023SJohn Marino { 1347*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1348*e4b17023SJohn Marino return __detail::__laguerre<__type>(__n, __x); 1349*e4b17023SJohn Marino } 1350*e4b17023SJohn Marino 1351*e4b17023SJohn Marino inline float 1352*e4b17023SJohn Marino legendref(unsigned int __n, float __x) 1353*e4b17023SJohn Marino { return __detail::__poly_legendre_p<float>(__n, __x); } 1354*e4b17023SJohn Marino 1355*e4b17023SJohn Marino inline long double 1356*e4b17023SJohn Marino legendrel(unsigned int __n, long double __x) 1357*e4b17023SJohn Marino { return __detail::__poly_legendre_p<long double>(__n, __x); } 1358*e4b17023SJohn Marino 1359*e4b17023SJohn Marino /// 5.2.1.19 Legendre polynomials. 1360*e4b17023SJohn Marino template<typename _Tp> 1361*e4b17023SJohn Marino inline typename __gnu_cxx::__promote<_Tp>::__type 1362*e4b17023SJohn Marino legendre(unsigned int __n, _Tp __x) 1363*e4b17023SJohn Marino { 1364*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1365*e4b17023SJohn Marino return __detail::__poly_legendre_p<__type>(__n, __x); 1366*e4b17023SJohn Marino } 1367*e4b17023SJohn Marino 1368*e4b17023SJohn Marino inline float 1369*e4b17023SJohn Marino riemann_zetaf(float __x) 1370*e4b17023SJohn Marino { return __detail::__riemann_zeta<float>(__x); } 1371*e4b17023SJohn Marino 1372*e4b17023SJohn Marino inline long double 1373*e4b17023SJohn Marino riemann_zetal(long double __x) 1374*e4b17023SJohn Marino { return __detail::__riemann_zeta<long double>(__x); } 1375*e4b17023SJohn Marino 1376*e4b17023SJohn Marino /// 5.2.1.20 Riemann zeta function. 1377*e4b17023SJohn Marino template<typename _Tp> 1378*e4b17023SJohn Marino inline typename __gnu_cxx::__promote<_Tp>::__type 1379*e4b17023SJohn Marino riemann_zeta(_Tp __x) 1380*e4b17023SJohn Marino { 1381*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1382*e4b17023SJohn Marino return __detail::__riemann_zeta<__type>(__x); 1383*e4b17023SJohn Marino } 1384*e4b17023SJohn Marino 1385*e4b17023SJohn Marino inline float 1386*e4b17023SJohn Marino sph_besself(unsigned int __n, float __x) 1387*e4b17023SJohn Marino { return __detail::__sph_bessel<float>(__n, __x); } 1388*e4b17023SJohn Marino 1389*e4b17023SJohn Marino inline long double 1390*e4b17023SJohn Marino sph_bessell(unsigned int __n, long double __x) 1391*e4b17023SJohn Marino { return __detail::__sph_bessel<long double>(__n, __x); } 1392*e4b17023SJohn Marino 1393*e4b17023SJohn Marino /// 5.2.1.21 Spherical Bessel functions. 1394*e4b17023SJohn Marino template<typename _Tp> 1395*e4b17023SJohn Marino inline typename __gnu_cxx::__promote<_Tp>::__type 1396*e4b17023SJohn Marino sph_bessel(unsigned int __n, _Tp __x) 1397*e4b17023SJohn Marino { 1398*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1399*e4b17023SJohn Marino return __detail::__sph_bessel<__type>(__n, __x); 1400*e4b17023SJohn Marino } 1401*e4b17023SJohn Marino 1402*e4b17023SJohn Marino inline float 1403*e4b17023SJohn Marino sph_legendref(unsigned int __l, unsigned int __m, float __theta) 1404*e4b17023SJohn Marino { return __detail::__sph_legendre<float>(__l, __m, __theta); } 1405*e4b17023SJohn Marino 1406*e4b17023SJohn Marino inline long double 1407*e4b17023SJohn Marino sph_legendrel(unsigned int __l, unsigned int __m, long double __theta) 1408*e4b17023SJohn Marino { return __detail::__sph_legendre<long double>(__l, __m, __theta); } 1409*e4b17023SJohn Marino 1410*e4b17023SJohn Marino /// 5.2.1.22 Spherical associated Legendre functions. 1411*e4b17023SJohn Marino template<typename _Tp> 1412*e4b17023SJohn Marino inline typename __gnu_cxx::__promote<_Tp>::__type 1413*e4b17023SJohn Marino sph_legendre(unsigned int __l, unsigned int __m, _Tp __theta) 1414*e4b17023SJohn Marino { 1415*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1416*e4b17023SJohn Marino return __detail::__sph_legendre<__type>(__l, __m, __theta); 1417*e4b17023SJohn Marino } 1418*e4b17023SJohn Marino 1419*e4b17023SJohn Marino inline float 1420*e4b17023SJohn Marino sph_neumannf(unsigned int __n, float __x) 1421*e4b17023SJohn Marino { return __detail::__sph_neumann<float>(__n, __x); } 1422*e4b17023SJohn Marino 1423*e4b17023SJohn Marino inline long double 1424*e4b17023SJohn Marino sph_neumannl(unsigned int __n, long double __x) 1425*e4b17023SJohn Marino { return __detail::__sph_neumann<long double>(__n, __x); } 1426*e4b17023SJohn Marino 1427*e4b17023SJohn Marino /// 5.2.1.23 Spherical Neumann functions. 1428*e4b17023SJohn Marino template<typename _Tp> 1429*e4b17023SJohn Marino inline typename __gnu_cxx::__promote<_Tp>::__type 1430*e4b17023SJohn Marino sph_neumann(unsigned int __n, _Tp __x) 1431*e4b17023SJohn Marino { 1432*e4b17023SJohn Marino typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1433*e4b17023SJohn Marino return __detail::__sph_neumann<__type>(__n, __x); 1434*e4b17023SJohn Marino } 1435*e4b17023SJohn Marino 1436*e4b17023SJohn Marino /* @} */ // tr1_math_spec_func 1437*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 1438*e4b17023SJohn Marino} 1439*e4b17023SJohn Marino} 1440*e4b17023SJohn Marino 1441*e4b17023SJohn Marino#endif // _GLIBCXX_TR1_CMATH 1442