1 // -*- C++ -*- C forwarding header. 2 3 // Copyright (C) 1997-2014 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 include/cmath 26 * This is a Standard C++ Library file. You should @c \#include this file 27 * in your programs, rather than any of the @a *.h implementation files. 28 * 29 * This is the C++ version of the Standard C Library header @c math.h, 30 * and its contents are (mostly) the same as that header, but are all 31 * contained in the namespace @c std (except for names which are defined 32 * as macros in C). 33 */ 34 35 // 36 // ISO C++ 14882: 26.5 C library 37 // 38 39 #pragma GCC system_header 40 41 #include <bits/c++config.h> 42 #include <bits/cpp_type_traits.h> 43 #include <ext/type_traits.h> 44 #include <math.h> 45 46 #ifndef _GLIBCXX_CMATH 47 #define _GLIBCXX_CMATH 1 48 49 // Get rid of those macros defined in <math.h> in lieu of real functions. 50 #undef abs 51 #undef div 52 #undef acos 53 #undef asin 54 #undef atan 55 #undef atan2 56 #undef ceil 57 #undef cos 58 #undef cosh 59 #undef exp 60 #undef fabs 61 #undef floor 62 #undef fmod 63 #undef frexp 64 #undef ldexp 65 #undef log 66 #undef log10 67 #undef modf 68 #undef pow 69 #undef sin 70 #undef sinh 71 #undef sqrt 72 #undef tan 73 #undef tanh 74 75 namespace std _GLIBCXX_VISIBILITY(default) 76 { 77 _GLIBCXX_BEGIN_NAMESPACE_VERSION 78 79 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 80 inline _GLIBCXX_CONSTEXPR double 81 abs(double __x) 82 { return __builtin_fabs(__x); } 83 #endif 84 85 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 86 inline _GLIBCXX_CONSTEXPR float 87 abs(float __x) 88 { return __builtin_fabsf(__x); } 89 90 inline _GLIBCXX_CONSTEXPR long double 91 abs(long double __x) 92 { return __builtin_fabsl(__x); } 93 #endif 94 95 template<typename _Tp> 96 inline _GLIBCXX_CONSTEXPR 97 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 98 double>::__type 99 abs(_Tp __x) 100 { return __builtin_fabs(__x); } 101 102 using ::acos; 103 104 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 105 inline _GLIBCXX_CONSTEXPR float 106 acos(float __x) 107 { return __builtin_acosf(__x); } 108 109 inline _GLIBCXX_CONSTEXPR long double 110 acos(long double __x) 111 { return __builtin_acosl(__x); } 112 #endif 113 114 template<typename _Tp> 115 inline _GLIBCXX_CONSTEXPR 116 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 117 double>::__type 118 acos(_Tp __x) 119 { return __builtin_acos(__x); } 120 121 using ::asin; 122 123 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 124 inline _GLIBCXX_CONSTEXPR float 125 asin(float __x) 126 { return __builtin_asinf(__x); } 127 128 inline _GLIBCXX_CONSTEXPR long double 129 asin(long double __x) 130 { return __builtin_asinl(__x); } 131 #endif 132 133 template<typename _Tp> 134 inline _GLIBCXX_CONSTEXPR 135 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 136 double>::__type 137 asin(_Tp __x) 138 { return __builtin_asin(__x); } 139 140 using ::atan; 141 142 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 143 inline _GLIBCXX_CONSTEXPR float 144 atan(float __x) 145 { return __builtin_atanf(__x); } 146 147 inline _GLIBCXX_CONSTEXPR long double 148 atan(long double __x) 149 { return __builtin_atanl(__x); } 150 #endif 151 152 template<typename _Tp> 153 inline _GLIBCXX_CONSTEXPR 154 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 155 double>::__type 156 atan(_Tp __x) 157 { return __builtin_atan(__x); } 158 159 using ::atan2; 160 161 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 162 inline _GLIBCXX_CONSTEXPR float 163 atan2(float __y, float __x) 164 { return __builtin_atan2f(__y, __x); } 165 166 inline _GLIBCXX_CONSTEXPR long double 167 atan2(long double __y, long double __x) 168 { return __builtin_atan2l(__y, __x); } 169 #endif 170 171 template<typename _Tp, typename _Up> 172 inline _GLIBCXX_CONSTEXPR 173 typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 174 atan2(_Tp __y, _Up __x) 175 { 176 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 177 return atan2(__type(__y), __type(__x)); 178 } 179 180 using ::ceil; 181 182 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 183 inline _GLIBCXX_CONSTEXPR float 184 ceil(float __x) 185 { return __builtin_ceilf(__x); } 186 187 inline _GLIBCXX_CONSTEXPR long double 188 ceil(long double __x) 189 { return __builtin_ceill(__x); } 190 #endif 191 192 template<typename _Tp> 193 inline _GLIBCXX_CONSTEXPR 194 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 195 double>::__type 196 ceil(_Tp __x) 197 { return __builtin_ceil(__x); } 198 199 using ::cos; 200 201 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 202 inline _GLIBCXX_CONSTEXPR float 203 cos(float __x) 204 { return __builtin_cosf(__x); } 205 206 inline _GLIBCXX_CONSTEXPR long double 207 cos(long double __x) 208 { return __builtin_cosl(__x); } 209 #endif 210 211 template<typename _Tp> 212 inline _GLIBCXX_CONSTEXPR 213 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 214 double>::__type 215 cos(_Tp __x) 216 { return __builtin_cos(__x); } 217 218 using ::cosh; 219 220 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 221 inline _GLIBCXX_CONSTEXPR float 222 cosh(float __x) 223 { return __builtin_coshf(__x); } 224 225 inline _GLIBCXX_CONSTEXPR long double 226 cosh(long double __x) 227 { return __builtin_coshl(__x); } 228 #endif 229 230 template<typename _Tp> 231 inline _GLIBCXX_CONSTEXPR 232 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 233 double>::__type 234 cosh(_Tp __x) 235 { return __builtin_cosh(__x); } 236 237 using ::exp; 238 239 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 240 inline _GLIBCXX_CONSTEXPR float 241 exp(float __x) 242 { return __builtin_expf(__x); } 243 244 inline _GLIBCXX_CONSTEXPR long double 245 exp(long double __x) 246 { return __builtin_expl(__x); } 247 #endif 248 249 template<typename _Tp> 250 inline _GLIBCXX_CONSTEXPR 251 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 252 double>::__type 253 exp(_Tp __x) 254 { return __builtin_exp(__x); } 255 256 using ::fabs; 257 258 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 259 inline _GLIBCXX_CONSTEXPR float 260 fabs(float __x) 261 { return __builtin_fabsf(__x); } 262 263 inline _GLIBCXX_CONSTEXPR long double 264 fabs(long double __x) 265 { return __builtin_fabsl(__x); } 266 #endif 267 268 template<typename _Tp> 269 inline _GLIBCXX_CONSTEXPR 270 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 271 double>::__type 272 fabs(_Tp __x) 273 { return __builtin_fabs(__x); } 274 275 using ::floor; 276 277 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 278 inline _GLIBCXX_CONSTEXPR float 279 floor(float __x) 280 { return __builtin_floorf(__x); } 281 282 inline _GLIBCXX_CONSTEXPR long double 283 floor(long double __x) 284 { return __builtin_floorl(__x); } 285 #endif 286 287 template<typename _Tp> 288 inline _GLIBCXX_CONSTEXPR 289 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 290 double>::__type 291 floor(_Tp __x) 292 { return __builtin_floor(__x); } 293 294 using ::fmod; 295 296 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 297 inline _GLIBCXX_CONSTEXPR float 298 fmod(float __x, float __y) 299 { return __builtin_fmodf(__x, __y); } 300 301 inline _GLIBCXX_CONSTEXPR long double 302 fmod(long double __x, long double __y) 303 { return __builtin_fmodl(__x, __y); } 304 #endif 305 306 template<typename _Tp, typename _Up> 307 inline _GLIBCXX_CONSTEXPR 308 typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 309 fmod(_Tp __x, _Up __y) 310 { 311 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 312 return fmod(__type(__x), __type(__y)); 313 } 314 315 using ::frexp; 316 317 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 318 inline float 319 frexp(float __x, int* __exp) 320 { return __builtin_frexpf(__x, __exp); } 321 322 inline long double 323 frexp(long double __x, int* __exp) 324 { return __builtin_frexpl(__x, __exp); } 325 #endif 326 327 template<typename _Tp> 328 inline _GLIBCXX_CONSTEXPR 329 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 330 double>::__type 331 frexp(_Tp __x, int* __exp) 332 { return __builtin_frexp(__x, __exp); } 333 334 using ::ldexp; 335 336 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 337 inline _GLIBCXX_CONSTEXPR float 338 ldexp(float __x, int __exp) 339 { return __builtin_ldexpf(__x, __exp); } 340 341 inline _GLIBCXX_CONSTEXPR long double 342 ldexp(long double __x, int __exp) 343 { return __builtin_ldexpl(__x, __exp); } 344 #endif 345 346 template<typename _Tp> 347 inline _GLIBCXX_CONSTEXPR 348 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 349 double>::__type 350 ldexp(_Tp __x, int __exp) 351 { return __builtin_ldexp(__x, __exp); } 352 353 using ::log; 354 355 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 356 inline _GLIBCXX_CONSTEXPR float 357 log(float __x) 358 { return __builtin_logf(__x); } 359 360 inline _GLIBCXX_CONSTEXPR long double 361 log(long double __x) 362 { return __builtin_logl(__x); } 363 #endif 364 365 template<typename _Tp> 366 inline _GLIBCXX_CONSTEXPR 367 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 368 double>::__type 369 log(_Tp __x) 370 { return __builtin_log(__x); } 371 372 using ::log10; 373 374 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 375 inline _GLIBCXX_CONSTEXPR float 376 log10(float __x) 377 { return __builtin_log10f(__x); } 378 379 inline _GLIBCXX_CONSTEXPR long double 380 log10(long double __x) 381 { return __builtin_log10l(__x); } 382 #endif 383 384 template<typename _Tp> 385 inline _GLIBCXX_CONSTEXPR 386 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 387 double>::__type 388 log10(_Tp __x) 389 { return __builtin_log10(__x); } 390 391 using ::modf; 392 393 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 394 inline float 395 modf(float __x, float* __iptr) 396 { return __builtin_modff(__x, __iptr); } 397 398 inline long double 399 modf(long double __x, long double* __iptr) 400 { return __builtin_modfl(__x, __iptr); } 401 #endif 402 403 using ::pow; 404 405 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 406 inline _GLIBCXX_CONSTEXPR float 407 pow(float __x, float __y) 408 { return __builtin_powf(__x, __y); } 409 410 inline _GLIBCXX_CONSTEXPR long double 411 pow(long double __x, long double __y) 412 { return __builtin_powl(__x, __y); } 413 414 #if __cplusplus < 201103L 415 // _GLIBCXX_RESOLVE_LIB_DEFECTS 416 // DR 550. What should the return type of pow(float,int) be? 417 inline double 418 pow(double __x, int __i) 419 { return __builtin_powi(__x, __i); } 420 421 inline float 422 pow(float __x, int __n) 423 { return __builtin_powif(__x, __n); } 424 425 inline long double 426 pow(long double __x, int __n) 427 { return __builtin_powil(__x, __n); } 428 #endif 429 #endif 430 431 template<typename _Tp, typename _Up> 432 inline _GLIBCXX_CONSTEXPR 433 typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 434 pow(_Tp __x, _Up __y) 435 { 436 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 437 return pow(__type(__x), __type(__y)); 438 } 439 440 using ::sin; 441 442 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 443 inline _GLIBCXX_CONSTEXPR float 444 sin(float __x) 445 { return __builtin_sinf(__x); } 446 447 inline _GLIBCXX_CONSTEXPR long double 448 sin(long double __x) 449 { return __builtin_sinl(__x); } 450 #endif 451 452 template<typename _Tp> 453 inline _GLIBCXX_CONSTEXPR 454 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 455 double>::__type 456 sin(_Tp __x) 457 { return __builtin_sin(__x); } 458 459 using ::sinh; 460 461 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 462 inline _GLIBCXX_CONSTEXPR float 463 sinh(float __x) 464 { return __builtin_sinhf(__x); } 465 466 inline _GLIBCXX_CONSTEXPR long double 467 sinh(long double __x) 468 { return __builtin_sinhl(__x); } 469 #endif 470 471 template<typename _Tp> 472 inline _GLIBCXX_CONSTEXPR 473 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 474 double>::__type 475 sinh(_Tp __x) 476 { return __builtin_sinh(__x); } 477 478 using ::sqrt; 479 480 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 481 inline _GLIBCXX_CONSTEXPR float 482 sqrt(float __x) 483 { return __builtin_sqrtf(__x); } 484 485 inline _GLIBCXX_CONSTEXPR long double 486 sqrt(long double __x) 487 { return __builtin_sqrtl(__x); } 488 #endif 489 490 template<typename _Tp> 491 inline _GLIBCXX_CONSTEXPR 492 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 493 double>::__type 494 sqrt(_Tp __x) 495 { return __builtin_sqrt(__x); } 496 497 using ::tan; 498 499 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 500 inline _GLIBCXX_CONSTEXPR float 501 tan(float __x) 502 { return __builtin_tanf(__x); } 503 504 inline _GLIBCXX_CONSTEXPR long double 505 tan(long double __x) 506 { return __builtin_tanl(__x); } 507 #endif 508 509 template<typename _Tp> 510 inline _GLIBCXX_CONSTEXPR 511 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 512 double>::__type 513 tan(_Tp __x) 514 { return __builtin_tan(__x); } 515 516 using ::tanh; 517 518 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 519 inline _GLIBCXX_CONSTEXPR float 520 tanh(float __x) 521 { return __builtin_tanhf(__x); } 522 523 inline _GLIBCXX_CONSTEXPR long double 524 tanh(long double __x) 525 { return __builtin_tanhl(__x); } 526 #endif 527 528 template<typename _Tp> 529 inline _GLIBCXX_CONSTEXPR 530 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 531 double>::__type 532 tanh(_Tp __x) 533 { return __builtin_tanh(__x); } 534 535 _GLIBCXX_END_NAMESPACE_VERSION 536 } // namespace 537 538 #if _GLIBCXX_USE_C99_MATH 539 #if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC 540 541 // These are possible macros imported from C99-land. 542 #undef fpclassify 543 #undef isfinite 544 #undef isinf 545 #undef isnan 546 #undef isnormal 547 #undef signbit 548 #undef isgreater 549 #undef isgreaterequal 550 #undef isless 551 #undef islessequal 552 #undef islessgreater 553 #undef isunordered 554 555 namespace std _GLIBCXX_VISIBILITY(default) 556 { 557 _GLIBCXX_BEGIN_NAMESPACE_VERSION 558 559 #if __cplusplus >= 201103L 560 constexpr int 561 fpclassify(float __x) 562 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 563 FP_SUBNORMAL, FP_ZERO, __x); } 564 565 constexpr int 566 fpclassify(double __x) 567 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 568 FP_SUBNORMAL, FP_ZERO, __x); } 569 570 constexpr int 571 fpclassify(long double __x) 572 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 573 FP_SUBNORMAL, FP_ZERO, __x); } 574 575 template<typename _Tp> 576 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 577 int>::__type 578 fpclassify(_Tp __x) 579 { return __x != 0 ? FP_NORMAL : FP_ZERO; } 580 581 constexpr bool 582 isfinite(float __x) 583 { return __builtin_isfinite(__x); } 584 585 constexpr bool 586 isfinite(double __x) 587 { return __builtin_isfinite(__x); } 588 589 constexpr bool 590 isfinite(long double __x) 591 { return __builtin_isfinite(__x); } 592 593 template<typename _Tp> 594 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 595 bool>::__type 596 isfinite(_Tp __x) 597 { return true; } 598 599 constexpr bool 600 isinf(float __x) 601 { return __builtin_isinf(__x); } 602 603 constexpr bool 604 isinf(double __x) 605 { return __builtin_isinf(__x); } 606 607 constexpr bool 608 isinf(long double __x) 609 { return __builtin_isinf(__x); } 610 611 template<typename _Tp> 612 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 613 bool>::__type 614 isinf(_Tp __x) 615 { return false; } 616 617 constexpr bool 618 isnan(float __x) 619 { return __builtin_isnan(__x); } 620 621 constexpr bool 622 isnan(double __x) 623 { return __builtin_isnan(__x); } 624 625 constexpr bool 626 isnan(long double __x) 627 { return __builtin_isnan(__x); } 628 629 template<typename _Tp> 630 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 631 bool>::__type 632 isnan(_Tp __x) 633 { return false; } 634 635 constexpr bool 636 isnormal(float __x) 637 { return __builtin_isnormal(__x); } 638 639 constexpr bool 640 isnormal(double __x) 641 { return __builtin_isnormal(__x); } 642 643 constexpr bool 644 isnormal(long double __x) 645 { return __builtin_isnormal(__x); } 646 647 template<typename _Tp> 648 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 649 bool>::__type 650 isnormal(_Tp __x) 651 { return __x != 0 ? true : false; } 652 653 // The front-end doesn't provide a type generic builtin (libstdc++/58625). 654 constexpr bool 655 signbit(float __x) 656 { return __builtin_signbitf(__x); } 657 658 constexpr bool 659 signbit(double __x) 660 { return __builtin_signbit(__x); } 661 662 constexpr bool 663 signbit(long double __x) 664 { return __builtin_signbitl(__x); } 665 666 template<typename _Tp> 667 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 668 bool>::__type 669 signbit(_Tp __x) 670 { return __x < 0 ? true : false; } 671 672 constexpr bool 673 isgreater(float __x, float __y) 674 { return __builtin_isgreater(__x, __y); } 675 676 constexpr bool 677 isgreater(double __x, double __y) 678 { return __builtin_isgreater(__x, __y); } 679 680 constexpr bool 681 isgreater(long double __x, long double __y) 682 { return __builtin_isgreater(__x, __y); } 683 684 template<typename _Tp, typename _Up> 685 constexpr typename 686 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 687 && __is_arithmetic<_Up>::__value), bool>::__type 688 isgreater(_Tp __x, _Up __y) 689 { 690 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 691 return __builtin_isgreater(__type(__x), __type(__y)); 692 } 693 694 constexpr bool 695 isgreaterequal(float __x, float __y) 696 { return __builtin_isgreaterequal(__x, __y); } 697 698 constexpr bool 699 isgreaterequal(double __x, double __y) 700 { return __builtin_isgreaterequal(__x, __y); } 701 702 constexpr bool 703 isgreaterequal(long double __x, long double __y) 704 { return __builtin_isgreaterequal(__x, __y); } 705 706 template<typename _Tp, typename _Up> 707 constexpr typename 708 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 709 && __is_arithmetic<_Up>::__value), bool>::__type 710 isgreaterequal(_Tp __x, _Up __y) 711 { 712 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 713 return __builtin_isgreaterequal(__type(__x), __type(__y)); 714 } 715 716 constexpr bool 717 isless(float __x, float __y) 718 { return __builtin_isless(__x, __y); } 719 720 constexpr bool 721 isless(double __x, double __y) 722 { return __builtin_isless(__x, __y); } 723 724 constexpr bool 725 isless(long double __x, long double __y) 726 { return __builtin_isless(__x, __y); } 727 728 template<typename _Tp, typename _Up> 729 constexpr typename 730 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 731 && __is_arithmetic<_Up>::__value), bool>::__type 732 isless(_Tp __x, _Up __y) 733 { 734 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 735 return __builtin_isless(__type(__x), __type(__y)); 736 } 737 738 constexpr bool 739 islessequal(float __x, float __y) 740 { return __builtin_islessequal(__x, __y); } 741 742 constexpr bool 743 islessequal(double __x, double __y) 744 { return __builtin_islessequal(__x, __y); } 745 746 constexpr bool 747 islessequal(long double __x, long double __y) 748 { return __builtin_islessequal(__x, __y); } 749 750 template<typename _Tp, typename _Up> 751 constexpr typename 752 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 753 && __is_arithmetic<_Up>::__value), bool>::__type 754 islessequal(_Tp __x, _Up __y) 755 { 756 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 757 return __builtin_islessequal(__type(__x), __type(__y)); 758 } 759 760 constexpr bool 761 islessgreater(float __x, float __y) 762 { return __builtin_islessgreater(__x, __y); } 763 764 constexpr bool 765 islessgreater(double __x, double __y) 766 { return __builtin_islessgreater(__x, __y); } 767 768 constexpr bool 769 islessgreater(long double __x, long double __y) 770 { return __builtin_islessgreater(__x, __y); } 771 772 template<typename _Tp, typename _Up> 773 constexpr typename 774 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 775 && __is_arithmetic<_Up>::__value), bool>::__type 776 islessgreater(_Tp __x, _Up __y) 777 { 778 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 779 return __builtin_islessgreater(__type(__x), __type(__y)); 780 } 781 782 constexpr bool 783 isunordered(float __x, float __y) 784 { return __builtin_isunordered(__x, __y); } 785 786 constexpr bool 787 isunordered(double __x, double __y) 788 { return __builtin_isunordered(__x, __y); } 789 790 constexpr bool 791 isunordered(long double __x, long double __y) 792 { return __builtin_isunordered(__x, __y); } 793 794 template<typename _Tp, typename _Up> 795 constexpr typename 796 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 797 && __is_arithmetic<_Up>::__value), bool>::__type 798 isunordered(_Tp __x, _Up __y) 799 { 800 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 801 return __builtin_isunordered(__type(__x), __type(__y)); 802 } 803 804 #else 805 806 template<typename _Tp> 807 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 808 int>::__type 809 fpclassify(_Tp __f) 810 { 811 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 812 return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 813 FP_SUBNORMAL, FP_ZERO, __type(__f)); 814 } 815 816 template<typename _Tp> 817 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 818 int>::__type 819 isfinite(_Tp __f) 820 { 821 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 822 return __builtin_isfinite(__type(__f)); 823 } 824 825 template<typename _Tp> 826 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 827 int>::__type 828 isinf(_Tp __f) 829 { 830 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 831 return __builtin_isinf(__type(__f)); 832 } 833 834 template<typename _Tp> 835 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 836 int>::__type 837 isnan(_Tp __f) 838 { 839 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 840 return __builtin_isnan(__type(__f)); 841 } 842 843 template<typename _Tp> 844 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 845 int>::__type 846 isnormal(_Tp __f) 847 { 848 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 849 return __builtin_isnormal(__type(__f)); 850 } 851 852 template<typename _Tp> 853 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 854 int>::__type 855 signbit(_Tp __f) 856 { 857 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 858 return __builtin_signbit(__type(__f)); 859 } 860 861 template<typename _Tp> 862 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 863 int>::__type 864 isgreater(_Tp __f1, _Tp __f2) 865 { 866 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 867 return __builtin_isgreater(__type(__f1), __type(__f2)); 868 } 869 870 template<typename _Tp> 871 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 872 int>::__type 873 isgreaterequal(_Tp __f1, _Tp __f2) 874 { 875 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 876 return __builtin_isgreaterequal(__type(__f1), __type(__f2)); 877 } 878 879 template<typename _Tp> 880 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 881 int>::__type 882 isless(_Tp __f1, _Tp __f2) 883 { 884 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 885 return __builtin_isless(__type(__f1), __type(__f2)); 886 } 887 888 template<typename _Tp> 889 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 890 int>::__type 891 islessequal(_Tp __f1, _Tp __f2) 892 { 893 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 894 return __builtin_islessequal(__type(__f1), __type(__f2)); 895 } 896 897 template<typename _Tp> 898 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 899 int>::__type 900 islessgreater(_Tp __f1, _Tp __f2) 901 { 902 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 903 return __builtin_islessgreater(__type(__f1), __type(__f2)); 904 } 905 906 template<typename _Tp> 907 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 908 int>::__type 909 isunordered(_Tp __f1, _Tp __f2) 910 { 911 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 912 return __builtin_isunordered(__type(__f1), __type(__f2)); 913 } 914 915 #endif 916 917 _GLIBCXX_END_NAMESPACE_VERSION 918 } // namespace 919 920 #endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */ 921 #endif 922 923 #if __cplusplus >= 201103L 924 925 #ifdef _GLIBCXX_USE_C99_MATH_TR1 926 927 #undef acosh 928 #undef acoshf 929 #undef acoshl 930 #undef asinh 931 #undef asinhf 932 #undef asinhl 933 #undef atanh 934 #undef atanhf 935 #undef atanhl 936 #undef cbrt 937 #undef cbrtf 938 #undef cbrtl 939 #undef copysign 940 #undef copysignf 941 #undef copysignl 942 #undef erf 943 #undef erff 944 #undef erfl 945 #undef erfc 946 #undef erfcf 947 #undef erfcl 948 #undef exp2 949 #undef exp2f 950 #undef exp2l 951 #undef expm1 952 #undef expm1f 953 #undef expm1l 954 #undef fdim 955 #undef fdimf 956 #undef fdiml 957 #undef fma 958 #undef fmaf 959 #undef fmal 960 #undef fmax 961 #undef fmaxf 962 #undef fmaxl 963 #undef fmin 964 #undef fminf 965 #undef fminl 966 #undef hypot 967 #undef hypotf 968 #undef hypotl 969 #undef ilogb 970 #undef ilogbf 971 #undef ilogbl 972 #undef lgamma 973 #undef lgammaf 974 #undef lgammal 975 #undef llrint 976 #undef llrintf 977 #undef llrintl 978 #undef llround 979 #undef llroundf 980 #undef llroundl 981 #undef log1p 982 #undef log1pf 983 #undef log1pl 984 #undef log2 985 #undef log2f 986 #undef log2l 987 #undef logb 988 #undef logbf 989 #undef logbl 990 #undef lrint 991 #undef lrintf 992 #undef lrintl 993 #undef lround 994 #undef lroundf 995 #undef lroundl 996 #undef nan 997 #undef nanf 998 #undef nanl 999 #undef nearbyint 1000 #undef nearbyintf 1001 #undef nearbyintl 1002 #undef nextafter 1003 #undef nextafterf 1004 #undef nextafterl 1005 #undef nexttoward 1006 #undef nexttowardf 1007 #undef nexttowardl 1008 #undef remainder 1009 #undef remainderf 1010 #undef remainderl 1011 #undef remquo 1012 #undef remquof 1013 #undef remquol 1014 #undef rint 1015 #undef rintf 1016 #undef rintl 1017 #undef round 1018 #undef roundf 1019 #undef roundl 1020 #undef scalbln 1021 #undef scalblnf 1022 #undef scalblnl 1023 #undef scalbn 1024 #undef scalbnf 1025 #undef scalbnl 1026 #undef tgamma 1027 #undef tgammaf 1028 #undef tgammal 1029 #undef trunc 1030 #undef truncf 1031 #undef truncl 1032 1033 namespace std _GLIBCXX_VISIBILITY(default) 1034 { 1035 _GLIBCXX_BEGIN_NAMESPACE_VERSION 1036 1037 // types 1038 using ::double_t; 1039 using ::float_t; 1040 1041 // functions 1042 using ::acosh; 1043 using ::acoshf; 1044 using ::acoshl; 1045 1046 using ::asinh; 1047 using ::asinhf; 1048 using ::asinhl; 1049 1050 using ::atanh; 1051 using ::atanhf; 1052 using ::atanhl; 1053 1054 using ::cbrt; 1055 using ::cbrtf; 1056 using ::cbrtl; 1057 1058 using ::copysign; 1059 using ::copysignf; 1060 using ::copysignl; 1061 1062 using ::erf; 1063 using ::erff; 1064 using ::erfl; 1065 1066 using ::erfc; 1067 using ::erfcf; 1068 using ::erfcl; 1069 1070 using ::exp2; 1071 using ::exp2f; 1072 using ::exp2l; 1073 1074 using ::expm1; 1075 using ::expm1f; 1076 using ::expm1l; 1077 1078 using ::fdim; 1079 using ::fdimf; 1080 using ::fdiml; 1081 1082 using ::fma; 1083 using ::fmaf; 1084 using ::fmal; 1085 1086 using ::fmax; 1087 using ::fmaxf; 1088 using ::fmaxl; 1089 1090 using ::fmin; 1091 using ::fminf; 1092 using ::fminl; 1093 1094 using ::hypot; 1095 using ::hypotf; 1096 using ::hypotl; 1097 1098 using ::ilogb; 1099 using ::ilogbf; 1100 using ::ilogbl; 1101 1102 using ::lgamma; 1103 using ::lgammaf; 1104 using ::lgammal; 1105 1106 using ::llrint; 1107 using ::llrintf; 1108 using ::llrintl; 1109 1110 using ::llround; 1111 using ::llroundf; 1112 using ::llroundl; 1113 1114 using ::log1p; 1115 using ::log1pf; 1116 using ::log1pl; 1117 1118 using ::log2; 1119 using ::log2f; 1120 using ::log2l; 1121 1122 using ::logb; 1123 using ::logbf; 1124 using ::logbl; 1125 1126 using ::lrint; 1127 using ::lrintf; 1128 using ::lrintl; 1129 1130 using ::lround; 1131 using ::lroundf; 1132 using ::lroundl; 1133 1134 using ::nan; 1135 using ::nanf; 1136 using ::nanl; 1137 1138 using ::nearbyint; 1139 using ::nearbyintf; 1140 using ::nearbyintl; 1141 1142 using ::nextafter; 1143 using ::nextafterf; 1144 using ::nextafterl; 1145 1146 using ::nexttoward; 1147 using ::nexttowardf; 1148 using ::nexttowardl; 1149 1150 using ::remainder; 1151 using ::remainderf; 1152 using ::remainderl; 1153 1154 using ::remquo; 1155 using ::remquof; 1156 using ::remquol; 1157 1158 using ::rint; 1159 using ::rintf; 1160 using ::rintl; 1161 1162 using ::round; 1163 using ::roundf; 1164 using ::roundl; 1165 1166 using ::scalbln; 1167 using ::scalblnf; 1168 using ::scalblnl; 1169 1170 using ::scalbn; 1171 using ::scalbnf; 1172 using ::scalbnl; 1173 1174 using ::tgamma; 1175 using ::tgammaf; 1176 using ::tgammal; 1177 1178 using ::trunc; 1179 using ::truncf; 1180 using ::truncl; 1181 1182 /// Additional overloads. 1183 constexpr float 1184 acosh(float __x) 1185 { return __builtin_acoshf(__x); } 1186 1187 constexpr long double 1188 acosh(long double __x) 1189 { return __builtin_acoshl(__x); } 1190 1191 template<typename _Tp> 1192 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1193 double>::__type 1194 acosh(_Tp __x) 1195 { return __builtin_acosh(__x); } 1196 1197 constexpr float 1198 asinh(float __x) 1199 { return __builtin_asinhf(__x); } 1200 1201 constexpr long double 1202 asinh(long double __x) 1203 { return __builtin_asinhl(__x); } 1204 1205 template<typename _Tp> 1206 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1207 double>::__type 1208 asinh(_Tp __x) 1209 { return __builtin_asinh(__x); } 1210 1211 constexpr float 1212 atanh(float __x) 1213 { return __builtin_atanhf(__x); } 1214 1215 constexpr long double 1216 atanh(long double __x) 1217 { return __builtin_atanhl(__x); } 1218 1219 template<typename _Tp> 1220 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1221 double>::__type 1222 atanh(_Tp __x) 1223 { return __builtin_atanh(__x); } 1224 1225 constexpr float 1226 cbrt(float __x) 1227 { return __builtin_cbrtf(__x); } 1228 1229 constexpr long double 1230 cbrt(long double __x) 1231 { return __builtin_cbrtl(__x); } 1232 1233 template<typename _Tp> 1234 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1235 double>::__type 1236 cbrt(_Tp __x) 1237 { return __builtin_cbrt(__x); } 1238 1239 constexpr float 1240 copysign(float __x, float __y) 1241 { return __builtin_copysignf(__x, __y); } 1242 1243 constexpr long double 1244 copysign(long double __x, long double __y) 1245 { return __builtin_copysignl(__x, __y); } 1246 1247 template<typename _Tp, typename _Up> 1248 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1249 copysign(_Tp __x, _Up __y) 1250 { 1251 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1252 return copysign(__type(__x), __type(__y)); 1253 } 1254 1255 constexpr float 1256 erf(float __x) 1257 { return __builtin_erff(__x); } 1258 1259 constexpr long double 1260 erf(long double __x) 1261 { return __builtin_erfl(__x); } 1262 1263 template<typename _Tp> 1264 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1265 double>::__type 1266 erf(_Tp __x) 1267 { return __builtin_erf(__x); } 1268 1269 constexpr float 1270 erfc(float __x) 1271 { return __builtin_erfcf(__x); } 1272 1273 constexpr long double 1274 erfc(long double __x) 1275 { return __builtin_erfcl(__x); } 1276 1277 template<typename _Tp> 1278 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1279 double>::__type 1280 erfc(_Tp __x) 1281 { return __builtin_erfc(__x); } 1282 1283 constexpr float 1284 exp2(float __x) 1285 { return __builtin_exp2f(__x); } 1286 1287 constexpr long double 1288 exp2(long double __x) 1289 { return __builtin_exp2l(__x); } 1290 1291 template<typename _Tp> 1292 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1293 double>::__type 1294 exp2(_Tp __x) 1295 { return __builtin_exp2(__x); } 1296 1297 constexpr float 1298 expm1(float __x) 1299 { return __builtin_expm1f(__x); } 1300 1301 constexpr long double 1302 expm1(long double __x) 1303 { return __builtin_expm1l(__x); } 1304 1305 template<typename _Tp> 1306 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1307 double>::__type 1308 expm1(_Tp __x) 1309 { return __builtin_expm1(__x); } 1310 1311 constexpr float 1312 fdim(float __x, float __y) 1313 { return __builtin_fdimf(__x, __y); } 1314 1315 constexpr long double 1316 fdim(long double __x, long double __y) 1317 { return __builtin_fdiml(__x, __y); } 1318 1319 template<typename _Tp, typename _Up> 1320 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1321 fdim(_Tp __x, _Up __y) 1322 { 1323 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1324 return fdim(__type(__x), __type(__y)); 1325 } 1326 1327 constexpr float 1328 fma(float __x, float __y, float __z) 1329 { return __builtin_fmaf(__x, __y, __z); } 1330 1331 constexpr long double 1332 fma(long double __x, long double __y, long double __z) 1333 { return __builtin_fmal(__x, __y, __z); } 1334 1335 template<typename _Tp, typename _Up, typename _Vp> 1336 constexpr typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type 1337 fma(_Tp __x, _Up __y, _Vp __z) 1338 { 1339 typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type; 1340 return fma(__type(__x), __type(__y), __type(__z)); 1341 } 1342 1343 constexpr float 1344 fmax(float __x, float __y) 1345 { return __builtin_fmaxf(__x, __y); } 1346 1347 constexpr long double 1348 fmax(long double __x, long double __y) 1349 { return __builtin_fmaxl(__x, __y); } 1350 1351 template<typename _Tp, typename _Up> 1352 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1353 fmax(_Tp __x, _Up __y) 1354 { 1355 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1356 return fmax(__type(__x), __type(__y)); 1357 } 1358 1359 constexpr float 1360 fmin(float __x, float __y) 1361 { return __builtin_fminf(__x, __y); } 1362 1363 constexpr long double 1364 fmin(long double __x, long double __y) 1365 { return __builtin_fminl(__x, __y); } 1366 1367 template<typename _Tp, typename _Up> 1368 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1369 fmin(_Tp __x, _Up __y) 1370 { 1371 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1372 return fmin(__type(__x), __type(__y)); 1373 } 1374 1375 constexpr float 1376 hypot(float __x, float __y) 1377 { return __builtin_hypotf(__x, __y); } 1378 1379 constexpr long double 1380 hypot(long double __x, long double __y) 1381 { return __builtin_hypotl(__x, __y); } 1382 1383 template<typename _Tp, typename _Up> 1384 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1385 hypot(_Tp __x, _Up __y) 1386 { 1387 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1388 return hypot(__type(__x), __type(__y)); 1389 } 1390 1391 constexpr int 1392 ilogb(float __x) 1393 { return __builtin_ilogbf(__x); } 1394 1395 constexpr int 1396 ilogb(long double __x) 1397 { return __builtin_ilogbl(__x); } 1398 1399 template<typename _Tp> 1400 constexpr 1401 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1402 int>::__type 1403 ilogb(_Tp __x) 1404 { return __builtin_ilogb(__x); } 1405 1406 constexpr float 1407 lgamma(float __x) 1408 { return __builtin_lgammaf(__x); } 1409 1410 constexpr long double 1411 lgamma(long double __x) 1412 { return __builtin_lgammal(__x); } 1413 1414 template<typename _Tp> 1415 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1416 double>::__type 1417 lgamma(_Tp __x) 1418 { return __builtin_lgamma(__x); } 1419 1420 constexpr long long 1421 llrint(float __x) 1422 { return __builtin_llrintf(__x); } 1423 1424 constexpr long long 1425 llrint(long double __x) 1426 { return __builtin_llrintl(__x); } 1427 1428 template<typename _Tp> 1429 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1430 long long>::__type 1431 llrint(_Tp __x) 1432 { return __builtin_llrint(__x); } 1433 1434 constexpr long long 1435 llround(float __x) 1436 { return __builtin_llroundf(__x); } 1437 1438 constexpr long long 1439 llround(long double __x) 1440 { return __builtin_llroundl(__x); } 1441 1442 template<typename _Tp> 1443 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1444 long long>::__type 1445 llround(_Tp __x) 1446 { return __builtin_llround(__x); } 1447 1448 constexpr float 1449 log1p(float __x) 1450 { return __builtin_log1pf(__x); } 1451 1452 constexpr long double 1453 log1p(long double __x) 1454 { return __builtin_log1pl(__x); } 1455 1456 template<typename _Tp> 1457 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1458 double>::__type 1459 log1p(_Tp __x) 1460 { return __builtin_log1p(__x); } 1461 1462 // DR 568. 1463 constexpr float 1464 log2(float __x) 1465 { return __builtin_log2f(__x); } 1466 1467 constexpr long double 1468 log2(long double __x) 1469 { return __builtin_log2l(__x); } 1470 1471 template<typename _Tp> 1472 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1473 double>::__type 1474 log2(_Tp __x) 1475 { return __builtin_log2(__x); } 1476 1477 constexpr float 1478 logb(float __x) 1479 { return __builtin_logbf(__x); } 1480 1481 constexpr long double 1482 logb(long double __x) 1483 { return __builtin_logbl(__x); } 1484 1485 template<typename _Tp> 1486 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1487 double>::__type 1488 logb(_Tp __x) 1489 { return __builtin_logb(__x); } 1490 1491 constexpr long 1492 lrint(float __x) 1493 { return __builtin_lrintf(__x); } 1494 1495 constexpr long 1496 lrint(long double __x) 1497 { return __builtin_lrintl(__x); } 1498 1499 template<typename _Tp> 1500 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1501 long>::__type 1502 lrint(_Tp __x) 1503 { return __builtin_lrint(__x); } 1504 1505 constexpr long 1506 lround(float __x) 1507 { return __builtin_lroundf(__x); } 1508 1509 constexpr long 1510 lround(long double __x) 1511 { return __builtin_lroundl(__x); } 1512 1513 template<typename _Tp> 1514 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1515 long>::__type 1516 lround(_Tp __x) 1517 { return __builtin_lround(__x); } 1518 1519 constexpr float 1520 nearbyint(float __x) 1521 { return __builtin_nearbyintf(__x); } 1522 1523 constexpr long double 1524 nearbyint(long double __x) 1525 { return __builtin_nearbyintl(__x); } 1526 1527 template<typename _Tp> 1528 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1529 double>::__type 1530 nearbyint(_Tp __x) 1531 { return __builtin_nearbyint(__x); } 1532 1533 constexpr float 1534 nextafter(float __x, float __y) 1535 { return __builtin_nextafterf(__x, __y); } 1536 1537 constexpr long double 1538 nextafter(long double __x, long double __y) 1539 { return __builtin_nextafterl(__x, __y); } 1540 1541 template<typename _Tp, typename _Up> 1542 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1543 nextafter(_Tp __x, _Up __y) 1544 { 1545 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1546 return nextafter(__type(__x), __type(__y)); 1547 } 1548 1549 constexpr float 1550 nexttoward(float __x, long double __y) 1551 { return __builtin_nexttowardf(__x, __y); } 1552 1553 constexpr long double 1554 nexttoward(long double __x, long double __y) 1555 { return __builtin_nexttowardl(__x, __y); } 1556 1557 template<typename _Tp> 1558 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1559 double>::__type 1560 nexttoward(_Tp __x, long double __y) 1561 { return __builtin_nexttoward(__x, __y); } 1562 1563 constexpr float 1564 remainder(float __x, float __y) 1565 { return __builtin_remainderf(__x, __y); } 1566 1567 constexpr long double 1568 remainder(long double __x, long double __y) 1569 { return __builtin_remainderl(__x, __y); } 1570 1571 template<typename _Tp, typename _Up> 1572 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1573 remainder(_Tp __x, _Up __y) 1574 { 1575 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1576 return remainder(__type(__x), __type(__y)); 1577 } 1578 1579 inline float 1580 remquo(float __x, float __y, int* __pquo) 1581 { return __builtin_remquof(__x, __y, __pquo); } 1582 1583 inline long double 1584 remquo(long double __x, long double __y, int* __pquo) 1585 { return __builtin_remquol(__x, __y, __pquo); } 1586 1587 template<typename _Tp, typename _Up> 1588 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1589 remquo(_Tp __x, _Up __y, int* __pquo) 1590 { 1591 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1592 return remquo(__type(__x), __type(__y), __pquo); 1593 } 1594 1595 constexpr float 1596 rint(float __x) 1597 { return __builtin_rintf(__x); } 1598 1599 constexpr long double 1600 rint(long double __x) 1601 { return __builtin_rintl(__x); } 1602 1603 template<typename _Tp> 1604 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1605 double>::__type 1606 rint(_Tp __x) 1607 { return __builtin_rint(__x); } 1608 1609 constexpr float 1610 round(float __x) 1611 { return __builtin_roundf(__x); } 1612 1613 constexpr long double 1614 round(long double __x) 1615 { return __builtin_roundl(__x); } 1616 1617 template<typename _Tp> 1618 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1619 double>::__type 1620 round(_Tp __x) 1621 { return __builtin_round(__x); } 1622 1623 constexpr float 1624 scalbln(float __x, long __ex) 1625 { return __builtin_scalblnf(__x, __ex); } 1626 1627 constexpr long double 1628 scalbln(long double __x, long __ex) 1629 { return __builtin_scalblnl(__x, __ex); } 1630 1631 template<typename _Tp> 1632 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1633 double>::__type 1634 scalbln(_Tp __x, long __ex) 1635 { return __builtin_scalbln(__x, __ex); } 1636 1637 constexpr float 1638 scalbn(float __x, int __ex) 1639 { return __builtin_scalbnf(__x, __ex); } 1640 1641 constexpr long double 1642 scalbn(long double __x, int __ex) 1643 { return __builtin_scalbnl(__x, __ex); } 1644 1645 template<typename _Tp> 1646 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1647 double>::__type 1648 scalbn(_Tp __x, int __ex) 1649 { return __builtin_scalbn(__x, __ex); } 1650 1651 constexpr float 1652 tgamma(float __x) 1653 { return __builtin_tgammaf(__x); } 1654 1655 constexpr long double 1656 tgamma(long double __x) 1657 { return __builtin_tgammal(__x); } 1658 1659 template<typename _Tp> 1660 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1661 double>::__type 1662 tgamma(_Tp __x) 1663 { return __builtin_tgamma(__x); } 1664 1665 constexpr float 1666 trunc(float __x) 1667 { return __builtin_truncf(__x); } 1668 1669 constexpr long double 1670 trunc(long double __x) 1671 { return __builtin_truncl(__x); } 1672 1673 template<typename _Tp> 1674 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1675 double>::__type 1676 trunc(_Tp __x) 1677 { return __builtin_trunc(__x); } 1678 1679 _GLIBCXX_END_NAMESPACE_VERSION 1680 } // namespace 1681 1682 #endif // _GLIBCXX_USE_C99_MATH_TR1 1683 1684 #endif // C++11 1685 1686 #endif 1687