cmath revision 1.1.1.4
1// -*- C++ -*- C forwarding header. 2 3// Copyright (C) 1997-2015 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 75namespace 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 555namespace std _GLIBCXX_VISIBILITY(default) 556{ 557_GLIBCXX_BEGIN_NAMESPACE_VERSION 558 559#if __cplusplus >= 201103L 560 561#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 562 constexpr int 563 fpclassify(float __x) 564 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 565 FP_SUBNORMAL, FP_ZERO, __x); } 566 567 constexpr int 568 fpclassify(double __x) 569 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 570 FP_SUBNORMAL, FP_ZERO, __x); } 571 572 constexpr int 573 fpclassify(long double __x) 574 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 575 FP_SUBNORMAL, FP_ZERO, __x); } 576#endif 577 578 template<typename _Tp> 579 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 580 int>::__type 581 fpclassify(_Tp __x) 582 { return __x != 0 ? FP_NORMAL : FP_ZERO; } 583 584#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 585 constexpr bool 586 isfinite(float __x) 587 { return __builtin_isfinite(__x); } 588 589 constexpr bool 590 isfinite(double __x) 591 { return __builtin_isfinite(__x); } 592 593 constexpr bool 594 isfinite(long double __x) 595 { return __builtin_isfinite(__x); } 596#endif 597 598 template<typename _Tp> 599 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 600 bool>::__type 601 isfinite(_Tp __x) 602 { return true; } 603 604#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 605 constexpr bool 606 isinf(float __x) 607 { return __builtin_isinf(__x); } 608 609 constexpr bool 610 isinf(double __x) 611 { return __builtin_isinf(__x); } 612 613 constexpr bool 614 isinf(long double __x) 615 { return __builtin_isinf(__x); } 616#endif 617 618 template<typename _Tp> 619 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 620 bool>::__type 621 isinf(_Tp __x) 622 { return false; } 623 624#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 625 constexpr bool 626 isnan(float __x) 627 { return __builtin_isnan(__x); } 628 629 constexpr bool 630 isnan(double __x) 631 { return __builtin_isnan(__x); } 632 633 constexpr bool 634 isnan(long double __x) 635 { return __builtin_isnan(__x); } 636#endif 637 638 template<typename _Tp> 639 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 640 bool>::__type 641 isnan(_Tp __x) 642 { return false; } 643 644#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 645 constexpr bool 646 isnormal(float __x) 647 { return __builtin_isnormal(__x); } 648 649 constexpr bool 650 isnormal(double __x) 651 { return __builtin_isnormal(__x); } 652 653 constexpr bool 654 isnormal(long double __x) 655 { return __builtin_isnormal(__x); } 656#endif 657 658 template<typename _Tp> 659 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 660 bool>::__type 661 isnormal(_Tp __x) 662 { return __x != 0 ? true : false; } 663 664#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 665 // The front-end doesn't provide a type generic builtin (libstdc++/58625). 666 constexpr bool 667 signbit(float __x) 668 { return __builtin_signbitf(__x); } 669 670 constexpr bool 671 signbit(double __x) 672 { return __builtin_signbit(__x); } 673 674 constexpr bool 675 signbit(long double __x) 676 { return __builtin_signbitl(__x); } 677#endif 678 679 template<typename _Tp> 680 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 681 bool>::__type 682 signbit(_Tp __x) 683 { return __x < 0 ? true : false; } 684 685#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 686 constexpr bool 687 isgreater(float __x, float __y) 688 { return __builtin_isgreater(__x, __y); } 689 690 constexpr bool 691 isgreater(double __x, double __y) 692 { return __builtin_isgreater(__x, __y); } 693 694 constexpr bool 695 isgreater(long double __x, long double __y) 696 { return __builtin_isgreater(__x, __y); } 697#endif 698 699 template<typename _Tp, typename _Up> 700 constexpr typename 701 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 702 && __is_arithmetic<_Up>::__value), bool>::__type 703 isgreater(_Tp __x, _Up __y) 704 { 705 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 706 return __builtin_isgreater(__type(__x), __type(__y)); 707 } 708 709#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 710 constexpr bool 711 isgreaterequal(float __x, float __y) 712 { return __builtin_isgreaterequal(__x, __y); } 713 714 constexpr bool 715 isgreaterequal(double __x, double __y) 716 { return __builtin_isgreaterequal(__x, __y); } 717 718 constexpr bool 719 isgreaterequal(long double __x, long double __y) 720 { return __builtin_isgreaterequal(__x, __y); } 721#endif 722 723 template<typename _Tp, typename _Up> 724 constexpr typename 725 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 726 && __is_arithmetic<_Up>::__value), bool>::__type 727 isgreaterequal(_Tp __x, _Up __y) 728 { 729 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 730 return __builtin_isgreaterequal(__type(__x), __type(__y)); 731 } 732 733#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 734 constexpr bool 735 isless(float __x, float __y) 736 { return __builtin_isless(__x, __y); } 737 738 constexpr bool 739 isless(double __x, double __y) 740 { return __builtin_isless(__x, __y); } 741 742 constexpr bool 743 isless(long double __x, long double __y) 744 { return __builtin_isless(__x, __y); } 745#endif 746 747 template<typename _Tp, typename _Up> 748 constexpr typename 749 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 750 && __is_arithmetic<_Up>::__value), bool>::__type 751 isless(_Tp __x, _Up __y) 752 { 753 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 754 return __builtin_isless(__type(__x), __type(__y)); 755 } 756 757#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 758 constexpr bool 759 islessequal(float __x, float __y) 760 { return __builtin_islessequal(__x, __y); } 761 762 constexpr bool 763 islessequal(double __x, double __y) 764 { return __builtin_islessequal(__x, __y); } 765 766 constexpr bool 767 islessequal(long double __x, long double __y) 768 { return __builtin_islessequal(__x, __y); } 769#endif 770 771 template<typename _Tp, typename _Up> 772 constexpr typename 773 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 774 && __is_arithmetic<_Up>::__value), bool>::__type 775 islessequal(_Tp __x, _Up __y) 776 { 777 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 778 return __builtin_islessequal(__type(__x), __type(__y)); 779 } 780 781#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 782 constexpr bool 783 islessgreater(float __x, float __y) 784 { return __builtin_islessgreater(__x, __y); } 785 786 constexpr bool 787 islessgreater(double __x, double __y) 788 { return __builtin_islessgreater(__x, __y); } 789 790 constexpr bool 791 islessgreater(long double __x, long double __y) 792 { return __builtin_islessgreater(__x, __y); } 793#endif 794 795 template<typename _Tp, typename _Up> 796 constexpr typename 797 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 798 && __is_arithmetic<_Up>::__value), bool>::__type 799 islessgreater(_Tp __x, _Up __y) 800 { 801 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 802 return __builtin_islessgreater(__type(__x), __type(__y)); 803 } 804 805#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 806 constexpr bool 807 isunordered(float __x, float __y) 808 { return __builtin_isunordered(__x, __y); } 809 810 constexpr bool 811 isunordered(double __x, double __y) 812 { return __builtin_isunordered(__x, __y); } 813 814 constexpr bool 815 isunordered(long double __x, long double __y) 816 { return __builtin_isunordered(__x, __y); } 817#endif 818 819 template<typename _Tp, typename _Up> 820 constexpr typename 821 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 822 && __is_arithmetic<_Up>::__value), bool>::__type 823 isunordered(_Tp __x, _Up __y) 824 { 825 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 826 return __builtin_isunordered(__type(__x), __type(__y)); 827 } 828 829#else 830 831 template<typename _Tp> 832 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 833 int>::__type 834 fpclassify(_Tp __f) 835 { 836 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 837 return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 838 FP_SUBNORMAL, FP_ZERO, __type(__f)); 839 } 840 841 template<typename _Tp> 842 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 843 int>::__type 844 isfinite(_Tp __f) 845 { 846 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 847 return __builtin_isfinite(__type(__f)); 848 } 849 850 template<typename _Tp> 851 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 852 int>::__type 853 isinf(_Tp __f) 854 { 855 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 856 return __builtin_isinf(__type(__f)); 857 } 858 859 template<typename _Tp> 860 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 861 int>::__type 862 isnan(_Tp __f) 863 { 864 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 865 return __builtin_isnan(__type(__f)); 866 } 867 868 template<typename _Tp> 869 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 870 int>::__type 871 isnormal(_Tp __f) 872 { 873 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 874 return __builtin_isnormal(__type(__f)); 875 } 876 877 template<typename _Tp> 878 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 879 int>::__type 880 signbit(_Tp __f) 881 { 882 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 883 return sizeof(__type) == sizeof(float) 884 ? __builtin_signbitf(__type(__f)) 885 : sizeof(__type) == sizeof(double) 886 ? __builtin_signbit(__type(__f)) 887 : __builtin_signbitl(__type(__f)); 888 } 889 890 template<typename _Tp> 891 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 892 int>::__type 893 isgreater(_Tp __f1, _Tp __f2) 894 { 895 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 896 return __builtin_isgreater(__type(__f1), __type(__f2)); 897 } 898 899 template<typename _Tp> 900 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 901 int>::__type 902 isgreaterequal(_Tp __f1, _Tp __f2) 903 { 904 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 905 return __builtin_isgreaterequal(__type(__f1), __type(__f2)); 906 } 907 908 template<typename _Tp> 909 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 910 int>::__type 911 isless(_Tp __f1, _Tp __f2) 912 { 913 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 914 return __builtin_isless(__type(__f1), __type(__f2)); 915 } 916 917 template<typename _Tp> 918 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 919 int>::__type 920 islessequal(_Tp __f1, _Tp __f2) 921 { 922 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 923 return __builtin_islessequal(__type(__f1), __type(__f2)); 924 } 925 926 template<typename _Tp> 927 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 928 int>::__type 929 islessgreater(_Tp __f1, _Tp __f2) 930 { 931 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 932 return __builtin_islessgreater(__type(__f1), __type(__f2)); 933 } 934 935 template<typename _Tp> 936 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 937 int>::__type 938 isunordered(_Tp __f1, _Tp __f2) 939 { 940 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 941 return __builtin_isunordered(__type(__f1), __type(__f2)); 942 } 943 944#endif 945 946_GLIBCXX_END_NAMESPACE_VERSION 947} // namespace 948 949#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */ 950#endif 951 952#if __cplusplus >= 201103L 953 954#ifdef _GLIBCXX_USE_C99_MATH_TR1 955 956#undef acosh 957#undef acoshf 958#undef acoshl 959#undef asinh 960#undef asinhf 961#undef asinhl 962#undef atanh 963#undef atanhf 964#undef atanhl 965#undef cbrt 966#undef cbrtf 967#undef cbrtl 968#undef copysign 969#undef copysignf 970#undef copysignl 971#undef erf 972#undef erff 973#undef erfl 974#undef erfc 975#undef erfcf 976#undef erfcl 977#undef exp2 978#undef exp2f 979#undef exp2l 980#undef expm1 981#undef expm1f 982#undef expm1l 983#undef fdim 984#undef fdimf 985#undef fdiml 986#undef fma 987#undef fmaf 988#undef fmal 989#undef fmax 990#undef fmaxf 991#undef fmaxl 992#undef fmin 993#undef fminf 994#undef fminl 995#undef hypot 996#undef hypotf 997#undef hypotl 998#undef ilogb 999#undef ilogbf 1000#undef ilogbl 1001#undef lgamma 1002#undef lgammaf 1003#undef lgammal 1004#undef llrint 1005#undef llrintf 1006#undef llrintl 1007#undef llround 1008#undef llroundf 1009#undef llroundl 1010#undef log1p 1011#undef log1pf 1012#undef log1pl 1013#undef log2 1014#undef log2f 1015#undef log2l 1016#undef logb 1017#undef logbf 1018#undef logbl 1019#undef lrint 1020#undef lrintf 1021#undef lrintl 1022#undef lround 1023#undef lroundf 1024#undef lroundl 1025#undef nan 1026#undef nanf 1027#undef nanl 1028#undef nearbyint 1029#undef nearbyintf 1030#undef nearbyintl 1031#undef nextafter 1032#undef nextafterf 1033#undef nextafterl 1034#undef nexttoward 1035#undef nexttowardf 1036#undef nexttowardl 1037#undef remainder 1038#undef remainderf 1039#undef remainderl 1040#undef remquo 1041#undef remquof 1042#undef remquol 1043#undef rint 1044#undef rintf 1045#undef rintl 1046#undef round 1047#undef roundf 1048#undef roundl 1049#undef scalbln 1050#undef scalblnf 1051#undef scalblnl 1052#undef scalbn 1053#undef scalbnf 1054#undef scalbnl 1055#undef tgamma 1056#undef tgammaf 1057#undef tgammal 1058#undef trunc 1059#undef truncf 1060#undef truncl 1061 1062namespace std _GLIBCXX_VISIBILITY(default) 1063{ 1064_GLIBCXX_BEGIN_NAMESPACE_VERSION 1065 1066 // types 1067 using ::double_t; 1068 using ::float_t; 1069 1070 // functions 1071 using ::acosh; 1072 using ::acoshf; 1073 using ::acoshl; 1074 1075 using ::asinh; 1076 using ::asinhf; 1077 using ::asinhl; 1078 1079 using ::atanh; 1080 using ::atanhf; 1081 using ::atanhl; 1082 1083 using ::cbrt; 1084 using ::cbrtf; 1085 using ::cbrtl; 1086 1087 using ::copysign; 1088 using ::copysignf; 1089 using ::copysignl; 1090 1091 using ::erf; 1092 using ::erff; 1093 using ::erfl; 1094 1095 using ::erfc; 1096 using ::erfcf; 1097 using ::erfcl; 1098 1099 using ::exp2; 1100 using ::exp2f; 1101 using ::exp2l; 1102 1103 using ::expm1; 1104 using ::expm1f; 1105 using ::expm1l; 1106 1107 using ::fdim; 1108 using ::fdimf; 1109 using ::fdiml; 1110 1111 using ::fma; 1112 using ::fmaf; 1113 using ::fmal; 1114 1115 using ::fmax; 1116 using ::fmaxf; 1117 using ::fmaxl; 1118 1119 using ::fmin; 1120 using ::fminf; 1121 using ::fminl; 1122 1123 using ::hypot; 1124 using ::hypotf; 1125 using ::hypotl; 1126 1127 using ::ilogb; 1128 using ::ilogbf; 1129 using ::ilogbl; 1130 1131 using ::lgamma; 1132 using ::lgammaf; 1133 using ::lgammal; 1134 1135 using ::llrint; 1136 using ::llrintf; 1137 using ::llrintl; 1138 1139 using ::llround; 1140 using ::llroundf; 1141 using ::llroundl; 1142 1143 using ::log1p; 1144 using ::log1pf; 1145 using ::log1pl; 1146 1147 using ::log2; 1148 using ::log2f; 1149 using ::log2l; 1150 1151 using ::logb; 1152 using ::logbf; 1153 using ::logbl; 1154 1155 using ::lrint; 1156 using ::lrintf; 1157 using ::lrintl; 1158 1159 using ::lround; 1160 using ::lroundf; 1161 using ::lroundl; 1162 1163 using ::nan; 1164 using ::nanf; 1165 using ::nanl; 1166 1167 using ::nearbyint; 1168 using ::nearbyintf; 1169 using ::nearbyintl; 1170 1171 using ::nextafter; 1172 using ::nextafterf; 1173 using ::nextafterl; 1174 1175 using ::nexttoward; 1176 using ::nexttowardf; 1177 using ::nexttowardl; 1178 1179 using ::remainder; 1180 using ::remainderf; 1181 using ::remainderl; 1182 1183 using ::remquo; 1184 using ::remquof; 1185 using ::remquol; 1186 1187 using ::rint; 1188 using ::rintf; 1189 using ::rintl; 1190 1191 using ::round; 1192 using ::roundf; 1193 using ::roundl; 1194 1195 using ::scalbln; 1196 using ::scalblnf; 1197 using ::scalblnl; 1198 1199 using ::scalbn; 1200 using ::scalbnf; 1201 using ::scalbnl; 1202 1203 using ::tgamma; 1204 using ::tgammaf; 1205 using ::tgammal; 1206 1207 using ::trunc; 1208 using ::truncf; 1209 using ::truncl; 1210 1211 /// Additional overloads. 1212#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1213 constexpr float 1214 acosh(float __x) 1215 { return __builtin_acoshf(__x); } 1216 1217 constexpr long double 1218 acosh(long double __x) 1219 { return __builtin_acoshl(__x); } 1220#endif 1221 1222 template<typename _Tp> 1223 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1224 double>::__type 1225 acosh(_Tp __x) 1226 { return __builtin_acosh(__x); } 1227 1228#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1229 constexpr float 1230 asinh(float __x) 1231 { return __builtin_asinhf(__x); } 1232 1233 constexpr long double 1234 asinh(long double __x) 1235 { return __builtin_asinhl(__x); } 1236#endif 1237 1238 template<typename _Tp> 1239 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1240 double>::__type 1241 asinh(_Tp __x) 1242 { return __builtin_asinh(__x); } 1243 1244#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1245 constexpr float 1246 atanh(float __x) 1247 { return __builtin_atanhf(__x); } 1248 1249 constexpr long double 1250 atanh(long double __x) 1251 { return __builtin_atanhl(__x); } 1252#endif 1253 1254 template<typename _Tp> 1255 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1256 double>::__type 1257 atanh(_Tp __x) 1258 { return __builtin_atanh(__x); } 1259 1260#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1261 constexpr float 1262 cbrt(float __x) 1263 { return __builtin_cbrtf(__x); } 1264 1265 constexpr long double 1266 cbrt(long double __x) 1267 { return __builtin_cbrtl(__x); } 1268#endif 1269 1270 template<typename _Tp> 1271 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1272 double>::__type 1273 cbrt(_Tp __x) 1274 { return __builtin_cbrt(__x); } 1275 1276#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1277 constexpr float 1278 copysign(float __x, float __y) 1279 { return __builtin_copysignf(__x, __y); } 1280 1281 constexpr long double 1282 copysign(long double __x, long double __y) 1283 { return __builtin_copysignl(__x, __y); } 1284#endif 1285 1286 template<typename _Tp, typename _Up> 1287 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1288 copysign(_Tp __x, _Up __y) 1289 { 1290 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1291 return copysign(__type(__x), __type(__y)); 1292 } 1293 1294#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1295 constexpr float 1296 erf(float __x) 1297 { return __builtin_erff(__x); } 1298 1299 constexpr long double 1300 erf(long double __x) 1301 { return __builtin_erfl(__x); } 1302#endif 1303 1304 template<typename _Tp> 1305 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1306 double>::__type 1307 erf(_Tp __x) 1308 { return __builtin_erf(__x); } 1309 1310#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1311 constexpr float 1312 erfc(float __x) 1313 { return __builtin_erfcf(__x); } 1314 1315 constexpr long double 1316 erfc(long double __x) 1317 { return __builtin_erfcl(__x); } 1318#endif 1319 1320 template<typename _Tp> 1321 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1322 double>::__type 1323 erfc(_Tp __x) 1324 { return __builtin_erfc(__x); } 1325 1326#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1327 constexpr float 1328 exp2(float __x) 1329 { return __builtin_exp2f(__x); } 1330 1331 constexpr long double 1332 exp2(long double __x) 1333 { return __builtin_exp2l(__x); } 1334#endif 1335 1336 template<typename _Tp> 1337 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1338 double>::__type 1339 exp2(_Tp __x) 1340 { return __builtin_exp2(__x); } 1341 1342#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1343 constexpr float 1344 expm1(float __x) 1345 { return __builtin_expm1f(__x); } 1346 1347 constexpr long double 1348 expm1(long double __x) 1349 { return __builtin_expm1l(__x); } 1350#endif 1351 1352 template<typename _Tp> 1353 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1354 double>::__type 1355 expm1(_Tp __x) 1356 { return __builtin_expm1(__x); } 1357 1358#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1359 constexpr float 1360 fdim(float __x, float __y) 1361 { return __builtin_fdimf(__x, __y); } 1362 1363 constexpr long double 1364 fdim(long double __x, long double __y) 1365 { return __builtin_fdiml(__x, __y); } 1366#endif 1367 1368 template<typename _Tp, typename _Up> 1369 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1370 fdim(_Tp __x, _Up __y) 1371 { 1372 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1373 return fdim(__type(__x), __type(__y)); 1374 } 1375 1376#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1377 constexpr float 1378 fma(float __x, float __y, float __z) 1379 { return __builtin_fmaf(__x, __y, __z); } 1380 1381 constexpr long double 1382 fma(long double __x, long double __y, long double __z) 1383 { return __builtin_fmal(__x, __y, __z); } 1384#endif 1385 1386 template<typename _Tp, typename _Up, typename _Vp> 1387 constexpr typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type 1388 fma(_Tp __x, _Up __y, _Vp __z) 1389 { 1390 typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type; 1391 return fma(__type(__x), __type(__y), __type(__z)); 1392 } 1393 1394#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1395 constexpr float 1396 fmax(float __x, float __y) 1397 { return __builtin_fmaxf(__x, __y); } 1398 1399 constexpr long double 1400 fmax(long double __x, long double __y) 1401 { return __builtin_fmaxl(__x, __y); } 1402#endif 1403 1404 template<typename _Tp, typename _Up> 1405 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1406 fmax(_Tp __x, _Up __y) 1407 { 1408 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1409 return fmax(__type(__x), __type(__y)); 1410 } 1411 1412#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1413 constexpr float 1414 fmin(float __x, float __y) 1415 { return __builtin_fminf(__x, __y); } 1416 1417 constexpr long double 1418 fmin(long double __x, long double __y) 1419 { return __builtin_fminl(__x, __y); } 1420#endif 1421 1422 template<typename _Tp, typename _Up> 1423 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1424 fmin(_Tp __x, _Up __y) 1425 { 1426 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1427 return fmin(__type(__x), __type(__y)); 1428 } 1429 1430#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1431 constexpr float 1432 hypot(float __x, float __y) 1433 { return __builtin_hypotf(__x, __y); } 1434 1435 constexpr long double 1436 hypot(long double __x, long double __y) 1437 { return __builtin_hypotl(__x, __y); } 1438#endif 1439 1440 template<typename _Tp, typename _Up> 1441 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1442 hypot(_Tp __x, _Up __y) 1443 { 1444 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1445 return hypot(__type(__x), __type(__y)); 1446 } 1447 1448#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1449 constexpr int 1450 ilogb(float __x) 1451 { return __builtin_ilogbf(__x); } 1452 1453 constexpr int 1454 ilogb(long double __x) 1455 { return __builtin_ilogbl(__x); } 1456#endif 1457 1458 template<typename _Tp> 1459 constexpr 1460 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1461 int>::__type 1462 ilogb(_Tp __x) 1463 { return __builtin_ilogb(__x); } 1464 1465#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1466 constexpr float 1467 lgamma(float __x) 1468 { return __builtin_lgammaf(__x); } 1469 1470 constexpr long double 1471 lgamma(long double __x) 1472 { return __builtin_lgammal(__x); } 1473#endif 1474 1475 template<typename _Tp> 1476 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1477 double>::__type 1478 lgamma(_Tp __x) 1479 { return __builtin_lgamma(__x); } 1480 1481#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1482 constexpr long long 1483 llrint(float __x) 1484 { return __builtin_llrintf(__x); } 1485 1486 constexpr long long 1487 llrint(long double __x) 1488 { return __builtin_llrintl(__x); } 1489#endif 1490 1491 template<typename _Tp> 1492 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1493 long long>::__type 1494 llrint(_Tp __x) 1495 { return __builtin_llrint(__x); } 1496 1497#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1498 constexpr long long 1499 llround(float __x) 1500 { return __builtin_llroundf(__x); } 1501 1502 constexpr long long 1503 llround(long double __x) 1504 { return __builtin_llroundl(__x); } 1505#endif 1506 1507 template<typename _Tp> 1508 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1509 long long>::__type 1510 llround(_Tp __x) 1511 { return __builtin_llround(__x); } 1512 1513#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1514 constexpr float 1515 log1p(float __x) 1516 { return __builtin_log1pf(__x); } 1517 1518 constexpr long double 1519 log1p(long double __x) 1520 { return __builtin_log1pl(__x); } 1521#endif 1522 1523 template<typename _Tp> 1524 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1525 double>::__type 1526 log1p(_Tp __x) 1527 { return __builtin_log1p(__x); } 1528 1529#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1530 // DR 568. 1531 constexpr float 1532 log2(float __x) 1533 { return __builtin_log2f(__x); } 1534 1535 constexpr long double 1536 log2(long double __x) 1537 { return __builtin_log2l(__x); } 1538#endif 1539 1540 template<typename _Tp> 1541 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1542 double>::__type 1543 log2(_Tp __x) 1544 { return __builtin_log2(__x); } 1545 1546#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1547 constexpr float 1548 logb(float __x) 1549 { return __builtin_logbf(__x); } 1550 1551 constexpr long double 1552 logb(long double __x) 1553 { return __builtin_logbl(__x); } 1554#endif 1555 1556 template<typename _Tp> 1557 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1558 double>::__type 1559 logb(_Tp __x) 1560 { return __builtin_logb(__x); } 1561 1562#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1563 constexpr long 1564 lrint(float __x) 1565 { return __builtin_lrintf(__x); } 1566 1567 constexpr long 1568 lrint(long double __x) 1569 { return __builtin_lrintl(__x); } 1570#endif 1571 1572 template<typename _Tp> 1573 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1574 long>::__type 1575 lrint(_Tp __x) 1576 { return __builtin_lrint(__x); } 1577 1578#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1579 constexpr long 1580 lround(float __x) 1581 { return __builtin_lroundf(__x); } 1582 1583 constexpr long 1584 lround(long double __x) 1585 { return __builtin_lroundl(__x); } 1586#endif 1587 1588 template<typename _Tp> 1589 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1590 long>::__type 1591 lround(_Tp __x) 1592 { return __builtin_lround(__x); } 1593 1594#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1595 constexpr float 1596 nearbyint(float __x) 1597 { return __builtin_nearbyintf(__x); } 1598 1599 constexpr long double 1600 nearbyint(long double __x) 1601 { return __builtin_nearbyintl(__x); } 1602#endif 1603 1604 template<typename _Tp> 1605 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1606 double>::__type 1607 nearbyint(_Tp __x) 1608 { return __builtin_nearbyint(__x); } 1609 1610#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1611 constexpr float 1612 nextafter(float __x, float __y) 1613 { return __builtin_nextafterf(__x, __y); } 1614 1615 constexpr long double 1616 nextafter(long double __x, long double __y) 1617 { return __builtin_nextafterl(__x, __y); } 1618#endif 1619 1620 template<typename _Tp, typename _Up> 1621 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1622 nextafter(_Tp __x, _Up __y) 1623 { 1624 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1625 return nextafter(__type(__x), __type(__y)); 1626 } 1627 1628#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1629 constexpr float 1630 nexttoward(float __x, long double __y) 1631 { return __builtin_nexttowardf(__x, __y); } 1632 1633 constexpr long double 1634 nexttoward(long double __x, long double __y) 1635 { return __builtin_nexttowardl(__x, __y); } 1636#endif 1637 1638 template<typename _Tp> 1639 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1640 double>::__type 1641 nexttoward(_Tp __x, long double __y) 1642 { return __builtin_nexttoward(__x, __y); } 1643 1644#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1645 constexpr float 1646 remainder(float __x, float __y) 1647 { return __builtin_remainderf(__x, __y); } 1648 1649 constexpr long double 1650 remainder(long double __x, long double __y) 1651 { return __builtin_remainderl(__x, __y); } 1652#endif 1653 1654 template<typename _Tp, typename _Up> 1655 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1656 remainder(_Tp __x, _Up __y) 1657 { 1658 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1659 return remainder(__type(__x), __type(__y)); 1660 } 1661 1662#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1663 inline float 1664 remquo(float __x, float __y, int* __pquo) 1665 { return __builtin_remquof(__x, __y, __pquo); } 1666 1667 inline long double 1668 remquo(long double __x, long double __y, int* __pquo) 1669 { return __builtin_remquol(__x, __y, __pquo); } 1670#endif 1671 1672 template<typename _Tp, typename _Up> 1673 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1674 remquo(_Tp __x, _Up __y, int* __pquo) 1675 { 1676 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1677 return remquo(__type(__x), __type(__y), __pquo); 1678 } 1679 1680#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1681 constexpr float 1682 rint(float __x) 1683 { return __builtin_rintf(__x); } 1684 1685 constexpr long double 1686 rint(long double __x) 1687 { return __builtin_rintl(__x); } 1688#endif 1689 1690 template<typename _Tp> 1691 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1692 double>::__type 1693 rint(_Tp __x) 1694 { return __builtin_rint(__x); } 1695 1696#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1697 constexpr float 1698 round(float __x) 1699 { return __builtin_roundf(__x); } 1700 1701 constexpr long double 1702 round(long double __x) 1703 { return __builtin_roundl(__x); } 1704#endif 1705 1706 template<typename _Tp> 1707 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1708 double>::__type 1709 round(_Tp __x) 1710 { return __builtin_round(__x); } 1711 1712#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1713 constexpr float 1714 scalbln(float __x, long __ex) 1715 { return __builtin_scalblnf(__x, __ex); } 1716 1717 constexpr long double 1718 scalbln(long double __x, long __ex) 1719 { return __builtin_scalblnl(__x, __ex); } 1720#endif 1721 1722 template<typename _Tp> 1723 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1724 double>::__type 1725 scalbln(_Tp __x, long __ex) 1726 { return __builtin_scalbln(__x, __ex); } 1727 1728#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1729 constexpr float 1730 scalbn(float __x, int __ex) 1731 { return __builtin_scalbnf(__x, __ex); } 1732 1733 constexpr long double 1734 scalbn(long double __x, int __ex) 1735 { return __builtin_scalbnl(__x, __ex); } 1736#endif 1737 1738 template<typename _Tp> 1739 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1740 double>::__type 1741 scalbn(_Tp __x, int __ex) 1742 { return __builtin_scalbn(__x, __ex); } 1743 1744#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1745 constexpr float 1746 tgamma(float __x) 1747 { return __builtin_tgammaf(__x); } 1748 1749 constexpr long double 1750 tgamma(long double __x) 1751 { return __builtin_tgammal(__x); } 1752#endif 1753 1754 template<typename _Tp> 1755 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1756 double>::__type 1757 tgamma(_Tp __x) 1758 { return __builtin_tgamma(__x); } 1759 1760#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO 1761 constexpr float 1762 trunc(float __x) 1763 { return __builtin_truncf(__x); } 1764 1765 constexpr long double 1766 trunc(long double __x) 1767 { return __builtin_truncl(__x); } 1768#endif 1769 1770 template<typename _Tp> 1771 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1772 double>::__type 1773 trunc(_Tp __x) 1774 { return __builtin_trunc(__x); } 1775 1776_GLIBCXX_END_NAMESPACE_VERSION 1777} // namespace 1778 1779#endif // _GLIBCXX_USE_C99_MATH_TR1 1780 1781#endif // C++11 1782 1783#endif 1784