163d1a8abSmrg// TR1 cmath -*- C++ -*- 263d1a8abSmrg 3*ec02198aSmrg// Copyright (C) 2006-2020 Free Software Foundation, Inc. 463d1a8abSmrg// 563d1a8abSmrg// This file is part of the GNU ISO C++ Library. This library is free 663d1a8abSmrg// software; you can redistribute it and/or modify it under the 763d1a8abSmrg// terms of the GNU General Public License as published by the 863d1a8abSmrg// Free Software Foundation; either version 3, or (at your option) 963d1a8abSmrg// any later version. 1063d1a8abSmrg 1163d1a8abSmrg// This library is distributed in the hope that it will be useful, 1263d1a8abSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of 1363d1a8abSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1463d1a8abSmrg// GNU General Public License for more details. 1563d1a8abSmrg 1663d1a8abSmrg// Under Section 7 of GPL version 3, you are granted additional 1763d1a8abSmrg// permissions described in the GCC Runtime Library Exception, version 1863d1a8abSmrg// 3.1, as published by the Free Software Foundation. 1963d1a8abSmrg 2063d1a8abSmrg// You should have received a copy of the GNU General Public License and 2163d1a8abSmrg// a copy of the GCC Runtime Library Exception along with this program; 2263d1a8abSmrg// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2363d1a8abSmrg// <http://www.gnu.org/licenses/>. 2463d1a8abSmrg 2563d1a8abSmrg/** @file tr1/cmath 2663d1a8abSmrg * This is a TR1 C++ Library header. 2763d1a8abSmrg */ 2863d1a8abSmrg 2963d1a8abSmrg#ifndef _GLIBCXX_TR1_CMATH 3063d1a8abSmrg#define _GLIBCXX_TR1_CMATH 1 3163d1a8abSmrg 3263d1a8abSmrg#pragma GCC system_header 3363d1a8abSmrg 3463d1a8abSmrg#include <cmath> 3563d1a8abSmrg 3663d1a8abSmrg#ifdef _GLIBCXX_USE_C99_MATH_TR1 3763d1a8abSmrg 3863d1a8abSmrg#undef acosh 3963d1a8abSmrg#undef acoshf 4063d1a8abSmrg#undef acoshl 4163d1a8abSmrg#undef asinh 4263d1a8abSmrg#undef asinhf 4363d1a8abSmrg#undef asinhl 4463d1a8abSmrg#undef atanh 4563d1a8abSmrg#undef atanhf 4663d1a8abSmrg#undef atanhl 4763d1a8abSmrg#undef cbrt 4863d1a8abSmrg#undef cbrtf 4963d1a8abSmrg#undef cbrtl 5063d1a8abSmrg#undef copysign 5163d1a8abSmrg#undef copysignf 5263d1a8abSmrg#undef copysignl 5363d1a8abSmrg#undef erf 5463d1a8abSmrg#undef erff 5563d1a8abSmrg#undef erfl 5663d1a8abSmrg#undef erfc 5763d1a8abSmrg#undef erfcf 5863d1a8abSmrg#undef erfcl 5963d1a8abSmrg#undef exp2 6063d1a8abSmrg#undef exp2f 6163d1a8abSmrg#undef exp2l 6263d1a8abSmrg#undef expm1 6363d1a8abSmrg#undef expm1f 6463d1a8abSmrg#undef expm1l 6563d1a8abSmrg#undef fdim 6663d1a8abSmrg#undef fdimf 6763d1a8abSmrg#undef fdiml 6863d1a8abSmrg#undef fma 6963d1a8abSmrg#undef fmaf 7063d1a8abSmrg#undef fmal 7163d1a8abSmrg#undef fmax 7263d1a8abSmrg#undef fmaxf 7363d1a8abSmrg#undef fmaxl 7463d1a8abSmrg#undef fmin 7563d1a8abSmrg#undef fminf 7663d1a8abSmrg#undef fminl 7763d1a8abSmrg#undef hypot 7863d1a8abSmrg#undef hypotf 7963d1a8abSmrg#undef hypotl 8063d1a8abSmrg#undef ilogb 8163d1a8abSmrg#undef ilogbf 8263d1a8abSmrg#undef ilogbl 8363d1a8abSmrg#undef lgamma 8463d1a8abSmrg#undef lgammaf 8563d1a8abSmrg#undef lgammal 8663d1a8abSmrg#undef llrint 8763d1a8abSmrg#undef llrintf 8863d1a8abSmrg#undef llrintl 8963d1a8abSmrg#undef llround 9063d1a8abSmrg#undef llroundf 9163d1a8abSmrg#undef llroundl 9263d1a8abSmrg#undef log1p 9363d1a8abSmrg#undef log1pf 9463d1a8abSmrg#undef log1pl 9563d1a8abSmrg#undef log2 9663d1a8abSmrg#undef log2f 9763d1a8abSmrg#undef log2l 9863d1a8abSmrg#undef logb 9963d1a8abSmrg#undef logbf 10063d1a8abSmrg#undef logbl 10163d1a8abSmrg#undef lrint 10263d1a8abSmrg#undef lrintf 10363d1a8abSmrg#undef lrintl 10463d1a8abSmrg#undef lround 10563d1a8abSmrg#undef lroundf 10663d1a8abSmrg#undef lroundl 10763d1a8abSmrg#undef nan 10863d1a8abSmrg#undef nanf 10963d1a8abSmrg#undef nanl 11063d1a8abSmrg#undef nearbyint 11163d1a8abSmrg#undef nearbyintf 11263d1a8abSmrg#undef nearbyintl 11363d1a8abSmrg#undef nextafter 11463d1a8abSmrg#undef nextafterf 11563d1a8abSmrg#undef nextafterl 11663d1a8abSmrg#undef nexttoward 11763d1a8abSmrg#undef nexttowardf 11863d1a8abSmrg#undef nexttowardl 11963d1a8abSmrg#undef remainder 12063d1a8abSmrg#undef remainderf 12163d1a8abSmrg#undef remainderl 12263d1a8abSmrg#undef remquo 12363d1a8abSmrg#undef remquof 12463d1a8abSmrg#undef remquol 12563d1a8abSmrg#undef rint 12663d1a8abSmrg#undef rintf 12763d1a8abSmrg#undef rintl 12863d1a8abSmrg#undef round 12963d1a8abSmrg#undef roundf 13063d1a8abSmrg#undef roundl 13163d1a8abSmrg#undef scalbln 13263d1a8abSmrg#undef scalblnf 13363d1a8abSmrg#undef scalblnl 13463d1a8abSmrg#undef scalbn 13563d1a8abSmrg#undef scalbnf 13663d1a8abSmrg#undef scalbnl 13763d1a8abSmrg#undef tgamma 13863d1a8abSmrg#undef tgammaf 13963d1a8abSmrg#undef tgammal 14063d1a8abSmrg#undef trunc 14163d1a8abSmrg#undef truncf 14263d1a8abSmrg#undef truncl 14363d1a8abSmrg 14463d1a8abSmrg#endif 14563d1a8abSmrg 14663d1a8abSmrgnamespace std _GLIBCXX_VISIBILITY(default) 14763d1a8abSmrg{ 14863d1a8abSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 14963d1a8abSmrg 150c7a68eb7Smrgnamespace tr1 151c7a68eb7Smrg{ 15263d1a8abSmrg#if _GLIBCXX_USE_C99_MATH_TR1 15363d1a8abSmrg 15463d1a8abSmrg // Using declarations to bring names from libc's <math.h> into std::tr1. 15563d1a8abSmrg 15663d1a8abSmrg // types 15763d1a8abSmrg using ::double_t; 15863d1a8abSmrg using ::float_t; 15963d1a8abSmrg 16063d1a8abSmrg // functions 16163d1a8abSmrg using ::acosh; 16263d1a8abSmrg using ::acoshf; 16363d1a8abSmrg using ::acoshl; 16463d1a8abSmrg 16563d1a8abSmrg using ::asinh; 16663d1a8abSmrg using ::asinhf; 16763d1a8abSmrg using ::asinhl; 16863d1a8abSmrg 16963d1a8abSmrg using ::atanh; 17063d1a8abSmrg using ::atanhf; 17163d1a8abSmrg using ::atanhl; 17263d1a8abSmrg 17363d1a8abSmrg using ::cbrt; 17463d1a8abSmrg using ::cbrtf; 17563d1a8abSmrg using ::cbrtl; 17663d1a8abSmrg 17763d1a8abSmrg using ::copysign; 17863d1a8abSmrg using ::copysignf; 17963d1a8abSmrg using ::copysignl; 18063d1a8abSmrg 18163d1a8abSmrg using ::erf; 18263d1a8abSmrg using ::erff; 18363d1a8abSmrg using ::erfl; 18463d1a8abSmrg 18563d1a8abSmrg using ::erfc; 18663d1a8abSmrg using ::erfcf; 18763d1a8abSmrg using ::erfcl; 18863d1a8abSmrg 18963d1a8abSmrg using ::exp2; 19063d1a8abSmrg using ::exp2f; 19163d1a8abSmrg using ::exp2l; 19263d1a8abSmrg 19363d1a8abSmrg using ::expm1; 19463d1a8abSmrg using ::expm1f; 19563d1a8abSmrg using ::expm1l; 19663d1a8abSmrg 19763d1a8abSmrg using ::fdim; 19863d1a8abSmrg using ::fdimf; 19963d1a8abSmrg using ::fdiml; 20063d1a8abSmrg 20163d1a8abSmrg using ::fma; 20263d1a8abSmrg using ::fmaf; 20363d1a8abSmrg using ::fmal; 20463d1a8abSmrg 20563d1a8abSmrg using ::fmax; 20663d1a8abSmrg using ::fmaxf; 20763d1a8abSmrg using ::fmaxl; 20863d1a8abSmrg 20963d1a8abSmrg using ::fmin; 21063d1a8abSmrg using ::fminf; 21163d1a8abSmrg using ::fminl; 21263d1a8abSmrg 21363d1a8abSmrg using ::hypot; 21463d1a8abSmrg using ::hypotf; 21563d1a8abSmrg using ::hypotl; 21663d1a8abSmrg 21763d1a8abSmrg using ::ilogb; 21863d1a8abSmrg using ::ilogbf; 21963d1a8abSmrg using ::ilogbl; 22063d1a8abSmrg 22163d1a8abSmrg using ::lgamma; 22263d1a8abSmrg using ::lgammaf; 22363d1a8abSmrg using ::lgammal; 22463d1a8abSmrg 22563d1a8abSmrg using ::llrint; 22663d1a8abSmrg using ::llrintf; 22763d1a8abSmrg using ::llrintl; 22863d1a8abSmrg 22963d1a8abSmrg using ::llround; 23063d1a8abSmrg using ::llroundf; 23163d1a8abSmrg using ::llroundl; 23263d1a8abSmrg 23363d1a8abSmrg using ::log1p; 23463d1a8abSmrg using ::log1pf; 23563d1a8abSmrg using ::log1pl; 23663d1a8abSmrg 23763d1a8abSmrg using ::log2; 23863d1a8abSmrg using ::log2f; 23963d1a8abSmrg using ::log2l; 24063d1a8abSmrg 24163d1a8abSmrg using ::logb; 24263d1a8abSmrg using ::logbf; 24363d1a8abSmrg using ::logbl; 24463d1a8abSmrg 24563d1a8abSmrg using ::lrint; 24663d1a8abSmrg using ::lrintf; 24763d1a8abSmrg using ::lrintl; 24863d1a8abSmrg 24963d1a8abSmrg using ::lround; 25063d1a8abSmrg using ::lroundf; 25163d1a8abSmrg using ::lroundl; 25263d1a8abSmrg 25363d1a8abSmrg using ::nan; 25463d1a8abSmrg using ::nanf; 25563d1a8abSmrg using ::nanl; 25663d1a8abSmrg 25763d1a8abSmrg using ::nearbyint; 25863d1a8abSmrg using ::nearbyintf; 25963d1a8abSmrg using ::nearbyintl; 26063d1a8abSmrg 26163d1a8abSmrg using ::nextafter; 26263d1a8abSmrg using ::nextafterf; 26363d1a8abSmrg using ::nextafterl; 26463d1a8abSmrg 26563d1a8abSmrg using ::nexttoward; 26663d1a8abSmrg using ::nexttowardf; 26763d1a8abSmrg using ::nexttowardl; 26863d1a8abSmrg 26963d1a8abSmrg using ::remainder; 27063d1a8abSmrg using ::remainderf; 27163d1a8abSmrg using ::remainderl; 27263d1a8abSmrg 27363d1a8abSmrg using ::remquo; 27463d1a8abSmrg using ::remquof; 27563d1a8abSmrg using ::remquol; 27663d1a8abSmrg 27763d1a8abSmrg using ::rint; 27863d1a8abSmrg using ::rintf; 27963d1a8abSmrg using ::rintl; 28063d1a8abSmrg 28163d1a8abSmrg using ::round; 28263d1a8abSmrg using ::roundf; 28363d1a8abSmrg using ::roundl; 28463d1a8abSmrg 28563d1a8abSmrg using ::scalbln; 28663d1a8abSmrg using ::scalblnf; 28763d1a8abSmrg using ::scalblnl; 28863d1a8abSmrg 28963d1a8abSmrg using ::scalbn; 29063d1a8abSmrg using ::scalbnf; 29163d1a8abSmrg using ::scalbnl; 29263d1a8abSmrg 29363d1a8abSmrg using ::tgamma; 29463d1a8abSmrg using ::tgammaf; 29563d1a8abSmrg using ::tgammal; 29663d1a8abSmrg 29763d1a8abSmrg using ::trunc; 29863d1a8abSmrg using ::truncf; 29963d1a8abSmrg using ::truncl; 30063d1a8abSmrg 30163d1a8abSmrg#endif 30263d1a8abSmrg 30363d1a8abSmrg#if _GLIBCXX_USE_C99_MATH 30463d1a8abSmrg#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC 30563d1a8abSmrg 30663d1a8abSmrg /// Function template definitions [8.16.3]. 30763d1a8abSmrg template<typename _Tp> 30863d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 30963d1a8abSmrg int>::__type 31063d1a8abSmrg fpclassify(_Tp __f) 31163d1a8abSmrg { 31263d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 31363d1a8abSmrg return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 31463d1a8abSmrg FP_SUBNORMAL, FP_ZERO, __type(__f)); 31563d1a8abSmrg } 31663d1a8abSmrg 31763d1a8abSmrg template<typename _Tp> 31863d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 31963d1a8abSmrg int>::__type 32063d1a8abSmrg isfinite(_Tp __f) 32163d1a8abSmrg { 32263d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 32363d1a8abSmrg return __builtin_isfinite(__type(__f)); 32463d1a8abSmrg } 32563d1a8abSmrg 32663d1a8abSmrg template<typename _Tp> 32763d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 32863d1a8abSmrg int>::__type 32963d1a8abSmrg isinf(_Tp __f) 33063d1a8abSmrg { 33163d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 33263d1a8abSmrg return __builtin_isinf(__type(__f)); 33363d1a8abSmrg } 33463d1a8abSmrg 33563d1a8abSmrg template<typename _Tp> 33663d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 33763d1a8abSmrg int>::__type 33863d1a8abSmrg isnan(_Tp __f) 33963d1a8abSmrg { 34063d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 34163d1a8abSmrg return __builtin_isnan(__type(__f)); 34263d1a8abSmrg } 34363d1a8abSmrg 34463d1a8abSmrg template<typename _Tp> 34563d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 34663d1a8abSmrg int>::__type 34763d1a8abSmrg isnormal(_Tp __f) 34863d1a8abSmrg { 34963d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 35063d1a8abSmrg return __builtin_isnormal(__type(__f)); 35163d1a8abSmrg } 35263d1a8abSmrg 35363d1a8abSmrg template<typename _Tp> 35463d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 35563d1a8abSmrg int>::__type 35663d1a8abSmrg signbit(_Tp __f) 35763d1a8abSmrg { 35863d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 35963d1a8abSmrg return __builtin_signbit(__type(__f)); 36063d1a8abSmrg } 36163d1a8abSmrg 36263d1a8abSmrg template<typename _Tp> 36363d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 36463d1a8abSmrg int>::__type 36563d1a8abSmrg isgreater(_Tp __f1, _Tp __f2) 36663d1a8abSmrg { 36763d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 36863d1a8abSmrg return __builtin_isgreater(__type(__f1), __type(__f2)); 36963d1a8abSmrg } 37063d1a8abSmrg 37163d1a8abSmrg template<typename _Tp> 37263d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 37363d1a8abSmrg int>::__type 37463d1a8abSmrg isgreaterequal(_Tp __f1, _Tp __f2) 37563d1a8abSmrg { 37663d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 37763d1a8abSmrg return __builtin_isgreaterequal(__type(__f1), __type(__f2)); 37863d1a8abSmrg } 37963d1a8abSmrg 38063d1a8abSmrg template<typename _Tp> 38163d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 38263d1a8abSmrg int>::__type 38363d1a8abSmrg isless(_Tp __f1, _Tp __f2) 38463d1a8abSmrg { 38563d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 38663d1a8abSmrg return __builtin_isless(__type(__f1), __type(__f2)); 38763d1a8abSmrg } 38863d1a8abSmrg 38963d1a8abSmrg template<typename _Tp> 39063d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 39163d1a8abSmrg int>::__type 39263d1a8abSmrg islessequal(_Tp __f1, _Tp __f2) 39363d1a8abSmrg { 39463d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 39563d1a8abSmrg return __builtin_islessequal(__type(__f1), __type(__f2)); 39663d1a8abSmrg } 39763d1a8abSmrg 39863d1a8abSmrg template<typename _Tp> 39963d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 40063d1a8abSmrg int>::__type 40163d1a8abSmrg islessgreater(_Tp __f1, _Tp __f2) 40263d1a8abSmrg { 40363d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 40463d1a8abSmrg return __builtin_islessgreater(__type(__f1), __type(__f2)); 40563d1a8abSmrg } 40663d1a8abSmrg 40763d1a8abSmrg template<typename _Tp> 40863d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 40963d1a8abSmrg int>::__type 41063d1a8abSmrg isunordered(_Tp __f1, _Tp __f2) 41163d1a8abSmrg { 41263d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 41363d1a8abSmrg return __builtin_isunordered(__type(__f1), __type(__f2)); 41463d1a8abSmrg } 41563d1a8abSmrg 41663d1a8abSmrg#endif 41763d1a8abSmrg#endif 41863d1a8abSmrg 41963d1a8abSmrg#if _GLIBCXX_USE_C99_MATH_TR1 42063d1a8abSmrg 42163d1a8abSmrg /** Additional overloads [8.16.4]. 42263d1a8abSmrg * @{ 42363d1a8abSmrg */ 42463d1a8abSmrg 42563d1a8abSmrg // For functions defined in C++03 the additional overloads are already 42663d1a8abSmrg // declared in <cmath> so we can just re-declare them in std::tr1. 42763d1a8abSmrg 42863d1a8abSmrg using std::acos; 42963d1a8abSmrg using std::asin; 43063d1a8abSmrg using std::atan; 43163d1a8abSmrg using std::atan2; 43263d1a8abSmrg using std::ceil; 43363d1a8abSmrg using std::cos; 43463d1a8abSmrg using std::cosh; 43563d1a8abSmrg using std::exp; 43663d1a8abSmrg using std::floor; 43763d1a8abSmrg using std::fmod; 43863d1a8abSmrg using std::frexp; 43963d1a8abSmrg using std::ldexp; 44063d1a8abSmrg using std::log; 44163d1a8abSmrg using std::log10; 44263d1a8abSmrg using std::sin; 44363d1a8abSmrg using std::sinh; 44463d1a8abSmrg using std::sqrt; 44563d1a8abSmrg using std::tan; 44663d1a8abSmrg using std::tanh; 44763d1a8abSmrg 44863d1a8abSmrg#if __cplusplus >= 201103L 44963d1a8abSmrg 45063d1a8abSmrg // Since C++11, <cmath> defines additional overloads for these functions 45163d1a8abSmrg // in namespace std. 45263d1a8abSmrg 45363d1a8abSmrg using std::acosh; 45463d1a8abSmrg using std::asinh; 45563d1a8abSmrg using std::atanh; 45663d1a8abSmrg using std::cbrt; 45763d1a8abSmrg using std::copysign; 45863d1a8abSmrg using std::erf; 45963d1a8abSmrg using std::erfc; 46063d1a8abSmrg using std::exp2; 46163d1a8abSmrg using std::expm1; 46263d1a8abSmrg using std::fdim; 46363d1a8abSmrg using std::fma; 46463d1a8abSmrg using std::fmax; 46563d1a8abSmrg using std::fmin; 46663d1a8abSmrg using std::hypot; 46763d1a8abSmrg using std::ilogb; 46863d1a8abSmrg using std::lgamma; 46963d1a8abSmrg using std::llrint; 47063d1a8abSmrg using std::llround; 47163d1a8abSmrg using std::log1p; 47263d1a8abSmrg using std::log2; 47363d1a8abSmrg using std::logb; 47463d1a8abSmrg using std::lrint; 47563d1a8abSmrg using std::lround; 47663d1a8abSmrg using std::nan; 47763d1a8abSmrg using std::nearbyint; 47863d1a8abSmrg using std::nextafter; 47963d1a8abSmrg using std::nexttoward; 48063d1a8abSmrg using std::remainder; 48163d1a8abSmrg using std::remquo; 48263d1a8abSmrg using std::rint; 48363d1a8abSmrg using std::round; 48463d1a8abSmrg using std::scalbln; 48563d1a8abSmrg using std::scalbn; 48663d1a8abSmrg using std::tgamma; 48763d1a8abSmrg using std::trunc; 48863d1a8abSmrg 48963d1a8abSmrg#else // __cplusplus < 201103L 49063d1a8abSmrg 49163d1a8abSmrg // In C++03 we need to provide the additional overloads. 49263d1a8abSmrg 49363d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 49463d1a8abSmrg inline float 49563d1a8abSmrg acosh(float __x) 49663d1a8abSmrg { return __builtin_acoshf(__x); } 49763d1a8abSmrg 49863d1a8abSmrg inline long double 49963d1a8abSmrg acosh(long double __x) 50063d1a8abSmrg { return __builtin_acoshl(__x); } 50163d1a8abSmrg#endif 50263d1a8abSmrg 50363d1a8abSmrg template<typename _Tp> 50463d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 50563d1a8abSmrg double>::__type 50663d1a8abSmrg acosh(_Tp __x) 50763d1a8abSmrg { return __builtin_acosh(__x); } 50863d1a8abSmrg 50963d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 51063d1a8abSmrg inline float 51163d1a8abSmrg asinh(float __x) 51263d1a8abSmrg { return __builtin_asinhf(__x); } 51363d1a8abSmrg 51463d1a8abSmrg inline long double 51563d1a8abSmrg asinh(long double __x) 51663d1a8abSmrg { return __builtin_asinhl(__x); } 51763d1a8abSmrg#endif 51863d1a8abSmrg 51963d1a8abSmrg template<typename _Tp> 52063d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 52163d1a8abSmrg double>::__type 52263d1a8abSmrg asinh(_Tp __x) 52363d1a8abSmrg { return __builtin_asinh(__x); } 52463d1a8abSmrg 52563d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 52663d1a8abSmrg inline float 52763d1a8abSmrg atanh(float __x) 52863d1a8abSmrg { return __builtin_atanhf(__x); } 52963d1a8abSmrg 53063d1a8abSmrg inline long double 53163d1a8abSmrg atanh(long double __x) 53263d1a8abSmrg { return __builtin_atanhl(__x); } 53363d1a8abSmrg#endif 53463d1a8abSmrg 53563d1a8abSmrg template<typename _Tp> 53663d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 53763d1a8abSmrg double>::__type 53863d1a8abSmrg atanh(_Tp __x) 53963d1a8abSmrg { return __builtin_atanh(__x); } 54063d1a8abSmrg 54163d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 54263d1a8abSmrg inline float 54363d1a8abSmrg cbrt(float __x) 54463d1a8abSmrg { return __builtin_cbrtf(__x); } 54563d1a8abSmrg 54663d1a8abSmrg inline long double 54763d1a8abSmrg cbrt(long double __x) 54863d1a8abSmrg { return __builtin_cbrtl(__x); } 54963d1a8abSmrg#endif 55063d1a8abSmrg 55163d1a8abSmrg template<typename _Tp> 55263d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 55363d1a8abSmrg double>::__type 55463d1a8abSmrg cbrt(_Tp __x) 55563d1a8abSmrg { return __builtin_cbrt(__x); } 55663d1a8abSmrg 55763d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 55863d1a8abSmrg inline float 55963d1a8abSmrg copysign(float __x, float __y) 56063d1a8abSmrg { return __builtin_copysignf(__x, __y); } 56163d1a8abSmrg 56263d1a8abSmrg inline long double 56363d1a8abSmrg copysign(long double __x, long double __y) 56463d1a8abSmrg { return __builtin_copysignl(__x, __y); } 56563d1a8abSmrg#endif 56663d1a8abSmrg 56763d1a8abSmrg template<typename _Tp, typename _Up> 56863d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 56963d1a8abSmrg copysign(_Tp __x, _Up __y) 57063d1a8abSmrg { 57163d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 57263d1a8abSmrg return copysign(__type(__x), __type(__y)); 57363d1a8abSmrg } 57463d1a8abSmrg 57563d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 57663d1a8abSmrg inline float 57763d1a8abSmrg erf(float __x) 57863d1a8abSmrg { return __builtin_erff(__x); } 57963d1a8abSmrg 58063d1a8abSmrg inline long double 58163d1a8abSmrg erf(long double __x) 58263d1a8abSmrg { return __builtin_erfl(__x); } 58363d1a8abSmrg#endif 58463d1a8abSmrg 58563d1a8abSmrg template<typename _Tp> 58663d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 58763d1a8abSmrg double>::__type 58863d1a8abSmrg erf(_Tp __x) 58963d1a8abSmrg { return __builtin_erf(__x); } 59063d1a8abSmrg 59163d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 59263d1a8abSmrg inline float 59363d1a8abSmrg erfc(float __x) 59463d1a8abSmrg { return __builtin_erfcf(__x); } 59563d1a8abSmrg 59663d1a8abSmrg inline long double 59763d1a8abSmrg erfc(long double __x) 59863d1a8abSmrg { return __builtin_erfcl(__x); } 59963d1a8abSmrg#endif 60063d1a8abSmrg 60163d1a8abSmrg template<typename _Tp> 60263d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 60363d1a8abSmrg double>::__type 60463d1a8abSmrg erfc(_Tp __x) 60563d1a8abSmrg { return __builtin_erfc(__x); } 60663d1a8abSmrg 60763d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 60863d1a8abSmrg inline float 60963d1a8abSmrg exp2(float __x) 61063d1a8abSmrg { return __builtin_exp2f(__x); } 61163d1a8abSmrg 61263d1a8abSmrg inline long double 61363d1a8abSmrg exp2(long double __x) 61463d1a8abSmrg { return __builtin_exp2l(__x); } 61563d1a8abSmrg#endif 61663d1a8abSmrg 61763d1a8abSmrg template<typename _Tp> 61863d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 61963d1a8abSmrg double>::__type 62063d1a8abSmrg exp2(_Tp __x) 62163d1a8abSmrg { return __builtin_exp2(__x); } 62263d1a8abSmrg 62363d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 62463d1a8abSmrg inline float 62563d1a8abSmrg expm1(float __x) 62663d1a8abSmrg { return __builtin_expm1f(__x); } 62763d1a8abSmrg 62863d1a8abSmrg inline long double 62963d1a8abSmrg expm1(long double __x) 63063d1a8abSmrg { return __builtin_expm1l(__x); } 63163d1a8abSmrg#endif 63263d1a8abSmrg 63363d1a8abSmrg template<typename _Tp> 63463d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 63563d1a8abSmrg double>::__type 63663d1a8abSmrg expm1(_Tp __x) 63763d1a8abSmrg { return __builtin_expm1(__x); } 63863d1a8abSmrg 63963d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 64063d1a8abSmrg inline float 64163d1a8abSmrg fdim(float __x, float __y) 64263d1a8abSmrg { return __builtin_fdimf(__x, __y); } 64363d1a8abSmrg 64463d1a8abSmrg inline long double 64563d1a8abSmrg fdim(long double __x, long double __y) 64663d1a8abSmrg { return __builtin_fdiml(__x, __y); } 64763d1a8abSmrg#endif 64863d1a8abSmrg 64963d1a8abSmrg template<typename _Tp, typename _Up> 65063d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 65163d1a8abSmrg fdim(_Tp __x, _Up __y) 65263d1a8abSmrg { 65363d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 65463d1a8abSmrg return fdim(__type(__x), __type(__y)); 65563d1a8abSmrg } 65663d1a8abSmrg 65763d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 65863d1a8abSmrg inline float 65963d1a8abSmrg fma(float __x, float __y, float __z) 66063d1a8abSmrg { return __builtin_fmaf(__x, __y, __z); } 66163d1a8abSmrg 66263d1a8abSmrg inline long double 66363d1a8abSmrg fma(long double __x, long double __y, long double __z) 66463d1a8abSmrg { return __builtin_fmal(__x, __y, __z); } 66563d1a8abSmrg#endif 66663d1a8abSmrg 66763d1a8abSmrg template<typename _Tp, typename _Up, typename _Vp> 66863d1a8abSmrg inline typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type 66963d1a8abSmrg fma(_Tp __x, _Up __y, _Vp __z) 67063d1a8abSmrg { 67163d1a8abSmrg typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type; 67263d1a8abSmrg return fma(__type(__x), __type(__y), __type(__z)); 67363d1a8abSmrg } 67463d1a8abSmrg 67563d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 67663d1a8abSmrg inline float 67763d1a8abSmrg fmax(float __x, float __y) 67863d1a8abSmrg { return __builtin_fmaxf(__x, __y); } 67963d1a8abSmrg 68063d1a8abSmrg inline long double 68163d1a8abSmrg fmax(long double __x, long double __y) 68263d1a8abSmrg { return __builtin_fmaxl(__x, __y); } 68363d1a8abSmrg#endif 68463d1a8abSmrg 68563d1a8abSmrg template<typename _Tp, typename _Up> 68663d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 68763d1a8abSmrg fmax(_Tp __x, _Up __y) 68863d1a8abSmrg { 68963d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 69063d1a8abSmrg return fmax(__type(__x), __type(__y)); 69163d1a8abSmrg } 69263d1a8abSmrg 69363d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 69463d1a8abSmrg inline float 69563d1a8abSmrg fmin(float __x, float __y) 69663d1a8abSmrg { return __builtin_fminf(__x, __y); } 69763d1a8abSmrg 69863d1a8abSmrg inline long double 69963d1a8abSmrg fmin(long double __x, long double __y) 70063d1a8abSmrg { return __builtin_fminl(__x, __y); } 70163d1a8abSmrg#endif 70263d1a8abSmrg 70363d1a8abSmrg template<typename _Tp, typename _Up> 70463d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 70563d1a8abSmrg fmin(_Tp __x, _Up __y) 70663d1a8abSmrg { 70763d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 70863d1a8abSmrg return fmin(__type(__x), __type(__y)); 70963d1a8abSmrg } 71063d1a8abSmrg 71163d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 71263d1a8abSmrg inline float 71363d1a8abSmrg hypot(float __x, float __y) 71463d1a8abSmrg { return __builtin_hypotf(__x, __y); } 71563d1a8abSmrg 71663d1a8abSmrg inline long double 71763d1a8abSmrg hypot(long double __x, long double __y) 71863d1a8abSmrg { return __builtin_hypotl(__x, __y); } 71963d1a8abSmrg#endif 72063d1a8abSmrg 72163d1a8abSmrg template<typename _Tp, typename _Up> 72263d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 72363d1a8abSmrg hypot(_Tp __y, _Up __x) 72463d1a8abSmrg { 72563d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 72663d1a8abSmrg return hypot(__type(__y), __type(__x)); 72763d1a8abSmrg } 72863d1a8abSmrg 72963d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 73063d1a8abSmrg inline int 73163d1a8abSmrg ilogb(float __x) 73263d1a8abSmrg { return __builtin_ilogbf(__x); } 73363d1a8abSmrg 73463d1a8abSmrg inline int 73563d1a8abSmrg ilogb(long double __x) 73663d1a8abSmrg { return __builtin_ilogbl(__x); } 73763d1a8abSmrg#endif 73863d1a8abSmrg 73963d1a8abSmrg template<typename _Tp> 74063d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 74163d1a8abSmrg int>::__type 74263d1a8abSmrg ilogb(_Tp __x) 74363d1a8abSmrg { return __builtin_ilogb(__x); } 74463d1a8abSmrg 74563d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 74663d1a8abSmrg inline float 74763d1a8abSmrg lgamma(float __x) 74863d1a8abSmrg { return __builtin_lgammaf(__x); } 74963d1a8abSmrg 75063d1a8abSmrg inline long double 75163d1a8abSmrg lgamma(long double __x) 75263d1a8abSmrg { return __builtin_lgammal(__x); } 75363d1a8abSmrg#endif 75463d1a8abSmrg 75563d1a8abSmrg template<typename _Tp> 75663d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 75763d1a8abSmrg double>::__type 75863d1a8abSmrg lgamma(_Tp __x) 75963d1a8abSmrg { return __builtin_lgamma(__x); } 76063d1a8abSmrg 76163d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 76263d1a8abSmrg inline long long 76363d1a8abSmrg llrint(float __x) 76463d1a8abSmrg { return __builtin_llrintf(__x); } 76563d1a8abSmrg 76663d1a8abSmrg inline long long 76763d1a8abSmrg llrint(long double __x) 76863d1a8abSmrg { return __builtin_llrintl(__x); } 76963d1a8abSmrg#endif 77063d1a8abSmrg 77163d1a8abSmrg template<typename _Tp> 77263d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 77363d1a8abSmrg long long>::__type 77463d1a8abSmrg llrint(_Tp __x) 77563d1a8abSmrg { return __builtin_llrint(__x); } 77663d1a8abSmrg 77763d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 77863d1a8abSmrg inline long long 77963d1a8abSmrg llround(float __x) 78063d1a8abSmrg { return __builtin_llroundf(__x); } 78163d1a8abSmrg 78263d1a8abSmrg inline long long 78363d1a8abSmrg llround(long double __x) 78463d1a8abSmrg { return __builtin_llroundl(__x); } 78563d1a8abSmrg#endif 78663d1a8abSmrg 78763d1a8abSmrg template<typename _Tp> 78863d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 78963d1a8abSmrg long long>::__type 79063d1a8abSmrg llround(_Tp __x) 79163d1a8abSmrg { return __builtin_llround(__x); } 79263d1a8abSmrg 79363d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 79463d1a8abSmrg inline float 79563d1a8abSmrg log1p(float __x) 79663d1a8abSmrg { return __builtin_log1pf(__x); } 79763d1a8abSmrg 79863d1a8abSmrg inline long double 79963d1a8abSmrg log1p(long double __x) 80063d1a8abSmrg { return __builtin_log1pl(__x); } 80163d1a8abSmrg#endif 80263d1a8abSmrg 80363d1a8abSmrg template<typename _Tp> 80463d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 80563d1a8abSmrg double>::__type 80663d1a8abSmrg log1p(_Tp __x) 80763d1a8abSmrg { return __builtin_log1p(__x); } 80863d1a8abSmrg 80963d1a8abSmrg // DR 568. 81063d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 81163d1a8abSmrg inline float 81263d1a8abSmrg log2(float __x) 81363d1a8abSmrg { return __builtin_log2f(__x); } 81463d1a8abSmrg 81563d1a8abSmrg inline long double 81663d1a8abSmrg log2(long double __x) 81763d1a8abSmrg { return __builtin_log2l(__x); } 81863d1a8abSmrg#endif 81963d1a8abSmrg 82063d1a8abSmrg template<typename _Tp> 82163d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 82263d1a8abSmrg double>::__type 82363d1a8abSmrg log2(_Tp __x) 82463d1a8abSmrg { return __builtin_log2(__x); } 82563d1a8abSmrg 82663d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 82763d1a8abSmrg inline float 82863d1a8abSmrg logb(float __x) 82963d1a8abSmrg { return __builtin_logbf(__x); } 83063d1a8abSmrg 83163d1a8abSmrg inline long double 83263d1a8abSmrg logb(long double __x) 83363d1a8abSmrg { return __builtin_logbl(__x); } 83463d1a8abSmrg#endif 83563d1a8abSmrg 83663d1a8abSmrg template<typename _Tp> 83763d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 83863d1a8abSmrg double>::__type 83963d1a8abSmrg logb(_Tp __x) 84063d1a8abSmrg { 84163d1a8abSmrg return __builtin_logb(__x); 84263d1a8abSmrg } 84363d1a8abSmrg 84463d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 84563d1a8abSmrg inline long 84663d1a8abSmrg lrint(float __x) 84763d1a8abSmrg { return __builtin_lrintf(__x); } 84863d1a8abSmrg 84963d1a8abSmrg inline long 85063d1a8abSmrg lrint(long double __x) 85163d1a8abSmrg { return __builtin_lrintl(__x); } 85263d1a8abSmrg#endif 85363d1a8abSmrg 85463d1a8abSmrg template<typename _Tp> 85563d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 85663d1a8abSmrg long>::__type 85763d1a8abSmrg lrint(_Tp __x) 85863d1a8abSmrg { return __builtin_lrint(__x); } 85963d1a8abSmrg 86063d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 86163d1a8abSmrg inline long 86263d1a8abSmrg lround(float __x) 86363d1a8abSmrg { return __builtin_lroundf(__x); } 86463d1a8abSmrg 86563d1a8abSmrg inline long 86663d1a8abSmrg lround(long double __x) 86763d1a8abSmrg { return __builtin_lroundl(__x); } 86863d1a8abSmrg#endif 86963d1a8abSmrg 87063d1a8abSmrg template<typename _Tp> 87163d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 87263d1a8abSmrg long>::__type 87363d1a8abSmrg lround(_Tp __x) 87463d1a8abSmrg { return __builtin_lround(__x); } 87563d1a8abSmrg 87663d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 87763d1a8abSmrg inline float 87863d1a8abSmrg nearbyint(float __x) 87963d1a8abSmrg { return __builtin_nearbyintf(__x); } 88063d1a8abSmrg 88163d1a8abSmrg inline long double 88263d1a8abSmrg nearbyint(long double __x) 88363d1a8abSmrg { return __builtin_nearbyintl(__x); } 88463d1a8abSmrg#endif 88563d1a8abSmrg 88663d1a8abSmrg template<typename _Tp> 88763d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 88863d1a8abSmrg double>::__type 88963d1a8abSmrg nearbyint(_Tp __x) 89063d1a8abSmrg { return __builtin_nearbyint(__x); } 89163d1a8abSmrg 89263d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 89363d1a8abSmrg inline float 89463d1a8abSmrg nextafter(float __x, float __y) 89563d1a8abSmrg { return __builtin_nextafterf(__x, __y); } 89663d1a8abSmrg 89763d1a8abSmrg inline long double 89863d1a8abSmrg nextafter(long double __x, long double __y) 89963d1a8abSmrg { return __builtin_nextafterl(__x, __y); } 90063d1a8abSmrg#endif 90163d1a8abSmrg 90263d1a8abSmrg template<typename _Tp, typename _Up> 90363d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 90463d1a8abSmrg nextafter(_Tp __x, _Up __y) 90563d1a8abSmrg { 90663d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 90763d1a8abSmrg return nextafter(__type(__x), __type(__y)); 90863d1a8abSmrg } 90963d1a8abSmrg 91063d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 91163d1a8abSmrg inline float 91263d1a8abSmrg nexttoward(float __x, long double __y) 91363d1a8abSmrg { return __builtin_nexttowardf(__x, __y); } 91463d1a8abSmrg 91563d1a8abSmrg inline long double 91663d1a8abSmrg nexttoward(long double __x, long double __y) 91763d1a8abSmrg { return __builtin_nexttowardl(__x, __y); } 91863d1a8abSmrg#endif 91963d1a8abSmrg 92063d1a8abSmrg template<typename _Tp> 92163d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 92263d1a8abSmrg double>::__type 92363d1a8abSmrg nexttoward(_Tp __x, long double __y) 92463d1a8abSmrg { return __builtin_nexttoward(__x, __y); } 92563d1a8abSmrg 92663d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 92763d1a8abSmrg inline float 92863d1a8abSmrg remainder(float __x, float __y) 92963d1a8abSmrg { return __builtin_remainderf(__x, __y); } 93063d1a8abSmrg 93163d1a8abSmrg inline long double 93263d1a8abSmrg remainder(long double __x, long double __y) 93363d1a8abSmrg { return __builtin_remainderl(__x, __y); } 93463d1a8abSmrg#endif 93563d1a8abSmrg 93663d1a8abSmrg template<typename _Tp, typename _Up> 93763d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 93863d1a8abSmrg remainder(_Tp __x, _Up __y) 93963d1a8abSmrg { 94063d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 94163d1a8abSmrg return remainder(__type(__x), __type(__y)); 94263d1a8abSmrg } 94363d1a8abSmrg 94463d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 94563d1a8abSmrg inline float 94663d1a8abSmrg remquo(float __x, float __y, int* __pquo) 94763d1a8abSmrg { return __builtin_remquof(__x, __y, __pquo); } 94863d1a8abSmrg 94963d1a8abSmrg inline long double 95063d1a8abSmrg remquo(long double __x, long double __y, int* __pquo) 95163d1a8abSmrg { return __builtin_remquol(__x, __y, __pquo); } 95263d1a8abSmrg#endif 95363d1a8abSmrg 95463d1a8abSmrg template<typename _Tp, typename _Up> 95563d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 95663d1a8abSmrg remquo(_Tp __x, _Up __y, int* __pquo) 95763d1a8abSmrg { 95863d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 95963d1a8abSmrg return remquo(__type(__x), __type(__y), __pquo); 96063d1a8abSmrg } 96163d1a8abSmrg 96263d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 96363d1a8abSmrg inline float 96463d1a8abSmrg rint(float __x) 96563d1a8abSmrg { return __builtin_rintf(__x); } 96663d1a8abSmrg 96763d1a8abSmrg inline long double 96863d1a8abSmrg rint(long double __x) 96963d1a8abSmrg { return __builtin_rintl(__x); } 97063d1a8abSmrg#endif 97163d1a8abSmrg 97263d1a8abSmrg template<typename _Tp> 97363d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 97463d1a8abSmrg double>::__type 97563d1a8abSmrg rint(_Tp __x) 97663d1a8abSmrg { return __builtin_rint(__x); } 97763d1a8abSmrg 97863d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 97963d1a8abSmrg inline float 98063d1a8abSmrg round(float __x) 98163d1a8abSmrg { return __builtin_roundf(__x); } 98263d1a8abSmrg 98363d1a8abSmrg inline long double 98463d1a8abSmrg round(long double __x) 98563d1a8abSmrg { return __builtin_roundl(__x); } 98663d1a8abSmrg#endif 98763d1a8abSmrg 98863d1a8abSmrg template<typename _Tp> 98963d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 99063d1a8abSmrg double>::__type 99163d1a8abSmrg round(_Tp __x) 99263d1a8abSmrg { return __builtin_round(__x); } 99363d1a8abSmrg 99463d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 99563d1a8abSmrg inline float 99663d1a8abSmrg scalbln(float __x, long __ex) 99763d1a8abSmrg { return __builtin_scalblnf(__x, __ex); } 99863d1a8abSmrg 99963d1a8abSmrg inline long double 100063d1a8abSmrg scalbln(long double __x, long __ex) 100163d1a8abSmrg { return __builtin_scalblnl(__x, __ex); } 100263d1a8abSmrg#endif 100363d1a8abSmrg 100463d1a8abSmrg template<typename _Tp> 100563d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 100663d1a8abSmrg double>::__type 100763d1a8abSmrg scalbln(_Tp __x, long __ex) 100863d1a8abSmrg { return __builtin_scalbln(__x, __ex); } 100963d1a8abSmrg 101063d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 101163d1a8abSmrg inline float 101263d1a8abSmrg scalbn(float __x, int __ex) 101363d1a8abSmrg { return __builtin_scalbnf(__x, __ex); } 101463d1a8abSmrg 101563d1a8abSmrg inline long double 101663d1a8abSmrg scalbn(long double __x, int __ex) 101763d1a8abSmrg { return __builtin_scalbnl(__x, __ex); } 101863d1a8abSmrg#endif 101963d1a8abSmrg 102063d1a8abSmrg template<typename _Tp> 102163d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 102263d1a8abSmrg double>::__type 102363d1a8abSmrg scalbn(_Tp __x, int __ex) 102463d1a8abSmrg { return __builtin_scalbn(__x, __ex); } 102563d1a8abSmrg 102663d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 102763d1a8abSmrg inline float 102863d1a8abSmrg tgamma(float __x) 102963d1a8abSmrg { return __builtin_tgammaf(__x); } 103063d1a8abSmrg 103163d1a8abSmrg inline long double 103263d1a8abSmrg tgamma(long double __x) 103363d1a8abSmrg { return __builtin_tgammal(__x); } 103463d1a8abSmrg#endif 103563d1a8abSmrg 103663d1a8abSmrg template<typename _Tp> 103763d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 103863d1a8abSmrg double>::__type 103963d1a8abSmrg tgamma(_Tp __x) 104063d1a8abSmrg { return __builtin_tgamma(__x); } 104163d1a8abSmrg 104263d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 104363d1a8abSmrg inline float 104463d1a8abSmrg trunc(float __x) 104563d1a8abSmrg { return __builtin_truncf(__x); } 104663d1a8abSmrg 104763d1a8abSmrg inline long double 104863d1a8abSmrg trunc(long double __x) 104963d1a8abSmrg { return __builtin_truncl(__x); } 105063d1a8abSmrg#endif 105163d1a8abSmrg 105263d1a8abSmrg template<typename _Tp> 105363d1a8abSmrg inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 105463d1a8abSmrg double>::__type 105563d1a8abSmrg trunc(_Tp __x) 105663d1a8abSmrg { return __builtin_trunc(__x); } 105763d1a8abSmrg 105863d1a8abSmrg#endif // __cplusplus < 201103L 105963d1a8abSmrg 1060*ec02198aSmrg /// @} 106163d1a8abSmrg 1062c7a68eb7Smrg#endif /* _GLIBCXX_USE_C99_MATH_TR1 */ 106363d1a8abSmrg 106463d1a8abSmrg // DR 550. What should the return type of pow(float,int) be? 106563d1a8abSmrg // NB: C++11 and TR1 != C++03. 106663d1a8abSmrg 106763d1a8abSmrg // We cannot do "using std::pow;" because that would bring in unwanted 106863d1a8abSmrg // pow(*, int) overloads in C++03, with the wrong return type. Instead we 106963d1a8abSmrg // define all the necessary overloads, but the std::tr1::pow(double, double) 107063d1a8abSmrg // overload cannot be provided here, because <tr1/math.h> would add it to 107163d1a8abSmrg // the global namespace where it would clash with ::pow(double,double) from 107263d1a8abSmrg // libc (revealed by the fix of PR c++/54537). 107363d1a8abSmrg // The solution is to forward std::tr1::pow(double,double) to 107463d1a8abSmrg // std::pow(double,double) via the function template below. See 107563d1a8abSmrg // the discussion about this issue here: 107663d1a8abSmrg // http://gcc.gnu.org/ml/gcc-patches/2012-09/msg01278.html 107763d1a8abSmrg 107863d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 107963d1a8abSmrg inline float 108063d1a8abSmrg pow(float __x, float __y) 108163d1a8abSmrg { return std::pow(__x, __y); } 108263d1a8abSmrg 108363d1a8abSmrg inline long double 108463d1a8abSmrg pow(long double __x, long double __y) 108563d1a8abSmrg { return std::pow(__x, __y); } 108663d1a8abSmrg#endif 108763d1a8abSmrg 108863d1a8abSmrg template<typename _Tp, typename _Up> 108963d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 109063d1a8abSmrg pow(_Tp __x, _Up __y) 109163d1a8abSmrg { 109263d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 109363d1a8abSmrg return std::pow(__type(__x), __type(__y)); 109463d1a8abSmrg } 109563d1a8abSmrg 109663d1a8abSmrg#if __cplusplus >= 201103L 109763d1a8abSmrg // We also deal with fabs in a special way, because "using std::fabs;" 109863d1a8abSmrg // could bring in C++11's std::fabs<T>(const std::complex<T>&) with a 109963d1a8abSmrg // different return type from std::tr1::fabs<T>(const std::complex<T>&). 110063d1a8abSmrg // We define the necessary overloads, except std::tr1::fabs(double) which 110163d1a8abSmrg // could clash with ::fabs(double) from libc. 110263d1a8abSmrg // The function template handles double as well as integers, forwarding 110363d1a8abSmrg // to std::fabs. 110463d1a8abSmrg 110563d1a8abSmrg#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 110663d1a8abSmrg#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 110763d1a8abSmrg inline float 110863d1a8abSmrg fabs(float __x) 110963d1a8abSmrg { return __builtin_fabsf(__x); } 111063d1a8abSmrg 111163d1a8abSmrg inline long double 111263d1a8abSmrg fabs(long double __x) 111363d1a8abSmrg { return __builtin_fabsl(__x); } 111463d1a8abSmrg#endif 111563d1a8abSmrg#endif 111663d1a8abSmrg 111763d1a8abSmrg template<typename _Tp> 111863d1a8abSmrg inline typename __gnu_cxx::__promote<_Tp>::__type 111963d1a8abSmrg fabs(_Tp __x) 112063d1a8abSmrg { return std::fabs(__x); } 112163d1a8abSmrg 112263d1a8abSmrg#else // ! C++11 112363d1a8abSmrg 112463d1a8abSmrg // For C++03 just use std::fabs as there is no overload for std::complex<>. 112563d1a8abSmrg using std::fabs; 112663d1a8abSmrg 112763d1a8abSmrg#endif // C++11 112863d1a8abSmrg 1129*ec02198aSmrg} // namespace tr1 1130*ec02198aSmrg_GLIBCXX_END_NAMESPACE_VERSION 1131*ec02198aSmrg} // namespace std 113263d1a8abSmrg 113363d1a8abSmrg/** 1134*ec02198aSmrg * @defgroup tr1_math_spec_func TR1 Mathematical Special Functions 113563d1a8abSmrg * @ingroup numerics 113663d1a8abSmrg * 113763d1a8abSmrg * A collection of advanced mathematical special functions. 113863d1a8abSmrg */ 113963d1a8abSmrg 1140*ec02198aSmrg#if _GLIBCXX_USE_STD_SPEC_FUNCS 1141*ec02198aSmrg 1142*ec02198aSmrgnamespace std _GLIBCXX_VISIBILITY(default) 1143*ec02198aSmrg{ 1144*ec02198aSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 1145*ec02198aSmrg 1146*ec02198aSmrgnamespace tr1 1147*ec02198aSmrg{ 114863d1a8abSmrg using std::assoc_laguerref; 114963d1a8abSmrg using std::assoc_laguerrel; 115063d1a8abSmrg using std::assoc_laguerre; 115163d1a8abSmrg 115263d1a8abSmrg using std::assoc_legendref; 115363d1a8abSmrg using std::assoc_legendrel; 115463d1a8abSmrg using std::assoc_legendre; 115563d1a8abSmrg 115663d1a8abSmrg using std::betaf; 115763d1a8abSmrg using std::betal; 115863d1a8abSmrg using std::beta; 115963d1a8abSmrg 116063d1a8abSmrg using std::comp_ellint_1f; 116163d1a8abSmrg using std::comp_ellint_1l; 116263d1a8abSmrg using std::comp_ellint_1; 116363d1a8abSmrg 116463d1a8abSmrg using std::comp_ellint_2f; 116563d1a8abSmrg using std::comp_ellint_2l; 116663d1a8abSmrg using std::comp_ellint_2; 116763d1a8abSmrg 116863d1a8abSmrg using std::comp_ellint_3f; 116963d1a8abSmrg using std::comp_ellint_3l; 117063d1a8abSmrg using std::comp_ellint_3; 117163d1a8abSmrg 117263d1a8abSmrg using std::cyl_bessel_if; 117363d1a8abSmrg using std::cyl_bessel_il; 117463d1a8abSmrg using std::cyl_bessel_i; 117563d1a8abSmrg 117663d1a8abSmrg using std::cyl_bessel_jf; 117763d1a8abSmrg using std::cyl_bessel_jl; 117863d1a8abSmrg using std::cyl_bessel_j; 117963d1a8abSmrg 118063d1a8abSmrg using std::cyl_bessel_kf; 118163d1a8abSmrg using std::cyl_bessel_kl; 118263d1a8abSmrg using std::cyl_bessel_k; 118363d1a8abSmrg 118463d1a8abSmrg using std::cyl_neumannf; 118563d1a8abSmrg using std::cyl_neumannl; 118663d1a8abSmrg using std::cyl_neumann; 118763d1a8abSmrg 118863d1a8abSmrg using std::ellint_1f; 118963d1a8abSmrg using std::ellint_1l; 119063d1a8abSmrg using std::ellint_1; 119163d1a8abSmrg 119263d1a8abSmrg using std::ellint_2f; 119363d1a8abSmrg using std::ellint_2l; 119463d1a8abSmrg using std::ellint_2; 119563d1a8abSmrg 119663d1a8abSmrg using std::ellint_3f; 119763d1a8abSmrg using std::ellint_3l; 119863d1a8abSmrg using std::ellint_3; 119963d1a8abSmrg 120063d1a8abSmrg using std::expintf; 120163d1a8abSmrg using std::expintl; 120263d1a8abSmrg using std::expint; 120363d1a8abSmrg 120463d1a8abSmrg using std::hermitef; 120563d1a8abSmrg using std::hermitel; 120663d1a8abSmrg using std::hermite; 120763d1a8abSmrg 120863d1a8abSmrg using std::laguerref; 120963d1a8abSmrg using std::laguerrel; 121063d1a8abSmrg using std::laguerre; 121163d1a8abSmrg 121263d1a8abSmrg using std::legendref; 121363d1a8abSmrg using std::legendrel; 121463d1a8abSmrg using std::legendre; 121563d1a8abSmrg 121663d1a8abSmrg using std::riemann_zetaf; 121763d1a8abSmrg using std::riemann_zetal; 121863d1a8abSmrg using std::riemann_zeta; 121963d1a8abSmrg 122063d1a8abSmrg using std::sph_besself; 122163d1a8abSmrg using std::sph_bessell; 122263d1a8abSmrg using std::sph_bessel; 122363d1a8abSmrg 122463d1a8abSmrg using std::sph_legendref; 122563d1a8abSmrg using std::sph_legendrel; 122663d1a8abSmrg using std::sph_legendre; 122763d1a8abSmrg 122863d1a8abSmrg using std::sph_neumannf; 122963d1a8abSmrg using std::sph_neumannl; 123063d1a8abSmrg using std::sph_neumann; 123163d1a8abSmrg 1232c7a68eb7Smrg} // namespace tr1 1233c7a68eb7Smrg_GLIBCXX_END_NAMESPACE_VERSION 1234c7a68eb7Smrg} // namespace std 1235c7a68eb7Smrg 1236*ec02198aSmrg#else // ! _GLIBCXX_USE_STD_SPEC_FUNCS 1237*ec02198aSmrg 123863d1a8abSmrg#include <bits/stl_algobase.h> 123963d1a8abSmrg#include <limits> 124063d1a8abSmrg#include <tr1/type_traits> 124163d1a8abSmrg 124263d1a8abSmrg#include <tr1/gamma.tcc> 124363d1a8abSmrg#include <tr1/bessel_function.tcc> 124463d1a8abSmrg#include <tr1/beta_function.tcc> 124563d1a8abSmrg#include <tr1/ell_integral.tcc> 124663d1a8abSmrg#include <tr1/exp_integral.tcc> 124763d1a8abSmrg#include <tr1/legendre_function.tcc> 124863d1a8abSmrg#include <tr1/modified_bessel_func.tcc> 124963d1a8abSmrg#include <tr1/poly_hermite.tcc> 125063d1a8abSmrg#include <tr1/poly_laguerre.tcc> 125163d1a8abSmrg#include <tr1/riemann_zeta.tcc> 125263d1a8abSmrg 125363d1a8abSmrgnamespace std _GLIBCXX_VISIBILITY(default) 125463d1a8abSmrg{ 125563d1a8abSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 1256c7a68eb7Smrgnamespace tr1 1257c7a68eb7Smrg { 1258*ec02198aSmrg /** @addtogroup tr1_math_spec_func 125963d1a8abSmrg * @{ 126063d1a8abSmrg */ 126163d1a8abSmrg 126263d1a8abSmrg inline float 126363d1a8abSmrg assoc_laguerref(unsigned int __n, unsigned int __m, float __x) 126463d1a8abSmrg { return __detail::__assoc_laguerre<float>(__n, __m, __x); } 126563d1a8abSmrg 126663d1a8abSmrg inline long double 126763d1a8abSmrg assoc_laguerrel(unsigned int __n, unsigned int __m, long double __x) 126863d1a8abSmrg { 126963d1a8abSmrg return __detail::__assoc_laguerre<long double>(__n, __m, __x); 127063d1a8abSmrg } 127163d1a8abSmrg 127263d1a8abSmrg /// 5.2.1.1 Associated Laguerre polynomials. 127363d1a8abSmrg template<typename _Tp> 127463d1a8abSmrg inline typename __gnu_cxx::__promote<_Tp>::__type 127563d1a8abSmrg assoc_laguerre(unsigned int __n, unsigned int __m, _Tp __x) 127663d1a8abSmrg { 127763d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 127863d1a8abSmrg return __detail::__assoc_laguerre<__type>(__n, __m, __x); 127963d1a8abSmrg } 128063d1a8abSmrg 128163d1a8abSmrg inline float 128263d1a8abSmrg assoc_legendref(unsigned int __l, unsigned int __m, float __x) 128363d1a8abSmrg { return __detail::__assoc_legendre_p<float>(__l, __m, __x); } 128463d1a8abSmrg 128563d1a8abSmrg inline long double 128663d1a8abSmrg assoc_legendrel(unsigned int __l, unsigned int __m, long double __x) 128763d1a8abSmrg { return __detail::__assoc_legendre_p<long double>(__l, __m, __x); } 128863d1a8abSmrg 128963d1a8abSmrg /// 5.2.1.2 Associated Legendre functions. 129063d1a8abSmrg template<typename _Tp> 129163d1a8abSmrg inline typename __gnu_cxx::__promote<_Tp>::__type 129263d1a8abSmrg assoc_legendre(unsigned int __l, unsigned int __m, _Tp __x) 129363d1a8abSmrg { 129463d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 129563d1a8abSmrg return __detail::__assoc_legendre_p<__type>(__l, __m, __x); 129663d1a8abSmrg } 129763d1a8abSmrg 129863d1a8abSmrg inline float 129963d1a8abSmrg betaf(float __x, float __y) 130063d1a8abSmrg { return __detail::__beta<float>(__x, __y); } 130163d1a8abSmrg 130263d1a8abSmrg inline long double 130363d1a8abSmrg betal(long double __x, long double __y) 130463d1a8abSmrg { return __detail::__beta<long double>(__x, __y); } 130563d1a8abSmrg 130663d1a8abSmrg /// 5.2.1.3 Beta functions. 130763d1a8abSmrg template<typename _Tpx, typename _Tpy> 130863d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tpx, _Tpy>::__type 130963d1a8abSmrg beta(_Tpx __x, _Tpy __y) 131063d1a8abSmrg { 131163d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tpx, _Tpy>::__type __type; 131263d1a8abSmrg return __detail::__beta<__type>(__x, __y); 131363d1a8abSmrg } 131463d1a8abSmrg 131563d1a8abSmrg inline float 131663d1a8abSmrg comp_ellint_1f(float __k) 131763d1a8abSmrg { return __detail::__comp_ellint_1<float>(__k); } 131863d1a8abSmrg 131963d1a8abSmrg inline long double 132063d1a8abSmrg comp_ellint_1l(long double __k) 132163d1a8abSmrg { return __detail::__comp_ellint_1<long double>(__k); } 132263d1a8abSmrg 132363d1a8abSmrg /// 5.2.1.4 Complete elliptic integrals of the first kind. 132463d1a8abSmrg template<typename _Tp> 132563d1a8abSmrg inline typename __gnu_cxx::__promote<_Tp>::__type 132663d1a8abSmrg comp_ellint_1(_Tp __k) 132763d1a8abSmrg { 132863d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 132963d1a8abSmrg return __detail::__comp_ellint_1<__type>(__k); 133063d1a8abSmrg } 133163d1a8abSmrg 133263d1a8abSmrg inline float 133363d1a8abSmrg comp_ellint_2f(float __k) 133463d1a8abSmrg { return __detail::__comp_ellint_2<float>(__k); } 133563d1a8abSmrg 133663d1a8abSmrg inline long double 133763d1a8abSmrg comp_ellint_2l(long double __k) 133863d1a8abSmrg { return __detail::__comp_ellint_2<long double>(__k); } 133963d1a8abSmrg 134063d1a8abSmrg /// 5.2.1.5 Complete elliptic integrals of the second kind. 134163d1a8abSmrg template<typename _Tp> 134263d1a8abSmrg inline typename __gnu_cxx::__promote<_Tp>::__type 134363d1a8abSmrg comp_ellint_2(_Tp __k) 134463d1a8abSmrg { 134563d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 134663d1a8abSmrg return __detail::__comp_ellint_2<__type>(__k); 134763d1a8abSmrg } 134863d1a8abSmrg 134963d1a8abSmrg inline float 135063d1a8abSmrg comp_ellint_3f(float __k, float __nu) 135163d1a8abSmrg { return __detail::__comp_ellint_3<float>(__k, __nu); } 135263d1a8abSmrg 135363d1a8abSmrg inline long double 135463d1a8abSmrg comp_ellint_3l(long double __k, long double __nu) 135563d1a8abSmrg { return __detail::__comp_ellint_3<long double>(__k, __nu); } 135663d1a8abSmrg 135763d1a8abSmrg /// 5.2.1.6 Complete elliptic integrals of the third kind. 135863d1a8abSmrg template<typename _Tp, typename _Tpn> 135963d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type 136063d1a8abSmrg comp_ellint_3(_Tp __k, _Tpn __nu) 136163d1a8abSmrg { 136263d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tp, _Tpn>::__type __type; 136363d1a8abSmrg return __detail::__comp_ellint_3<__type>(__k, __nu); 136463d1a8abSmrg } 136563d1a8abSmrg 136663d1a8abSmrg inline float 136763d1a8abSmrg cyl_bessel_if(float __nu, float __x) 136863d1a8abSmrg { return __detail::__cyl_bessel_i<float>(__nu, __x); } 136963d1a8abSmrg 137063d1a8abSmrg inline long double 137163d1a8abSmrg cyl_bessel_il(long double __nu, long double __x) 137263d1a8abSmrg { return __detail::__cyl_bessel_i<long double>(__nu, __x); } 137363d1a8abSmrg 137463d1a8abSmrg /// 5.2.1.8 Regular modified cylindrical Bessel functions. 137563d1a8abSmrg template<typename _Tpnu, typename _Tp> 137663d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type 137763d1a8abSmrg cyl_bessel_i(_Tpnu __nu, _Tp __x) 137863d1a8abSmrg { 137963d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type; 138063d1a8abSmrg return __detail::__cyl_bessel_i<__type>(__nu, __x); 138163d1a8abSmrg } 138263d1a8abSmrg 138363d1a8abSmrg inline float 138463d1a8abSmrg cyl_bessel_jf(float __nu, float __x) 138563d1a8abSmrg { return __detail::__cyl_bessel_j<float>(__nu, __x); } 138663d1a8abSmrg 138763d1a8abSmrg inline long double 138863d1a8abSmrg cyl_bessel_jl(long double __nu, long double __x) 138963d1a8abSmrg { return __detail::__cyl_bessel_j<long double>(__nu, __x); } 139063d1a8abSmrg 139163d1a8abSmrg /// 5.2.1.9 Cylindrical Bessel functions (of the first kind). 139263d1a8abSmrg template<typename _Tpnu, typename _Tp> 139363d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type 139463d1a8abSmrg cyl_bessel_j(_Tpnu __nu, _Tp __x) 139563d1a8abSmrg { 139663d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type; 139763d1a8abSmrg return __detail::__cyl_bessel_j<__type>(__nu, __x); 139863d1a8abSmrg } 139963d1a8abSmrg 140063d1a8abSmrg inline float 140163d1a8abSmrg cyl_bessel_kf(float __nu, float __x) 140263d1a8abSmrg { return __detail::__cyl_bessel_k<float>(__nu, __x); } 140363d1a8abSmrg 140463d1a8abSmrg inline long double 140563d1a8abSmrg cyl_bessel_kl(long double __nu, long double __x) 140663d1a8abSmrg { return __detail::__cyl_bessel_k<long double>(__nu, __x); } 140763d1a8abSmrg 140863d1a8abSmrg /// 5.2.1.10 Irregular modified cylindrical Bessel functions. 140963d1a8abSmrg template<typename _Tpnu, typename _Tp> 141063d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type 141163d1a8abSmrg cyl_bessel_k(_Tpnu __nu, _Tp __x) 141263d1a8abSmrg { 141363d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type; 141463d1a8abSmrg return __detail::__cyl_bessel_k<__type>(__nu, __x); 141563d1a8abSmrg } 141663d1a8abSmrg 141763d1a8abSmrg inline float 141863d1a8abSmrg cyl_neumannf(float __nu, float __x) 141963d1a8abSmrg { return __detail::__cyl_neumann_n<float>(__nu, __x); } 142063d1a8abSmrg 142163d1a8abSmrg inline long double 142263d1a8abSmrg cyl_neumannl(long double __nu, long double __x) 142363d1a8abSmrg { return __detail::__cyl_neumann_n<long double>(__nu, __x); } 142463d1a8abSmrg 142563d1a8abSmrg /// 5.2.1.11 Cylindrical Neumann functions. 142663d1a8abSmrg template<typename _Tpnu, typename _Tp> 142763d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type 142863d1a8abSmrg cyl_neumann(_Tpnu __nu, _Tp __x) 142963d1a8abSmrg { 143063d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tpnu, _Tp>::__type __type; 143163d1a8abSmrg return __detail::__cyl_neumann_n<__type>(__nu, __x); 143263d1a8abSmrg } 143363d1a8abSmrg 143463d1a8abSmrg inline float 143563d1a8abSmrg ellint_1f(float __k, float __phi) 143663d1a8abSmrg { return __detail::__ellint_1<float>(__k, __phi); } 143763d1a8abSmrg 143863d1a8abSmrg inline long double 143963d1a8abSmrg ellint_1l(long double __k, long double __phi) 144063d1a8abSmrg { return __detail::__ellint_1<long double>(__k, __phi); } 144163d1a8abSmrg 144263d1a8abSmrg /// 5.2.1.12 Incomplete elliptic integrals of the first kind. 144363d1a8abSmrg template<typename _Tp, typename _Tpp> 144463d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type 144563d1a8abSmrg ellint_1(_Tp __k, _Tpp __phi) 144663d1a8abSmrg { 144763d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type; 144863d1a8abSmrg return __detail::__ellint_1<__type>(__k, __phi); 144963d1a8abSmrg } 145063d1a8abSmrg 145163d1a8abSmrg inline float 145263d1a8abSmrg ellint_2f(float __k, float __phi) 145363d1a8abSmrg { return __detail::__ellint_2<float>(__k, __phi); } 145463d1a8abSmrg 145563d1a8abSmrg inline long double 145663d1a8abSmrg ellint_2l(long double __k, long double __phi) 145763d1a8abSmrg { return __detail::__ellint_2<long double>(__k, __phi); } 145863d1a8abSmrg 145963d1a8abSmrg /// 5.2.1.13 Incomplete elliptic integrals of the second kind. 146063d1a8abSmrg template<typename _Tp, typename _Tpp> 146163d1a8abSmrg inline typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type 146263d1a8abSmrg ellint_2(_Tp __k, _Tpp __phi) 146363d1a8abSmrg { 146463d1a8abSmrg typedef typename __gnu_cxx::__promote_2<_Tp, _Tpp>::__type __type; 146563d1a8abSmrg return __detail::__ellint_2<__type>(__k, __phi); 146663d1a8abSmrg } 146763d1a8abSmrg 146863d1a8abSmrg inline float 146963d1a8abSmrg ellint_3f(float __k, float __nu, float __phi) 147063d1a8abSmrg { return __detail::__ellint_3<float>(__k, __nu, __phi); } 147163d1a8abSmrg 147263d1a8abSmrg inline long double 147363d1a8abSmrg ellint_3l(long double __k, long double __nu, long double __phi) 147463d1a8abSmrg { return __detail::__ellint_3<long double>(__k, __nu, __phi); } 147563d1a8abSmrg 147663d1a8abSmrg /// 5.2.1.14 Incomplete elliptic integrals of the third kind. 147763d1a8abSmrg template<typename _Tp, typename _Tpn, typename _Tpp> 147863d1a8abSmrg inline typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type 147963d1a8abSmrg ellint_3(_Tp __k, _Tpn __nu, _Tpp __phi) 148063d1a8abSmrg { 148163d1a8abSmrg typedef typename __gnu_cxx::__promote_3<_Tp, _Tpn, _Tpp>::__type __type; 148263d1a8abSmrg return __detail::__ellint_3<__type>(__k, __nu, __phi); 148363d1a8abSmrg } 148463d1a8abSmrg 148563d1a8abSmrg inline float 148663d1a8abSmrg expintf(float __x) 148763d1a8abSmrg { return __detail::__expint<float>(__x); } 148863d1a8abSmrg 148963d1a8abSmrg inline long double 149063d1a8abSmrg expintl(long double __x) 149163d1a8abSmrg { return __detail::__expint<long double>(__x); } 149263d1a8abSmrg 149363d1a8abSmrg /// 5.2.1.15 Exponential integrals. 149463d1a8abSmrg template<typename _Tp> 149563d1a8abSmrg inline typename __gnu_cxx::__promote<_Tp>::__type 149663d1a8abSmrg expint(_Tp __x) 149763d1a8abSmrg { 149863d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 149963d1a8abSmrg return __detail::__expint<__type>(__x); 150063d1a8abSmrg } 150163d1a8abSmrg 150263d1a8abSmrg inline float 150363d1a8abSmrg hermitef(unsigned int __n, float __x) 150463d1a8abSmrg { return __detail::__poly_hermite<float>(__n, __x); } 150563d1a8abSmrg 150663d1a8abSmrg inline long double 150763d1a8abSmrg hermitel(unsigned int __n, long double __x) 150863d1a8abSmrg { return __detail::__poly_hermite<long double>(__n, __x); } 150963d1a8abSmrg 151063d1a8abSmrg /// 5.2.1.16 Hermite polynomials. 151163d1a8abSmrg template<typename _Tp> 151263d1a8abSmrg inline typename __gnu_cxx::__promote<_Tp>::__type 151363d1a8abSmrg hermite(unsigned int __n, _Tp __x) 151463d1a8abSmrg { 151563d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 151663d1a8abSmrg return __detail::__poly_hermite<__type>(__n, __x); 151763d1a8abSmrg } 151863d1a8abSmrg 151963d1a8abSmrg inline float 152063d1a8abSmrg laguerref(unsigned int __n, float __x) 152163d1a8abSmrg { return __detail::__laguerre<float>(__n, __x); } 152263d1a8abSmrg 152363d1a8abSmrg inline long double 152463d1a8abSmrg laguerrel(unsigned int __n, long double __x) 152563d1a8abSmrg { return __detail::__laguerre<long double>(__n, __x); } 152663d1a8abSmrg 152763d1a8abSmrg /// 5.2.1.18 Laguerre polynomials. 152863d1a8abSmrg template<typename _Tp> 152963d1a8abSmrg inline typename __gnu_cxx::__promote<_Tp>::__type 153063d1a8abSmrg laguerre(unsigned int __n, _Tp __x) 153163d1a8abSmrg { 153263d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 153363d1a8abSmrg return __detail::__laguerre<__type>(__n, __x); 153463d1a8abSmrg } 153563d1a8abSmrg 153663d1a8abSmrg inline float 153763d1a8abSmrg legendref(unsigned int __n, float __x) 153863d1a8abSmrg { return __detail::__poly_legendre_p<float>(__n, __x); } 153963d1a8abSmrg 154063d1a8abSmrg inline long double 154163d1a8abSmrg legendrel(unsigned int __n, long double __x) 154263d1a8abSmrg { return __detail::__poly_legendre_p<long double>(__n, __x); } 154363d1a8abSmrg 154463d1a8abSmrg /// 5.2.1.19 Legendre polynomials. 154563d1a8abSmrg template<typename _Tp> 154663d1a8abSmrg inline typename __gnu_cxx::__promote<_Tp>::__type 154763d1a8abSmrg legendre(unsigned int __n, _Tp __x) 154863d1a8abSmrg { 154963d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 155063d1a8abSmrg return __detail::__poly_legendre_p<__type>(__n, __x); 155163d1a8abSmrg } 155263d1a8abSmrg 155363d1a8abSmrg inline float 155463d1a8abSmrg riemann_zetaf(float __x) 155563d1a8abSmrg { return __detail::__riemann_zeta<float>(__x); } 155663d1a8abSmrg 155763d1a8abSmrg inline long double 155863d1a8abSmrg riemann_zetal(long double __x) 155963d1a8abSmrg { return __detail::__riemann_zeta<long double>(__x); } 156063d1a8abSmrg 156163d1a8abSmrg /// 5.2.1.20 Riemann zeta function. 156263d1a8abSmrg template<typename _Tp> 156363d1a8abSmrg inline typename __gnu_cxx::__promote<_Tp>::__type 156463d1a8abSmrg riemann_zeta(_Tp __x) 156563d1a8abSmrg { 156663d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 156763d1a8abSmrg return __detail::__riemann_zeta<__type>(__x); 156863d1a8abSmrg } 156963d1a8abSmrg 157063d1a8abSmrg inline float 157163d1a8abSmrg sph_besself(unsigned int __n, float __x) 157263d1a8abSmrg { return __detail::__sph_bessel<float>(__n, __x); } 157363d1a8abSmrg 157463d1a8abSmrg inline long double 157563d1a8abSmrg sph_bessell(unsigned int __n, long double __x) 157663d1a8abSmrg { return __detail::__sph_bessel<long double>(__n, __x); } 157763d1a8abSmrg 157863d1a8abSmrg /// 5.2.1.21 Spherical Bessel functions. 157963d1a8abSmrg template<typename _Tp> 158063d1a8abSmrg inline typename __gnu_cxx::__promote<_Tp>::__type 158163d1a8abSmrg sph_bessel(unsigned int __n, _Tp __x) 158263d1a8abSmrg { 158363d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 158463d1a8abSmrg return __detail::__sph_bessel<__type>(__n, __x); 158563d1a8abSmrg } 158663d1a8abSmrg 158763d1a8abSmrg inline float 158863d1a8abSmrg sph_legendref(unsigned int __l, unsigned int __m, float __theta) 158963d1a8abSmrg { return __detail::__sph_legendre<float>(__l, __m, __theta); } 159063d1a8abSmrg 159163d1a8abSmrg inline long double 159263d1a8abSmrg sph_legendrel(unsigned int __l, unsigned int __m, long double __theta) 159363d1a8abSmrg { return __detail::__sph_legendre<long double>(__l, __m, __theta); } 159463d1a8abSmrg 159563d1a8abSmrg /// 5.2.1.22 Spherical associated Legendre functions. 159663d1a8abSmrg template<typename _Tp> 159763d1a8abSmrg inline typename __gnu_cxx::__promote<_Tp>::__type 159863d1a8abSmrg sph_legendre(unsigned int __l, unsigned int __m, _Tp __theta) 159963d1a8abSmrg { 160063d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 160163d1a8abSmrg return __detail::__sph_legendre<__type>(__l, __m, __theta); 160263d1a8abSmrg } 160363d1a8abSmrg 160463d1a8abSmrg inline float 160563d1a8abSmrg sph_neumannf(unsigned int __n, float __x) 160663d1a8abSmrg { return __detail::__sph_neumann<float>(__n, __x); } 160763d1a8abSmrg 160863d1a8abSmrg inline long double 160963d1a8abSmrg sph_neumannl(unsigned int __n, long double __x) 161063d1a8abSmrg { return __detail::__sph_neumann<long double>(__n, __x); } 161163d1a8abSmrg 161263d1a8abSmrg /// 5.2.1.23 Spherical Neumann functions. 161363d1a8abSmrg template<typename _Tp> 161463d1a8abSmrg inline typename __gnu_cxx::__promote<_Tp>::__type 161563d1a8abSmrg sph_neumann(unsigned int __n, _Tp __x) 161663d1a8abSmrg { 161763d1a8abSmrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 161863d1a8abSmrg return __detail::__sph_neumann<__type>(__n, __x); 161963d1a8abSmrg } 162063d1a8abSmrg 1621*ec02198aSmrg /// @} tr1_math_spec_func 162263d1a8abSmrg 1623c7a68eb7Smrg} // namespace tr1 1624c7a68eb7Smrg 1625c7a68eb7Smrg_GLIBCXX_END_NAMESPACE_VERSION 1626c7a68eb7Smrg} // namespace std 1627c7a68eb7Smrg 1628*ec02198aSmrg#endif // _GLIBCXX_USE_STD_SPEC_FUNCS 1629*ec02198aSmrg 1630c7a68eb7Smrg#if _GLIBCXX_USE_STD_SPEC_FUNCS && !defined(__STRICT_ANSI__) 1631c7a68eb7Smrgnamespace std _GLIBCXX_VISIBILITY(default) 1632c7a68eb7Smrg{ 1633c7a68eb7Smrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 1634c7a68eb7Smrg 1635c7a68eb7Smrgnamespace tr1 1636c7a68eb7Smrg{ 1637c7a68eb7Smrg using __gnu_cxx::conf_hypergf; 1638c7a68eb7Smrg using __gnu_cxx::conf_hypergl; 1639c7a68eb7Smrg using __gnu_cxx::conf_hyperg; 1640c7a68eb7Smrg 1641c7a68eb7Smrg using __gnu_cxx::hypergf; 1642c7a68eb7Smrg using __gnu_cxx::hypergl; 1643c7a68eb7Smrg using __gnu_cxx::hyperg; 1644c7a68eb7Smrg} // namespace tr1 1645c7a68eb7Smrg 1646c7a68eb7Smrg_GLIBCXX_END_NAMESPACE_VERSION 1647c7a68eb7Smrg} // namespace std 1648c7a68eb7Smrg 1649c7a68eb7Smrg#else // ! (_GLIBCXX_USE_STD_SPEC_FUNCS && !defined(__STRICT_ANSI__)) 1650c7a68eb7Smrg 1651c7a68eb7Smrg#include <bits/stl_algobase.h> 1652c7a68eb7Smrg#include <limits> 1653c7a68eb7Smrg#include <tr1/type_traits> 1654c7a68eb7Smrg 1655c7a68eb7Smrg#include <tr1/hypergeometric.tcc> 1656c7a68eb7Smrg 1657c7a68eb7Smrgnamespace std _GLIBCXX_VISIBILITY(default) 1658c7a68eb7Smrg{ 1659c7a68eb7Smrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 1660c7a68eb7Smrg 1661c7a68eb7Smrgnamespace tr1 1662c7a68eb7Smrg{ 1663*ec02198aSmrg /** @addtogroup tr1_math_spec_func 1664*ec02198aSmrg * @{ 1665*ec02198aSmrg */ 1666*ec02198aSmrg 1667c7a68eb7Smrg inline float 1668c7a68eb7Smrg conf_hypergf(float __a, float __c, float __x) 1669c7a68eb7Smrg { return __detail::__conf_hyperg<float>(__a, __c, __x); } 1670c7a68eb7Smrg 1671c7a68eb7Smrg inline long double 1672c7a68eb7Smrg conf_hypergl(long double __a, long double __c, long double __x) 1673c7a68eb7Smrg { return __detail::__conf_hyperg<long double>(__a, __c, __x); } 1674c7a68eb7Smrg 1675c7a68eb7Smrg /// 5.2.1.7 Confluent hypergeometric functions. 1676c7a68eb7Smrg template<typename _Tpa, typename _Tpc, typename _Tp> 1677c7a68eb7Smrg inline typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type 1678c7a68eb7Smrg conf_hyperg(_Tpa __a, _Tpc __c, _Tp __x) 1679c7a68eb7Smrg { 1680c7a68eb7Smrg typedef typename __gnu_cxx::__promote_3<_Tpa, _Tpc, _Tp>::__type __type; 1681c7a68eb7Smrg return __detail::__conf_hyperg<__type>(__a, __c, __x); 1682c7a68eb7Smrg } 1683c7a68eb7Smrg 1684c7a68eb7Smrg inline float 1685c7a68eb7Smrg hypergf(float __a, float __b, float __c, float __x) 1686c7a68eb7Smrg { return __detail::__hyperg<float>(__a, __b, __c, __x); } 1687c7a68eb7Smrg 1688c7a68eb7Smrg inline long double 1689c7a68eb7Smrg hypergl(long double __a, long double __b, long double __c, long double __x) 1690c7a68eb7Smrg { return __detail::__hyperg<long double>(__a, __b, __c, __x); } 1691c7a68eb7Smrg 1692c7a68eb7Smrg /// 5.2.1.17 Hypergeometric functions. 1693c7a68eb7Smrg template<typename _Tpa, typename _Tpb, typename _Tpc, typename _Tp> 1694c7a68eb7Smrg inline typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>::__type 1695c7a68eb7Smrg hyperg(_Tpa __a, _Tpb __b, _Tpc __c, _Tp __x) 1696c7a68eb7Smrg { 1697c7a68eb7Smrg typedef typename __gnu_cxx::__promote_4<_Tpa, _Tpb, _Tpc, _Tp>::__type __type; 1698c7a68eb7Smrg return __detail::__hyperg<__type>(__a, __b, __c, __x); 1699c7a68eb7Smrg } 1700c7a68eb7Smrg 1701*ec02198aSmrg /// @} tr1_math_spec_func 1702*ec02198aSmrg 1703c7a68eb7Smrg} // namespace tr1 1704c7a68eb7Smrg 1705c7a68eb7Smrg_GLIBCXX_END_NAMESPACE_VERSION 1706c7a68eb7Smrg} // namespace std 1707c7a68eb7Smrg#endif // _GLIBCXX_USE_STD_SPEC_FUNCS && !defined(__STRICT_ANSI__) 1708c7a68eb7Smrg 170963d1a8abSmrg#endif // _GLIBCXX_TR1_CMATH 1710