1// TR1 cmath -*- C++ -*- 2 3// Copyright (C) 2007, 2009 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_impl/cmath 26 * This is an internal header file, included by other library headers. 27 * You should not attempt to use it directly. 28 */ 29 30#if _GLIBCXX_USE_C99_MATH_TR1 31 32#undef acosh 33#undef acoshf 34#undef acoshl 35#undef asinh 36#undef asinhf 37#undef asinhl 38#undef atanh 39#undef atanhf 40#undef atanhl 41#undef cbrt 42#undef cbrtf 43#undef cbrtl 44#undef copysign 45#undef copysignf 46#undef copysignl 47#undef erf 48#undef erff 49#undef erfl 50#undef erfc 51#undef erfcf 52#undef erfcl 53#undef exp2 54#undef exp2f 55#undef exp2l 56#undef expm1 57#undef expm1f 58#undef expm1l 59#undef fdim 60#undef fdimf 61#undef fdiml 62#undef fma 63#undef fmaf 64#undef fmal 65#undef fmax 66#undef fmaxf 67#undef fmaxl 68#undef fmin 69#undef fminf 70#undef fminl 71#undef hypot 72#undef hypotf 73#undef hypotl 74#undef ilogb 75#undef ilogbf 76#undef ilogbl 77#undef lgamma 78#undef lgammaf 79#undef lgammal 80#undef llrint 81#undef llrintf 82#undef llrintl 83#undef llround 84#undef llroundf 85#undef llroundl 86#undef log1p 87#undef log1pf 88#undef log1pl 89#undef log2 90#undef log2f 91#undef log2l 92#undef logb 93#undef logbf 94#undef logbl 95#undef lrint 96#undef lrintf 97#undef lrintl 98#undef lround 99#undef lroundf 100#undef lroundl 101#undef nan 102#undef nanf 103#undef nanl 104#undef nearbyint 105#undef nearbyintf 106#undef nearbyintl 107#undef nextafter 108#undef nextafterf 109#undef nextafterl 110#undef nexttoward 111#undef nexttowardf 112#undef nexttowardl 113#undef remainder 114#undef remainderf 115#undef remainderl 116#undef remquo 117#undef remquof 118#undef remquol 119#undef rint 120#undef rintf 121#undef rintl 122#undef round 123#undef roundf 124#undef roundl 125#undef scalbln 126#undef scalblnf 127#undef scalblnl 128#undef scalbn 129#undef scalbnf 130#undef scalbnl 131#undef tgamma 132#undef tgammaf 133#undef tgammal 134#undef trunc 135#undef truncf 136#undef truncl 137 138#endif 139 140namespace std 141{ 142_GLIBCXX_BEGIN_NAMESPACE_TR1 143 144#if _GLIBCXX_USE_C99_MATH_TR1 145 146 // types 147 using ::double_t; 148 using ::float_t; 149 150 // functions 151 using ::acosh; 152 using ::acoshf; 153 using ::acoshl; 154 155 using ::asinh; 156 using ::asinhf; 157 using ::asinhl; 158 159 using ::atanh; 160 using ::atanhf; 161 using ::atanhl; 162 163 using ::cbrt; 164 using ::cbrtf; 165 using ::cbrtl; 166 167 using ::copysign; 168 using ::copysignf; 169 using ::copysignl; 170 171 using ::erf; 172 using ::erff; 173 using ::erfl; 174 175 using ::erfc; 176 using ::erfcf; 177 using ::erfcl; 178 179 using ::exp2; 180 using ::exp2f; 181 using ::exp2l; 182 183 using ::expm1; 184 using ::expm1f; 185 using ::expm1l; 186 187 using ::fdim; 188 using ::fdimf; 189 using ::fdiml; 190 191 using ::fma; 192 using ::fmaf; 193 using ::fmal; 194 195 using ::fmax; 196 using ::fmaxf; 197 using ::fmaxl; 198 199 using ::fmin; 200 using ::fminf; 201 using ::fminl; 202 203 using ::hypot; 204 using ::hypotf; 205 using ::hypotl; 206 207 using ::ilogb; 208 using ::ilogbf; 209 using ::ilogbl; 210 211 using ::lgamma; 212 using ::lgammaf; 213 using ::lgammal; 214 215 using ::llrint; 216 using ::llrintf; 217 using ::llrintl; 218 219 using ::llround; 220 using ::llroundf; 221 using ::llroundl; 222 223 using ::log1p; 224 using ::log1pf; 225 using ::log1pl; 226 227 using ::log2; 228 using ::log2f; 229 using ::log2l; 230 231 using ::logb; 232 using ::logbf; 233 using ::logbl; 234 235 using ::lrint; 236 using ::lrintf; 237 using ::lrintl; 238 239 using ::lround; 240 using ::lroundf; 241 using ::lroundl; 242 243 using ::nan; 244 using ::nanf; 245 using ::nanl; 246 247 using ::nearbyint; 248 using ::nearbyintf; 249 using ::nearbyintl; 250 251 using ::nextafter; 252 using ::nextafterf; 253 using ::nextafterl; 254 255 using ::nexttoward; 256 using ::nexttowardf; 257 using ::nexttowardl; 258 259 using ::remainder; 260 using ::remainderf; 261 using ::remainderl; 262 263 using ::remquo; 264 using ::remquof; 265 using ::remquol; 266 267 using ::rint; 268 using ::rintf; 269 using ::rintl; 270 271 using ::round; 272 using ::roundf; 273 using ::roundl; 274 275 using ::scalbln; 276 using ::scalblnf; 277 using ::scalblnl; 278 279 using ::scalbn; 280 using ::scalbnf; 281 using ::scalbnl; 282 283 using ::tgamma; 284 using ::tgammaf; 285 using ::tgammal; 286 287 using ::trunc; 288 using ::truncf; 289 using ::truncl; 290 291#endif 292 293#if _GLIBCXX_USE_C99_MATH 294#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC 295 296 /// Function template definitions [8.16.3]. 297 using std::signbit; 298 299 using std::fpclassify; 300 301 using std::isfinite; 302 using std::isinf; 303 using std::isnan; 304 using std::isnormal; 305 306 using std::isgreater; 307 using std::isgreaterequal; 308 using std::isless; 309 using std::islessequal; 310 using std::islessgreater; 311 using std::isunordered; 312#endif 313#endif 314 315#if _GLIBCXX_USE_C99_MATH_TR1 316 317 /// Additional overloads [8.16.4]. 318 using std::acos; 319 320 inline float 321 acosh(float __x) 322 { return __builtin_acoshf(__x); } 323 324 inline long double 325 acosh(long double __x) 326 { return __builtin_acoshl(__x); } 327 328 template<typename _Tp> 329 inline typename __gnu_cxx::__promote<_Tp>::__type 330 acosh(_Tp __x) 331 { 332 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 333 return acosh(__type(__x)); 334 } 335 336 using std::asin; 337 338 inline float 339 asinh(float __x) 340 { return __builtin_asinhf(__x); } 341 342 inline long double 343 asinh(long double __x) 344 { return __builtin_asinhl(__x); } 345 346 template<typename _Tp> 347 inline typename __gnu_cxx::__promote<_Tp>::__type 348 asinh(_Tp __x) 349 { 350 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 351 return asinh(__type(__x)); 352 } 353 354 using std::atan; 355 using std::atan2; 356 357 inline float 358 atanh(float __x) 359 { return __builtin_atanhf(__x); } 360 361 inline long double 362 atanh(long double __x) 363 { return __builtin_atanhl(__x); } 364 365 template<typename _Tp> 366 inline typename __gnu_cxx::__promote<_Tp>::__type 367 atanh(_Tp __x) 368 { 369 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 370 return atanh(__type(__x)); 371 } 372 373 inline float 374 cbrt(float __x) 375 { return __builtin_cbrtf(__x); } 376 377 inline long double 378 cbrt(long double __x) 379 { return __builtin_cbrtl(__x); } 380 381 template<typename _Tp> 382 inline typename __gnu_cxx::__promote<_Tp>::__type 383 cbrt(_Tp __x) 384 { 385 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 386 return cbrt(__type(__x)); 387 } 388 389 using std::ceil; 390 391 inline float 392 copysign(float __x, float __y) 393 { return __builtin_copysignf(__x, __y); } 394 395 inline long double 396 copysign(long double __x, long double __y) 397 { return __builtin_copysignl(__x, __y); } 398 399 template<typename _Tp, typename _Up> 400 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 401 copysign(_Tp __x, _Up __y) 402 { 403 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 404 return copysign(__type(__x), __type(__y)); 405 } 406 407 using std::cos; 408 using std::cosh; 409 410 inline float 411 erf(float __x) 412 { return __builtin_erff(__x); } 413 414 inline long double 415 erf(long double __x) 416 { return __builtin_erfl(__x); } 417 418 template<typename _Tp> 419 inline typename __gnu_cxx::__promote<_Tp>::__type 420 erf(_Tp __x) 421 { 422 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 423 return erf(__type(__x)); 424 } 425 426 inline float 427 erfc(float __x) 428 { return __builtin_erfcf(__x); } 429 430 inline long double 431 erfc(long double __x) 432 { return __builtin_erfcl(__x); } 433 434 template<typename _Tp> 435 inline typename __gnu_cxx::__promote<_Tp>::__type 436 erfc(_Tp __x) 437 { 438 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 439 return erfc(__type(__x)); 440 } 441 442 using std::exp; 443 444 inline float 445 exp2(float __x) 446 { return __builtin_exp2f(__x); } 447 448 inline long double 449 exp2(long double __x) 450 { return __builtin_exp2l(__x); } 451 452 template<typename _Tp> 453 inline typename __gnu_cxx::__promote<_Tp>::__type 454 exp2(_Tp __x) 455 { 456 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 457 return exp2(__type(__x)); 458 } 459 460 inline float 461 expm1(float __x) 462 { return __builtin_expm1f(__x); } 463 464 inline long double 465 expm1(long double __x) 466 { return __builtin_expm1l(__x); } 467 468 template<typename _Tp> 469 inline typename __gnu_cxx::__promote<_Tp>::__type 470 expm1(_Tp __x) 471 { 472 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 473 return expm1(__type(__x)); 474 } 475 476 using std::fabs; 477 478 inline float 479 fdim(float __x, float __y) 480 { return __builtin_fdimf(__x, __y); } 481 482 inline long double 483 fdim(long double __x, long double __y) 484 { return __builtin_fdiml(__x, __y); } 485 486 template<typename _Tp, typename _Up> 487 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 488 fdim(_Tp __x, _Up __y) 489 { 490 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 491 return fdim(__type(__x), __type(__y)); 492 } 493 494 using std::floor; 495 496 inline float 497 fma(float __x, float __y, float __z) 498 { return __builtin_fmaf(__x, __y, __z); } 499 500 inline long double 501 fma(long double __x, long double __y, long double __z) 502 { return __builtin_fmal(__x, __y, __z); } 503 504 template<typename _Tp, typename _Up, typename _Vp> 505 inline typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type 506 fma(_Tp __x, _Up __y, _Vp __z) 507 { 508 typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type; 509 return fma(__type(__x), __type(__y), __type(__z)); 510 } 511 512 inline float 513 fmax(float __x, float __y) 514 { return __builtin_fmaxf(__x, __y); } 515 516 inline long double 517 fmax(long double __x, long double __y) 518 { return __builtin_fmaxl(__x, __y); } 519 520 template<typename _Tp, typename _Up> 521 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 522 fmax(_Tp __x, _Up __y) 523 { 524 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 525 return fmax(__type(__x), __type(__y)); 526 } 527 528 inline float 529 fmin(float __x, float __y) 530 { return __builtin_fminf(__x, __y); } 531 532 inline long double 533 fmin(long double __x, long double __y) 534 { return __builtin_fminl(__x, __y); } 535 536 template<typename _Tp, typename _Up> 537 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 538 fmin(_Tp __x, _Up __y) 539 { 540 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 541 return fmin(__type(__x), __type(__y)); 542 } 543 544 using std::fmod; 545 using std::frexp; 546 547 inline float 548 hypot(float __x, float __y) 549 { return __builtin_hypotf(__x, __y); } 550 551 inline long double 552 hypot(long double __x, long double __y) 553 { return __builtin_hypotl(__x, __y); } 554 555 template<typename _Tp, typename _Up> 556 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 557 hypot(_Tp __x, _Up __y) 558 { 559 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 560 return hypot(__type(__x), __type(__y)); 561 } 562 563 inline int 564 ilogb(float __x) 565 { return __builtin_ilogbf(__x); } 566 567 inline int 568 ilogb(long double __x) 569 { return __builtin_ilogbl(__x); } 570 571 template<typename _Tp> 572 inline int 573 ilogb(_Tp __x) 574 { 575 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 576 return ilogb(__type(__x)); 577 } 578 579 using std::ldexp; 580 581 inline float 582 lgamma(float __x) 583 { return __builtin_lgammaf(__x); } 584 585 inline long double 586 lgamma(long double __x) 587 { return __builtin_lgammal(__x); } 588 589 template<typename _Tp> 590 inline typename __gnu_cxx::__promote<_Tp>::__type 591 lgamma(_Tp __x) 592 { 593 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 594 return lgamma(__type(__x)); 595 } 596 597 inline long long 598 llrint(float __x) 599 { return __builtin_llrintf(__x); } 600 601 inline long long 602 llrint(long double __x) 603 { return __builtin_llrintl(__x); } 604 605 template<typename _Tp> 606 inline long long 607 llrint(_Tp __x) 608 { 609 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 610 return llrint(__type(__x)); 611 } 612 613 inline long long 614 llround(float __x) 615 { return __builtin_llroundf(__x); } 616 617 inline long long 618 llround(long double __x) 619 { return __builtin_llroundl(__x); } 620 621 template<typename _Tp> 622 inline long long 623 llround(_Tp __x) 624 { 625 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 626 return llround(__type(__x)); 627 } 628 629 using std::log; 630 using std::log10; 631 632 inline float 633 log1p(float __x) 634 { return __builtin_log1pf(__x); } 635 636 inline long double 637 log1p(long double __x) 638 { return __builtin_log1pl(__x); } 639 640 template<typename _Tp> 641 inline typename __gnu_cxx::__promote<_Tp>::__type 642 log1p(_Tp __x) 643 { 644 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 645 return log1p(__type(__x)); 646 } 647 648 // DR 568. 649 inline float 650 log2(float __x) 651 { return __builtin_log2f(__x); } 652 653 inline long double 654 log2(long double __x) 655 { return __builtin_log2l(__x); } 656 657 template<typename _Tp> 658 inline typename __gnu_cxx::__promote<_Tp>::__type 659 log2(_Tp __x) 660 { 661 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 662 return log2(__type(__x)); 663 } 664 665 inline float 666 logb(float __x) 667 { return __builtin_logbf(__x); } 668 669 inline long double 670 logb(long double __x) 671 { return __builtin_logbl(__x); } 672 673 template<typename _Tp> 674 inline typename __gnu_cxx::__promote<_Tp>::__type 675 logb(_Tp __x) 676 { 677 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 678 return logb(__type(__x)); 679 } 680 681 inline long 682 lrint(float __x) 683 { return __builtin_lrintf(__x); } 684 685 inline long 686 lrint(long double __x) 687 { return __builtin_lrintl(__x); } 688 689 template<typename _Tp> 690 inline long 691 lrint(_Tp __x) 692 { 693 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 694 return lrint(__type(__x)); 695 } 696 697 inline long 698 lround(float __x) 699 { return __builtin_lroundf(__x); } 700 701 inline long 702 lround(long double __x) 703 { return __builtin_lroundl(__x); } 704 705 template<typename _Tp> 706 inline long 707 lround(_Tp __x) 708 { 709 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 710 return lround(__type(__x)); 711 } 712 713 inline float 714 nearbyint(float __x) 715 { return __builtin_nearbyintf(__x); } 716 717 inline long double 718 nearbyint(long double __x) 719 { return __builtin_nearbyintl(__x); } 720 721 template<typename _Tp> 722 inline typename __gnu_cxx::__promote<_Tp>::__type 723 nearbyint(_Tp __x) 724 { 725 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 726 return nearbyint(__type(__x)); 727 } 728 729 inline float 730 nextafter(float __x, float __y) 731 { return __builtin_nextafterf(__x, __y); } 732 733 inline long double 734 nextafter(long double __x, long double __y) 735 { return __builtin_nextafterl(__x, __y); } 736 737 template<typename _Tp, typename _Up> 738 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 739 nextafter(_Tp __x, _Up __y) 740 { 741 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 742 return nextafter(__type(__x), __type(__y)); 743 } 744 745 inline float 746 nexttoward(float __x, long double __y) 747 { return __builtin_nexttowardf(__x, __y); } 748 749 inline long double 750 nexttoward(long double __x, long double __y) 751 { return __builtin_nexttowardl(__x, __y); } 752 753 template<typename _Tp> 754 inline typename __gnu_cxx::__promote<_Tp>::__type 755 nexttoward(_Tp __x, long double __y) 756 { 757 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 758 return nexttoward(__type(__x), __y); 759 } 760 761 // DR 550. What should the return type of pow(float,int) be? 762 // NB: C++0x and TR1 != C++03. 763 // using std::pow; 764 765 inline float 766 remainder(float __x, float __y) 767 { return __builtin_remainderf(__x, __y); } 768 769 inline long double 770 remainder(long double __x, long double __y) 771 { return __builtin_remainderl(__x, __y); } 772 773 template<typename _Tp, typename _Up> 774 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 775 remainder(_Tp __x, _Up __y) 776 { 777 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 778 return remainder(__type(__x), __type(__y)); 779 } 780 781 inline float 782 remquo(float __x, float __y, int* __pquo) 783 { return __builtin_remquof(__x, __y, __pquo); } 784 785 inline long double 786 remquo(long double __x, long double __y, int* __pquo) 787 { return __builtin_remquol(__x, __y, __pquo); } 788 789 template<typename _Tp, typename _Up> 790 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 791 remquo(_Tp __x, _Up __y, int* __pquo) 792 { 793 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 794 return remquo(__type(__x), __type(__y), __pquo); 795 } 796 797 inline float 798 rint(float __x) 799 { return __builtin_rintf(__x); } 800 801 inline long double 802 rint(long double __x) 803 { return __builtin_rintl(__x); } 804 805 template<typename _Tp> 806 inline typename __gnu_cxx::__promote<_Tp>::__type 807 rint(_Tp __x) 808 { 809 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 810 return rint(__type(__x)); 811 } 812 813 inline float 814 round(float __x) 815 { return __builtin_roundf(__x); } 816 817 inline long double 818 round(long double __x) 819 { return __builtin_roundl(__x); } 820 821 template<typename _Tp> 822 inline typename __gnu_cxx::__promote<_Tp>::__type 823 round(_Tp __x) 824 { 825 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 826 return round(__type(__x)); 827 } 828 829 inline float 830 scalbln(float __x, long __ex) 831 { return __builtin_scalblnf(__x, __ex); } 832 833 inline long double 834 scalbln(long double __x, long __ex) 835 { return __builtin_scalblnl(__x, __ex); } 836 837 template<typename _Tp> 838 inline typename __gnu_cxx::__promote<_Tp>::__type 839 scalbln(_Tp __x, long __ex) 840 { 841 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 842 return scalbln(__type(__x), __ex); 843 } 844 845 inline float 846 scalbn(float __x, int __ex) 847 { return __builtin_scalbnf(__x, __ex); } 848 849 inline long double 850 scalbn(long double __x, int __ex) 851 { return __builtin_scalbnl(__x, __ex); } 852 853 template<typename _Tp> 854 inline typename __gnu_cxx::__promote<_Tp>::__type 855 scalbn(_Tp __x, int __ex) 856 { 857 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 858 return scalbn(__type(__x), __ex); 859 } 860 861 using std::sin; 862 using std::sinh; 863 using std::sqrt; 864 using std::tan; 865 using std::tanh; 866 867 inline float 868 tgamma(float __x) 869 { return __builtin_tgammaf(__x); } 870 871 inline long double 872 tgamma(long double __x) 873 { return __builtin_tgammal(__x); } 874 875 template<typename _Tp> 876 inline typename __gnu_cxx::__promote<_Tp>::__type 877 tgamma(_Tp __x) 878 { 879 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 880 return tgamma(__type(__x)); 881 } 882 883 inline float 884 trunc(float __x) 885 { return __builtin_truncf(__x); } 886 887 inline long double 888 trunc(long double __x) 889 { return __builtin_truncl(__x); } 890 891 template<typename _Tp> 892 inline typename __gnu_cxx::__promote<_Tp>::__type 893 trunc(_Tp __x) 894 { 895 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 896 return trunc(__type(__x)); 897 } 898 899#endif 900 901_GLIBCXX_END_NAMESPACE_TR1 902} 903