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