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