1169691Skan// TR1 cmath -*- C++ -*- 2169691Skan 3169691Skan// Copyright (C) 2006 Free Software Foundation, Inc. 4169691Skan// 5169691Skan// This file is part of the GNU ISO C++ Library. This library is free 6169691Skan// software; you can redistribute it and/or modify it under the 7169691Skan// terms of the GNU General Public License as published by the 8169691Skan// Free Software Foundation; either version 2, or (at your option) 9169691Skan// any later version. 10169691Skan 11169691Skan// This library is distributed in the hope that it will be useful, 12169691Skan// but WITHOUT ANY WARRANTY; without even the implied warranty of 13169691Skan// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14169691Skan// GNU General Public License for more details. 15169691Skan 16169691Skan// You should have received a copy of the GNU General Public License along 17169691Skan// with this library; see the file COPYING. If not, write to the Free 18169691Skan// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19169691Skan// USA. 20169691Skan 21169691Skan// As a special exception, you may use this file as part of a free software 22169691Skan// library without restriction. Specifically, if other files instantiate 23169691Skan// templates or use macros or inline functions from this file, or you compile 24169691Skan// this file and link it with other files to produce an executable, this 25169691Skan// file does not by itself cause the resulting executable to be covered by 26169691Skan// the GNU General Public License. This exception does not however 27169691Skan// invalidate any other reasons why the executable file might be covered by 28169691Skan// the GNU General Public License. 29169691Skan 30169691Skan/** @file tr1/cmath 31169691Skan * This is a TR1 C++ Library header. 32169691Skan */ 33169691Skan 34169691Skan#ifndef _TR1_CMATH 35169691Skan#define _TR1_CMATH 1 36169691Skan 37169691Skan#include <bits/c++config.h> 38169691Skan#include <cmath> 39169691Skan#include <tr1/common.h> 40169691Skan 41169691Skan#if _GLIBCXX_USE_C99_MATH_TR1 42169691Skan 43169691Skan#undef acosh 44169691Skan#undef acoshf 45169691Skan#undef acoshl 46169691Skan#undef asinh 47169691Skan#undef asinhf 48169691Skan#undef asinhl 49169691Skan#undef atanh 50169691Skan#undef atanhf 51169691Skan#undef atanhl 52169691Skan#undef cbrt 53169691Skan#undef cbrtf 54169691Skan#undef cbrtl 55169691Skan#undef copysign 56169691Skan#undef copysignf 57169691Skan#undef copysignl 58169691Skan#undef erf 59169691Skan#undef erff 60169691Skan#undef erfl 61169691Skan#undef erfc 62169691Skan#undef erfcf 63169691Skan#undef erfcl 64169691Skan#undef exp2 65169691Skan#undef exp2f 66169691Skan#undef exp2l 67169691Skan#undef expm1 68169691Skan#undef expm1f 69169691Skan#undef expm1l 70169691Skan#undef fdim 71169691Skan#undef fdimf 72169691Skan#undef fdiml 73169691Skan#undef fma 74169691Skan#undef fmaf 75169691Skan#undef fmal 76169691Skan#undef fmax 77169691Skan#undef fmaxf 78169691Skan#undef fmaxl 79169691Skan#undef fmin 80169691Skan#undef fminf 81169691Skan#undef fminl 82169691Skan#undef hypot 83169691Skan#undef hypotf 84169691Skan#undef hypotl 85169691Skan#undef ilogb 86169691Skan#undef ilogbf 87169691Skan#undef ilogbl 88169691Skan#undef lgamma 89169691Skan#undef lgammaf 90169691Skan#undef lgammal 91169691Skan#undef llrint 92169691Skan#undef llrintf 93169691Skan#undef llrintl 94169691Skan#undef llround 95169691Skan#undef llroundf 96169691Skan#undef llroundl 97169691Skan#undef log1p 98169691Skan#undef log1pf 99169691Skan#undef log1pl 100169691Skan#undef log2 101169691Skan#undef log2f 102169691Skan#undef log2l 103169691Skan#undef logb 104169691Skan#undef logbf 105169691Skan#undef logbl 106169691Skan#undef lrint 107169691Skan#undef lrintf 108169691Skan#undef lrintl 109169691Skan#undef lround 110169691Skan#undef lroundf 111169691Skan#undef lroundl 112169691Skan#undef nan 113169691Skan#undef nanf 114169691Skan#undef nanl 115169691Skan#undef nearbyint 116169691Skan#undef nearbyintf 117169691Skan#undef nearbyintl 118169691Skan#undef nextafter 119169691Skan#undef nextafterf 120169691Skan#undef nextafterl 121169691Skan#undef nexttoward 122169691Skan#undef nexttowardf 123169691Skan#undef nexttowardl 124169691Skan#undef remainder 125169691Skan#undef remainderf 126169691Skan#undef remainderl 127169691Skan#undef remquo 128169691Skan#undef remquo 129169691Skan#undef remquo 130169691Skan#undef rint 131169691Skan#undef rintf 132169691Skan#undef rintl 133169691Skan#undef round 134169691Skan#undef roundf 135169691Skan#undef roundl 136169691Skan#undef scalbln 137169691Skan#undef scalblnf 138169691Skan#undef scalblnl 139169691Skan#undef scalbn 140169691Skan#undef scalbnf 141169691Skan#undef scalbnl 142169691Skan#undef tgamma 143169691Skan#undef tgammaf 144169691Skan#undef tgammal 145169691Skan#undef trunc 146169691Skan#undef truncf 147169691Skan#undef truncl 148169691Skan 149169691Skan#endif 150169691Skan 151169691Skan// namespace std::tr1 152169691Skannamespace std 153169691Skan{ 154169691Skan_GLIBCXX_BEGIN_NAMESPACE(tr1) 155169691Skan 156169691Skan#if _GLIBCXX_USE_C99_MATH_TR1 157169691Skan 158169691Skan // types 159169691Skan using ::double_t; 160169691Skan using ::float_t; 161169691Skan 162169691Skan // functions 163169691Skan using ::acosh; 164169691Skan using ::acoshf; 165169691Skan using ::acoshl; 166169691Skan 167169691Skan using ::asinh; 168169691Skan using ::asinhf; 169169691Skan using ::asinhl; 170169691Skan 171169691Skan using ::atanh; 172169691Skan using ::atanhf; 173169691Skan using ::atanhl; 174169691Skan 175169691Skan using ::cbrt; 176169691Skan using ::cbrtf; 177169691Skan using ::cbrtl; 178169691Skan 179169691Skan using ::copysign; 180169691Skan using ::copysignf; 181169691Skan using ::copysignl; 182169691Skan 183169691Skan using ::erf; 184169691Skan using ::erff; 185169691Skan using ::erfl; 186169691Skan 187169691Skan using ::erfc; 188169691Skan using ::erfcf; 189169691Skan using ::erfcl; 190169691Skan 191169691Skan using ::exp2; 192169691Skan using ::exp2f; 193169691Skan using ::exp2l; 194169691Skan 195169691Skan using ::expm1; 196169691Skan using ::expm1f; 197169691Skan using ::expm1l; 198169691Skan 199169691Skan using ::fdim; 200169691Skan using ::fdimf; 201169691Skan using ::fdiml; 202169691Skan 203169691Skan using ::fma; 204169691Skan using ::fmaf; 205169691Skan using ::fmal; 206169691Skan 207169691Skan using ::fmax; 208169691Skan using ::fmaxf; 209169691Skan using ::fmaxl; 210169691Skan 211169691Skan using ::fmin; 212169691Skan using ::fminf; 213169691Skan using ::fminl; 214169691Skan 215169691Skan using ::hypot; 216169691Skan using ::hypotf; 217169691Skan using ::hypotl; 218169691Skan 219169691Skan using ::ilogb; 220169691Skan using ::ilogbf; 221169691Skan using ::ilogbl; 222169691Skan 223169691Skan using ::lgamma; 224169691Skan using ::lgammaf; 225169691Skan using ::lgammal; 226169691Skan 227169691Skan using ::llrint; 228169691Skan using ::llrintf; 229169691Skan using ::llrintl; 230169691Skan 231169691Skan using ::llround; 232169691Skan using ::llroundf; 233169691Skan using ::llroundl; 234169691Skan 235169691Skan using ::log1p; 236169691Skan using ::log1pf; 237169691Skan using ::log1pl; 238169691Skan 239169691Skan using ::log2; 240169691Skan using ::log2f; 241169691Skan using ::log2l; 242169691Skan 243169691Skan using ::logb; 244169691Skan using ::logbf; 245169691Skan using ::logbl; 246169691Skan 247169691Skan using ::lrint; 248169691Skan using ::lrintf; 249169691Skan using ::lrintl; 250169691Skan 251169691Skan using ::lround; 252169691Skan using ::lroundf; 253169691Skan using ::lroundl; 254169691Skan 255169691Skan using ::nan; 256169691Skan using ::nanf; 257169691Skan using ::nanl; 258169691Skan 259169691Skan using ::nearbyint; 260169691Skan using ::nearbyintf; 261169691Skan using ::nearbyintl; 262169691Skan 263169691Skan using ::nextafter; 264169691Skan using ::nextafterf; 265169691Skan using ::nextafterl; 266169691Skan 267169691Skan using ::nexttoward; 268169691Skan using ::nexttowardf; 269169691Skan using ::nexttowardl; 270169691Skan 271169691Skan using ::remainder; 272169691Skan using ::remainderf; 273169691Skan using ::remainderl; 274169691Skan 275169691Skan using ::remquo; 276169691Skan using ::remquo; 277169691Skan using ::remquo; 278169691Skan 279169691Skan using ::rint; 280169691Skan using ::rintf; 281169691Skan using ::rintl; 282169691Skan 283169691Skan using ::round; 284169691Skan using ::roundf; 285169691Skan using ::roundl; 286169691Skan 287169691Skan using ::scalbln; 288169691Skan using ::scalblnf; 289169691Skan using ::scalblnl; 290169691Skan 291169691Skan using ::scalbn; 292169691Skan using ::scalbnf; 293169691Skan using ::scalbnl; 294169691Skan 295169691Skan using ::tgamma; 296169691Skan using ::tgammaf; 297169691Skan using ::tgammal; 298169691Skan 299169691Skan using ::trunc; 300169691Skan using ::truncf; 301169691Skan using ::truncl; 302169691Skan 303169691Skan#endif 304169691Skan 305169691Skan#if _GLIBCXX_USE_C99_MATH 306169691Skan#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC 307169691Skan 308169691Skan /// @brief Function template definitions [8.16.3]. 309169691Skan // 310169691Skan using std::signbit; 311169691Skan 312169691Skan using std::fpclassify; 313169691Skan 314169691Skan using std::isfinite; 315169691Skan using std::isinf; 316169691Skan using std::isnan; 317169691Skan using std::isnormal; 318169691Skan 319169691Skan using std::isgreater; 320169691Skan using std::isgreaterequal; 321169691Skan using std::isless; 322169691Skan using std::islessequal; 323169691Skan using std::islessgreater; 324169691Skan using std::isunordered; 325169691Skan#endif 326169691Skan#endif 327169691Skan 328169691Skan#if _GLIBCXX_USE_C99_MATH_TR1 329169691Skan 330169691Skan /// @brief Additional overloads [8.16.4]. 331169691Skan // 332169691Skan using std::acos; 333169691Skan 334169691Skan inline float 335169691Skan acosh(float __x) 336169691Skan { return __builtin_acoshf(__x); } 337169691Skan 338169691Skan inline long double 339169691Skan acosh(long double __x) 340169691Skan { return __builtin_acoshl(__x); } 341169691Skan 342169691Skan template<typename _Tp> 343169691Skan inline typename __promote<_Tp>::__type 344169691Skan acosh(_Tp __x) 345169691Skan { 346169691Skan typedef typename __promote<_Tp>::__type __type; 347169691Skan return acosh(__type(__x)); 348169691Skan } 349169691Skan 350169691Skan using std::asin; 351169691Skan 352169691Skan inline float 353169691Skan asinh(float __x) 354169691Skan { return __builtin_asinhf(__x); } 355169691Skan 356169691Skan inline long double 357169691Skan asinh(long double __x) 358169691Skan { return __builtin_asinhl(__x); } 359169691Skan 360169691Skan template<typename _Tp> 361169691Skan inline typename __promote<_Tp>::__type 362169691Skan asinh(_Tp __x) 363169691Skan { 364169691Skan typedef typename __promote<_Tp>::__type __type; 365169691Skan return asinh(__type(__x)); 366169691Skan } 367169691Skan 368169691Skan using std::atan; 369169691Skan 370169691Skan // Workaround for c++/21682. 371169691Skan namespace __detail 372169691Skan { 373169691Skan template<typename _Tp, typename _Up> 374169691Skan inline typename 375169691Skan __gnu_cxx::__enable_if<std::__is_floating<_Tp>::__value 376169691Skan || std::__is_floating<_Up>::__value, 377169691Skan typename 378169691Skan std::tr1::__promote_2<_Tp, _Up>::__type>::__type 379169691Skan atan2(_Tp __y, _Up __x) 380169691Skan { 381169691Skan typedef typename std::tr1::__promote_2<_Tp, _Up>::__type __type; 382169691Skan return std::atan2(__type(__y), __type(__x)); 383169691Skan } 384169691Skan } // namespace __detail 385169691Skan 386169691Skan using std::atan2; 387169691Skan using __detail::atan2; 388169691Skan 389169691Skan inline float 390169691Skan atanh(float __x) 391169691Skan { return __builtin_atanhf(__x); } 392169691Skan 393169691Skan inline long double 394169691Skan atanh(long double __x) 395169691Skan { return __builtin_atanhl(__x); } 396169691Skan 397169691Skan template<typename _Tp> 398169691Skan inline typename __promote<_Tp>::__type 399169691Skan atanh(_Tp __x) 400169691Skan { 401169691Skan typedef typename __promote<_Tp>::__type __type; 402169691Skan return atanh(__type(__x)); 403169691Skan } 404169691Skan 405169691Skan inline float 406169691Skan cbrt(float __x) 407169691Skan { return __builtin_cbrtf(__x); } 408169691Skan 409169691Skan inline long double 410169691Skan cbrt(long double __x) 411169691Skan { return __builtin_cbrtl(__x); } 412169691Skan 413169691Skan template<typename _Tp> 414169691Skan inline typename __promote<_Tp>::__type 415169691Skan cbrt(_Tp __x) 416169691Skan { 417169691Skan typedef typename __promote<_Tp>::__type __type; 418169691Skan return cbrt(__type(__x)); 419169691Skan } 420169691Skan 421169691Skan using std::ceil; 422169691Skan 423169691Skan inline float 424169691Skan copysign(float __x, float __y) 425169691Skan { return __builtin_copysignf(__x, __y); } 426169691Skan 427169691Skan inline long double 428169691Skan copysign(long double __x, long double __y) 429169691Skan { return __builtin_copysignl(__x, __y); } 430169691Skan 431169691Skan template<typename _Tp, typename _Up> 432169691Skan inline typename __promote_2<_Tp, _Up>::__type 433169691Skan copysign(_Tp __x, _Up __y) 434169691Skan { 435169691Skan typedef typename __promote_2<_Tp, _Up>::__type __type; 436169691Skan return copysign(__type(__x), __type(__y)); 437169691Skan } 438169691Skan 439169691Skan using std::cos; 440169691Skan using std::cosh; 441169691Skan 442169691Skan inline float 443169691Skan erf(float __x) 444169691Skan { return __builtin_erff(__x); } 445169691Skan 446169691Skan inline long double 447169691Skan erf(long double __x) 448169691Skan { return __builtin_erfl(__x); } 449169691Skan 450169691Skan template<typename _Tp> 451169691Skan inline typename __promote<_Tp>::__type 452169691Skan erf(_Tp __x) 453169691Skan { 454169691Skan typedef typename __promote<_Tp>::__type __type; 455169691Skan return erf(__type(__x)); 456169691Skan } 457169691Skan 458169691Skan inline float 459169691Skan erfc(float __x) 460169691Skan { return __builtin_erfcf(__x); } 461169691Skan 462169691Skan inline long double 463169691Skan erfc(long double __x) 464169691Skan { return __builtin_erfcl(__x); } 465169691Skan 466169691Skan template<typename _Tp> 467169691Skan inline typename __promote<_Tp>::__type 468169691Skan erfc(_Tp __x) 469169691Skan { 470169691Skan typedef typename __promote<_Tp>::__type __type; 471169691Skan return erfc(__type(__x)); 472169691Skan } 473169691Skan 474169691Skan using std::exp; 475169691Skan 476169691Skan inline float 477169691Skan exp2(float __x) 478169691Skan { return __builtin_exp2f(__x); } 479169691Skan 480169691Skan inline long double 481169691Skan exp2(long double __x) 482169691Skan { return __builtin_exp2l(__x); } 483169691Skan 484169691Skan template<typename _Tp> 485169691Skan inline typename __promote<_Tp>::__type 486169691Skan exp2(_Tp __x) 487169691Skan { 488169691Skan typedef typename __promote<_Tp>::__type __type; 489169691Skan return exp2(__type(__x)); 490169691Skan } 491169691Skan 492169691Skan inline float 493169691Skan expm1(float __x) 494169691Skan { return __builtin_expm1f(__x); } 495169691Skan 496169691Skan inline long double 497169691Skan expm1(long double __x) 498169691Skan { return __builtin_expm1l(__x); } 499169691Skan 500169691Skan template<typename _Tp> 501169691Skan inline typename __promote<_Tp>::__type 502169691Skan expm1(_Tp __x) 503169691Skan { 504169691Skan typedef typename __promote<_Tp>::__type __type; 505169691Skan return expm1(__type(__x)); 506169691Skan } 507169691Skan 508169691Skan using std::fabs; 509169691Skan 510169691Skan inline float 511169691Skan fdim(float __x, float __y) 512169691Skan { return __builtin_fdimf(__x, __y); } 513169691Skan 514169691Skan inline long double 515169691Skan fdim(long double __x, long double __y) 516169691Skan { return __builtin_fdiml(__x, __y); } 517169691Skan 518169691Skan template<typename _Tp, typename _Up> 519169691Skan inline typename __promote_2<_Tp, _Up>::__type 520169691Skan fdim(_Tp __x, _Up __y) 521169691Skan { 522169691Skan typedef typename __promote_2<_Tp, _Up>::__type __type; 523169691Skan return fdim(__type(__x), __type(__y)); 524169691Skan } 525169691Skan 526169691Skan using std::floor; 527169691Skan 528169691Skan inline float 529169691Skan fma(float __x, float __y, float __z) 530169691Skan { return __builtin_fmaf(__x, __y, __z); } 531169691Skan 532169691Skan inline long double 533169691Skan fma(long double __x, long double __y, long double __z) 534169691Skan { return __builtin_fmal(__x, __y, __z); } 535169691Skan 536169691Skan template<typename _Tp, typename _Up, typename _Vp> 537169691Skan inline typename __promote_3<_Tp, _Up, _Vp>::__type 538169691Skan fma(_Tp __x, _Up __y, _Vp __z) 539169691Skan { 540169691Skan typedef typename __promote_3<_Tp, _Up, _Vp>::__type __type; 541169691Skan return fma(__type(__x), __type(__y), __type(__z)); 542169691Skan } 543169691Skan 544169691Skan inline float 545169691Skan fmax(float __x, float __y) 546169691Skan { return __builtin_fmaxf(__x, __y); } 547169691Skan 548169691Skan inline long double 549169691Skan fmax(long double __x, long double __y) 550169691Skan { return __builtin_fmaxl(__x, __y); } 551169691Skan 552169691Skan template<typename _Tp, typename _Up> 553169691Skan inline typename __promote_2<_Tp, _Up>::__type 554169691Skan fmax(_Tp __x, _Up __y) 555169691Skan { 556169691Skan typedef typename __promote_2<_Tp, _Up>::__type __type; 557169691Skan return fmax(__type(__x), __type(__y)); 558169691Skan } 559169691Skan 560169691Skan inline float 561169691Skan fmin(float __x, float __y) 562169691Skan { return __builtin_fminf(__x, __y); } 563169691Skan 564169691Skan inline long double 565169691Skan fmin(long double __x, long double __y) 566169691Skan { return __builtin_fminl(__x, __y); } 567169691Skan 568169691Skan template<typename _Tp, typename _Up> 569169691Skan inline typename __promote_2<_Tp, _Up>::__type 570169691Skan fmin(_Tp __x, _Up __y) 571169691Skan { 572169691Skan typedef typename __promote_2<_Tp, _Up>::__type __type; 573169691Skan return fmin(__type(__x), __type(__y)); 574169691Skan } 575169691Skan 576169691Skan using std::fmod; 577169691Skan using std::frexp; 578169691Skan 579169691Skan inline float 580169691Skan hypot(float __x, float __y) 581169691Skan { return __builtin_hypotf(__x, __y); } 582169691Skan 583169691Skan inline long double 584169691Skan hypot(long double __x, long double __y) 585169691Skan { return __builtin_hypotl(__x, __y); } 586169691Skan 587169691Skan template<typename _Tp, typename _Up> 588169691Skan inline typename __promote_2<_Tp, _Up>::__type 589169691Skan hypot(_Tp __x, _Up __y) 590169691Skan { 591169691Skan typedef typename __promote_2<_Tp, _Up>::__type __type; 592169691Skan return hypot(__type(__x), __type(__y)); 593169691Skan } 594169691Skan 595169691Skan inline int 596169691Skan ilogb(float __x) 597169691Skan { return __builtin_ilogbf(__x); } 598169691Skan 599169691Skan inline int 600169691Skan ilogb(long double __x) 601169691Skan { return __builtin_ilogbl(__x); } 602169691Skan 603169691Skan template<typename _Tp> 604169691Skan inline int 605169691Skan ilogb(_Tp __x) 606169691Skan { 607169691Skan typedef typename __promote<_Tp>::__type __type; 608169691Skan return ilogb(__type(__x)); 609169691Skan } 610169691Skan 611169691Skan using std::ldexp; 612169691Skan 613169691Skan inline float 614169691Skan lgamma(float __x) 615169691Skan { return __builtin_lgammaf(__x); } 616169691Skan 617169691Skan inline long double 618169691Skan lgamma(long double __x) 619169691Skan { return __builtin_lgammal(__x); } 620169691Skan 621169691Skan template<typename _Tp> 622169691Skan inline typename __promote<_Tp>::__type 623169691Skan lgamma(_Tp __x) 624169691Skan { 625169691Skan typedef typename __promote<_Tp>::__type __type; 626169691Skan return lgamma(__type(__x)); 627169691Skan } 628169691Skan 629169691Skan inline long long 630169691Skan llrint(float __x) 631169691Skan { return __builtin_llrintf(__x); } 632169691Skan 633169691Skan inline long long 634169691Skan llrint(long double __x) 635169691Skan { return __builtin_llrintl(__x); } 636169691Skan 637169691Skan template<typename _Tp> 638169691Skan inline long long 639169691Skan llrint(_Tp __x) 640169691Skan { 641169691Skan typedef typename __promote<_Tp>::__type __type; 642169691Skan return llrint(__type(__x)); 643169691Skan } 644169691Skan 645169691Skan inline long long 646169691Skan llround(float __x) 647169691Skan { return __builtin_llroundf(__x); } 648169691Skan 649169691Skan inline long long 650169691Skan llround(long double __x) 651169691Skan { return __builtin_llroundl(__x); } 652169691Skan 653169691Skan template<typename _Tp> 654169691Skan inline long long 655169691Skan llround(_Tp __x) 656169691Skan { 657169691Skan typedef typename __promote<_Tp>::__type __type; 658169691Skan return llround(__type(__x)); 659169691Skan } 660169691Skan 661169691Skan using std::log; 662169691Skan using std::log10; 663169691Skan 664169691Skan inline float 665169691Skan log1p(float __x) 666169691Skan { return __builtin_log1pf(__x); } 667169691Skan 668169691Skan inline long double 669169691Skan log1p(long double __x) 670169691Skan { return __builtin_log1pl(__x); } 671169691Skan 672169691Skan template<typename _Tp> 673169691Skan inline typename __promote<_Tp>::__type 674169691Skan log1p(_Tp __x) 675169691Skan { 676169691Skan typedef typename __promote<_Tp>::__type __type; 677169691Skan return log1p(__type(__x)); 678169691Skan } 679169691Skan 680169691Skan // DR 568. 681169691Skan inline float 682169691Skan log2(float __x) 683169691Skan { return __builtin_log2f(__x); } 684169691Skan 685169691Skan inline long double 686169691Skan log2(long double __x) 687169691Skan { return __builtin_log2l(__x); } 688169691Skan 689169691Skan template<typename _Tp> 690169691Skan inline typename __promote<_Tp>::__type 691169691Skan log2(_Tp __x) 692169691Skan { 693169691Skan typedef typename __promote<_Tp>::__type __type; 694169691Skan return log2(__type(__x)); 695169691Skan } 696169691Skan 697169691Skan inline float 698169691Skan logb(float __x) 699169691Skan { return __builtin_logbf(__x); } 700169691Skan 701169691Skan inline long double 702169691Skan logb(long double __x) 703169691Skan { return __builtin_logbl(__x); } 704169691Skan 705169691Skan template<typename _Tp> 706169691Skan inline typename __promote<_Tp>::__type 707169691Skan logb(_Tp __x) 708169691Skan { 709169691Skan typedef typename __promote<_Tp>::__type __type; 710169691Skan return logb(__type(__x)); 711169691Skan } 712169691Skan 713169691Skan inline long 714169691Skan lrint(float __x) 715169691Skan { return __builtin_lrintf(__x); } 716169691Skan 717169691Skan inline long 718169691Skan lrint(long double __x) 719169691Skan { return __builtin_lrintl(__x); } 720169691Skan 721169691Skan template<typename _Tp> 722169691Skan inline long 723169691Skan lrint(_Tp __x) 724169691Skan { 725169691Skan typedef typename __promote<_Tp>::__type __type; 726169691Skan return lrint(__type(__x)); 727169691Skan } 728169691Skan 729169691Skan inline long 730169691Skan lround(float __x) 731169691Skan { return __builtin_lroundf(__x); } 732169691Skan 733169691Skan inline long 734169691Skan lround(long double __x) 735169691Skan { return __builtin_lroundl(__x); } 736169691Skan 737169691Skan template<typename _Tp> 738169691Skan inline long 739169691Skan lround(_Tp __x) 740169691Skan { 741169691Skan typedef typename __promote<_Tp>::__type __type; 742169691Skan return lround(__type(__x)); 743169691Skan } 744169691Skan 745169691Skan inline float 746169691Skan nearbyint(float __x) 747169691Skan { return __builtin_nearbyintf(__x); } 748169691Skan 749169691Skan inline long double 750169691Skan nearbyint(long double __x) 751169691Skan { return __builtin_nearbyintl(__x); } 752169691Skan 753169691Skan template<typename _Tp> 754169691Skan inline typename __promote<_Tp>::__type 755169691Skan nearbyint(_Tp __x) 756169691Skan { 757169691Skan typedef typename __promote<_Tp>::__type __type; 758169691Skan return nearbyint(__type(__x)); 759169691Skan } 760169691Skan 761169691Skan inline float 762169691Skan nextafter(float __x, float __y) 763169691Skan { return __builtin_nextafterf(__x, __y); } 764169691Skan 765169691Skan inline long double 766169691Skan nextafter(long double __x, long double __y) 767169691Skan { return __builtin_nextafterl(__x, __y); } 768169691Skan 769169691Skan template<typename _Tp, typename _Up> 770169691Skan inline typename __promote_2<_Tp, _Up>::__type 771169691Skan nextafter(_Tp __x, _Up __y) 772169691Skan { 773169691Skan typedef typename __promote_2<_Tp, _Up>::__type __type; 774169691Skan return nextafter(__type(__x), __type(__y)); 775169691Skan } 776169691Skan 777169691Skan inline float 778169691Skan nexttoward(float __x, long double __y) 779169691Skan { return __builtin_nexttowardf(__x, __y); } 780169691Skan 781169691Skan inline long double 782169691Skan nexttoward(long double __x, long double __y) 783169691Skan { return __builtin_nexttowardl(__x, __y); } 784169691Skan 785169691Skan template<typename _Tp> 786169691Skan inline typename __promote<_Tp>::__type 787169691Skan nexttoward(_Tp __x, long double __y) 788169691Skan { 789169691Skan typedef typename __promote<_Tp>::__type __type; 790169691Skan return nexttoward(__type(__x), __y); 791169691Skan } 792169691Skan 793169691Skan using std::pow; 794169691Skan 795169691Skan // DR 550. 796169691Skan template<typename _Tp, typename _Up> 797169691Skan inline typename __promote_2<_Tp, _Up>::__type 798169691Skan pow(_Tp __x, _Up __y) 799169691Skan { 800169691Skan typedef typename __promote_2<_Tp, _Up>::__type __type; 801169691Skan return pow(__type(__x), __type(__y)); 802169691Skan } 803169691Skan 804169691Skan inline float 805169691Skan remainder(float __x, float __y) 806169691Skan { return __builtin_remainderf(__x, __y); } 807169691Skan 808169691Skan inline long double 809169691Skan remainder(long double __x, long double __y) 810169691Skan { return __builtin_remainderl(__x, __y); } 811169691Skan 812169691Skan template<typename _Tp, typename _Up> 813169691Skan inline typename __promote_2<_Tp, _Up>::__type 814169691Skan remainder(_Tp __x, _Up __y) 815169691Skan { 816169691Skan typedef typename __promote_2<_Tp, _Up>::__type __type; 817169691Skan return remainder(__type(__x), __type(__y)); 818169691Skan } 819169691Skan 820169691Skan inline float 821169691Skan remquo(float __x, float __y, int* __pquo) 822169691Skan { return __builtin_remquof(__x, __y, __pquo); } 823169691Skan 824169691Skan inline long double 825169691Skan remquo(long double __x, long double __y, int* __pquo) 826169691Skan { return __builtin_remquol(__x, __y, __pquo); } 827169691Skan 828169691Skan template<typename _Tp, typename _Up> 829169691Skan inline typename __promote_2<_Tp, _Up>::__type 830169691Skan remquo(_Tp __x, _Up __y, int* __pquo) 831169691Skan { 832169691Skan typedef typename __promote_2<_Tp, _Up>::__type __type; 833169691Skan return remquo(__type(__x), __type(__y), __pquo); 834169691Skan } 835169691Skan 836169691Skan inline float 837169691Skan rint(float __x) 838169691Skan { return __builtin_rintf(__x); } 839169691Skan 840169691Skan inline long double 841169691Skan rint(long double __x) 842169691Skan { return __builtin_rintl(__x); } 843169691Skan 844169691Skan template<typename _Tp> 845169691Skan inline typename __promote<_Tp>::__type 846169691Skan rint(_Tp __x) 847169691Skan { 848169691Skan typedef typename __promote<_Tp>::__type __type; 849169691Skan return rint(__type(__x)); 850169691Skan } 851169691Skan 852169691Skan inline float 853169691Skan round(float __x) 854169691Skan { return __builtin_roundf(__x); } 855169691Skan 856169691Skan inline long double 857169691Skan round(long double __x) 858169691Skan { return __builtin_roundl(__x); } 859169691Skan 860169691Skan template<typename _Tp> 861169691Skan inline typename __promote<_Tp>::__type 862169691Skan round(_Tp __x) 863169691Skan { 864169691Skan typedef typename __promote<_Tp>::__type __type; 865169691Skan return round(__type(__x)); 866169691Skan } 867169691Skan 868169691Skan inline float 869169691Skan scalbln(float __x, long __ex) 870169691Skan { return __builtin_scalblnf(__x, __ex); } 871169691Skan 872169691Skan inline long double 873169691Skan scalbln(long double __x, long __ex) 874169691Skan { return __builtin_scalblnl(__x, __ex); } 875169691Skan 876169691Skan template<typename _Tp> 877169691Skan inline typename __promote<_Tp>::__type 878169691Skan scalbln(_Tp __x, long __ex) 879169691Skan { 880169691Skan typedef typename __promote<_Tp>::__type __type; 881169691Skan return scalbln(__type(__x), __ex); 882169691Skan } 883169691Skan 884169691Skan inline float 885169691Skan scalbn(float __x, int __ex) 886169691Skan { return __builtin_scalbnf(__x, __ex); } 887169691Skan 888169691Skan inline long double 889169691Skan scalbn(long double __x, int __ex) 890169691Skan { return __builtin_scalbnl(__x, __ex); } 891169691Skan 892169691Skan template<typename _Tp> 893169691Skan inline typename __promote<_Tp>::__type 894169691Skan scalbn(_Tp __x, int __ex) 895169691Skan { 896169691Skan typedef typename __promote<_Tp>::__type __type; 897169691Skan return scalbn(__type(__x), __ex); 898169691Skan } 899169691Skan 900169691Skan using std::sin; 901169691Skan using std::sinh; 902169691Skan using std::sqrt; 903169691Skan using std::tan; 904169691Skan using std::tanh; 905169691Skan 906169691Skan inline float 907169691Skan tgamma(float __x) 908169691Skan { return __builtin_tgammaf(__x); } 909169691Skan 910169691Skan inline long double 911169691Skan tgamma(long double __x) 912169691Skan { return __builtin_tgammal(__x); } 913169691Skan 914169691Skan template<typename _Tp> 915169691Skan inline typename __promote<_Tp>::__type 916169691Skan tgamma(_Tp __x) 917169691Skan { 918169691Skan typedef typename __promote<_Tp>::__type __type; 919169691Skan return tgamma(__type(__x)); 920169691Skan } 921169691Skan 922169691Skan inline float 923169691Skan trunc(float __x) 924169691Skan { return __builtin_truncf(__x); } 925169691Skan 926169691Skan inline long double 927169691Skan trunc(long double __x) 928169691Skan { return __builtin_truncl(__x); } 929169691Skan 930169691Skan template<typename _Tp> 931169691Skan inline typename __promote<_Tp>::__type 932169691Skan trunc(_Tp __x) 933169691Skan { 934169691Skan typedef typename __promote<_Tp>::__type __type; 935169691Skan return trunc(__type(__x)); 936169691Skan } 937169691Skan 938169691Skan#endif 939169691Skan 940169691Skan_GLIBCXX_END_NAMESPACE 941169691Skan} 942169691Skan 943169691Skan#endif 944