1// -*- C++ -*- C forwarding header. 2 3// Copyright (C) 1997-2021 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#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS 45#include_next <math.h> 46#undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS 47#include <bits/std_abs.h> 48 49#ifndef _GLIBCXX_CMATH 50#define _GLIBCXX_CMATH 1 51 52// Get rid of those macros defined in <math.h> in lieu of real functions. 53#undef div 54#undef acos 55#undef asin 56#undef atan 57#undef atan2 58#undef ceil 59#undef cos 60#undef cosh 61#undef exp 62#undef fabs 63#undef floor 64#undef fmod 65#undef frexp 66#undef ldexp 67#undef log 68#undef log10 69#undef modf 70#undef pow 71#undef sin 72#undef sinh 73#undef sqrt 74#undef tan 75#undef tanh 76 77extern "C++" 78{ 79namespace std _GLIBCXX_VISIBILITY(default) 80{ 81_GLIBCXX_BEGIN_NAMESPACE_VERSION 82 83 using ::acos; 84 85#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 86 inline _GLIBCXX_CONSTEXPR float 87 acos(float __x) 88 { return __builtin_acosf(__x); } 89 90 inline _GLIBCXX_CONSTEXPR long double 91 acos(long double __x) 92 { return __builtin_acosl(__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 acos(_Tp __x) 100 { return __builtin_acos(__x); } 101 102 using ::asin; 103 104#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 105 inline _GLIBCXX_CONSTEXPR float 106 asin(float __x) 107 { return __builtin_asinf(__x); } 108 109 inline _GLIBCXX_CONSTEXPR long double 110 asin(long double __x) 111 { return __builtin_asinl(__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 asin(_Tp __x) 119 { return __builtin_asin(__x); } 120 121 using ::atan; 122 123#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 124 inline _GLIBCXX_CONSTEXPR float 125 atan(float __x) 126 { return __builtin_atanf(__x); } 127 128 inline _GLIBCXX_CONSTEXPR long double 129 atan(long double __x) 130 { return __builtin_atanl(__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 atan(_Tp __x) 138 { return __builtin_atan(__x); } 139 140 using ::atan2; 141 142#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 143 inline _GLIBCXX_CONSTEXPR float 144 atan2(float __y, float __x) 145 { return __builtin_atan2f(__y, __x); } 146 147 inline _GLIBCXX_CONSTEXPR long double 148 atan2(long double __y, long double __x) 149 { return __builtin_atan2l(__y, __x); } 150#endif 151 152 template<typename _Tp, typename _Up> 153 inline _GLIBCXX_CONSTEXPR 154 typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 155 atan2(_Tp __y, _Up __x) 156 { 157 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 158 return atan2(__type(__y), __type(__x)); 159 } 160 161 using ::ceil; 162 163#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 164 inline _GLIBCXX_CONSTEXPR float 165 ceil(float __x) 166 { return __builtin_ceilf(__x); } 167 168 inline _GLIBCXX_CONSTEXPR long double 169 ceil(long double __x) 170 { return __builtin_ceill(__x); } 171#endif 172 173 template<typename _Tp> 174 inline _GLIBCXX_CONSTEXPR 175 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 176 double>::__type 177 ceil(_Tp __x) 178 { return __builtin_ceil(__x); } 179 180 using ::cos; 181 182#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 183 inline _GLIBCXX_CONSTEXPR float 184 cos(float __x) 185 { return __builtin_cosf(__x); } 186 187 inline _GLIBCXX_CONSTEXPR long double 188 cos(long double __x) 189 { return __builtin_cosl(__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 cos(_Tp __x) 197 { return __builtin_cos(__x); } 198 199 using ::cosh; 200 201#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 202 inline _GLIBCXX_CONSTEXPR float 203 cosh(float __x) 204 { return __builtin_coshf(__x); } 205 206 inline _GLIBCXX_CONSTEXPR long double 207 cosh(long double __x) 208 { return __builtin_coshl(__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 cosh(_Tp __x) 216 { return __builtin_cosh(__x); } 217 218 using ::exp; 219 220#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 221 inline _GLIBCXX_CONSTEXPR float 222 exp(float __x) 223 { return __builtin_expf(__x); } 224 225 inline _GLIBCXX_CONSTEXPR long double 226 exp(long double __x) 227 { return __builtin_expl(__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 exp(_Tp __x) 235 { return __builtin_exp(__x); } 236 237 using ::fabs; 238 239#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 240 inline _GLIBCXX_CONSTEXPR float 241 fabs(float __x) 242 { return __builtin_fabsf(__x); } 243 244 inline _GLIBCXX_CONSTEXPR long double 245 fabs(long double __x) 246 { return __builtin_fabsl(__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 fabs(_Tp __x) 254 { return __builtin_fabs(__x); } 255 256 using ::floor; 257 258#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 259 inline _GLIBCXX_CONSTEXPR float 260 floor(float __x) 261 { return __builtin_floorf(__x); } 262 263 inline _GLIBCXX_CONSTEXPR long double 264 floor(long double __x) 265 { return __builtin_floorl(__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 floor(_Tp __x) 273 { return __builtin_floor(__x); } 274 275 using ::fmod; 276 277#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 278 inline _GLIBCXX_CONSTEXPR float 279 fmod(float __x, float __y) 280 { return __builtin_fmodf(__x, __y); } 281 282 inline _GLIBCXX_CONSTEXPR long double 283 fmod(long double __x, long double __y) 284 { return __builtin_fmodl(__x, __y); } 285#endif 286 287 template<typename _Tp, typename _Up> 288 inline _GLIBCXX_CONSTEXPR 289 typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 290 fmod(_Tp __x, _Up __y) 291 { 292 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 293 return fmod(__type(__x), __type(__y)); 294 } 295 296 using ::frexp; 297 298#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 299 inline float 300 frexp(float __x, int* __exp) 301 { return __builtin_frexpf(__x, __exp); } 302 303 inline long double 304 frexp(long double __x, int* __exp) 305 { return __builtin_frexpl(__x, __exp); } 306#endif 307 308 template<typename _Tp> 309 inline _GLIBCXX_CONSTEXPR 310 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 311 double>::__type 312 frexp(_Tp __x, int* __exp) 313 { return __builtin_frexp(__x, __exp); } 314 315 using ::ldexp; 316 317#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 318 inline _GLIBCXX_CONSTEXPR float 319 ldexp(float __x, int __exp) 320 { return __builtin_ldexpf(__x, __exp); } 321 322 inline _GLIBCXX_CONSTEXPR long double 323 ldexp(long double __x, int __exp) 324 { return __builtin_ldexpl(__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 ldexp(_Tp __x, int __exp) 332 { return __builtin_ldexp(__x, __exp); } 333 334 using ::log; 335 336#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 337 inline _GLIBCXX_CONSTEXPR float 338 log(float __x) 339 { return __builtin_logf(__x); } 340 341 inline _GLIBCXX_CONSTEXPR long double 342 log(long double __x) 343 { return __builtin_logl(__x); } 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 log(_Tp __x) 351 { return __builtin_log(__x); } 352 353 using ::log10; 354 355#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 356 inline _GLIBCXX_CONSTEXPR float 357 log10(float __x) 358 { return __builtin_log10f(__x); } 359 360 inline _GLIBCXX_CONSTEXPR long double 361 log10(long double __x) 362 { return __builtin_log10l(__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 log10(_Tp __x) 370 { return __builtin_log10(__x); } 371 372 using ::modf; 373 374#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 375 inline float 376 modf(float __x, float* __iptr) 377 { return __builtin_modff(__x, __iptr); } 378 379 inline long double 380 modf(long double __x, long double* __iptr) 381 { return __builtin_modfl(__x, __iptr); } 382#endif 383 384 using ::pow; 385 386#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 387 inline _GLIBCXX_CONSTEXPR float 388 pow(float __x, float __y) 389 { return __builtin_powf(__x, __y); } 390 391 inline _GLIBCXX_CONSTEXPR long double 392 pow(long double __x, long double __y) 393 { return __builtin_powl(__x, __y); } 394 395#if __cplusplus < 201103L 396 // _GLIBCXX_RESOLVE_LIB_DEFECTS 397 // DR 550. What should the return type of pow(float,int) be? 398 inline double 399 pow(double __x, int __i) 400 { return __builtin_powi(__x, __i); } 401 402 inline float 403 pow(float __x, int __n) 404 { return __builtin_powif(__x, __n); } 405 406 inline long double 407 pow(long double __x, int __n) 408 { return __builtin_powil(__x, __n); } 409#endif 410#endif 411 412 template<typename _Tp, typename _Up> 413 inline _GLIBCXX_CONSTEXPR 414 typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 415 pow(_Tp __x, _Up __y) 416 { 417 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 418 return pow(__type(__x), __type(__y)); 419 } 420 421 using ::sin; 422 423#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 424 inline _GLIBCXX_CONSTEXPR float 425 sin(float __x) 426 { return __builtin_sinf(__x); } 427 428 inline _GLIBCXX_CONSTEXPR long double 429 sin(long double __x) 430 { return __builtin_sinl(__x); } 431#endif 432 433 template<typename _Tp> 434 inline _GLIBCXX_CONSTEXPR 435 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 436 double>::__type 437 sin(_Tp __x) 438 { return __builtin_sin(__x); } 439 440 using ::sinh; 441 442#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 443 inline _GLIBCXX_CONSTEXPR float 444 sinh(float __x) 445 { return __builtin_sinhf(__x); } 446 447 inline _GLIBCXX_CONSTEXPR long double 448 sinh(long double __x) 449 { return __builtin_sinhl(__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 sinh(_Tp __x) 457 { return __builtin_sinh(__x); } 458 459 using ::sqrt; 460 461#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 462 inline _GLIBCXX_CONSTEXPR float 463 sqrt(float __x) 464 { return __builtin_sqrtf(__x); } 465 466 inline _GLIBCXX_CONSTEXPR long double 467 sqrt(long double __x) 468 { return __builtin_sqrtl(__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 sqrt(_Tp __x) 476 { return __builtin_sqrt(__x); } 477 478 using ::tan; 479 480#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 481 inline _GLIBCXX_CONSTEXPR float 482 tan(float __x) 483 { return __builtin_tanf(__x); } 484 485 inline _GLIBCXX_CONSTEXPR long double 486 tan(long double __x) 487 { return __builtin_tanl(__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 tan(_Tp __x) 495 { return __builtin_tan(__x); } 496 497 using ::tanh; 498 499#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO 500 inline _GLIBCXX_CONSTEXPR float 501 tanh(float __x) 502 { return __builtin_tanhf(__x); } 503 504 inline _GLIBCXX_CONSTEXPR long double 505 tanh(long double __x) 506 { return __builtin_tanhl(__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 tanh(_Tp __x) 514 { return __builtin_tanh(__x); } 515 516#if _GLIBCXX_USE_C99_MATH 517#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC 518 519// These are possible macros imported from C99-land. 520#undef fpclassify 521#undef isfinite 522#undef isinf 523#undef isnan 524#undef isnormal 525#undef signbit 526#undef isgreater 527#undef isgreaterequal 528#undef isless 529#undef islessequal 530#undef islessgreater 531#undef isunordered 532 533#if __cplusplus >= 201103L 534 535#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 536 constexpr int 537 fpclassify(float __x) 538 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 539 FP_SUBNORMAL, FP_ZERO, __x); } 540 541 constexpr int 542 fpclassify(double __x) 543 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 544 FP_SUBNORMAL, FP_ZERO, __x); } 545 546 constexpr int 547 fpclassify(long double __x) 548 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 549 FP_SUBNORMAL, FP_ZERO, __x); } 550#endif 551 552#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 553 template<typename _Tp> 554 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 555 int>::__type 556 fpclassify(_Tp __x) 557 { return __x != 0 ? FP_NORMAL : FP_ZERO; } 558#endif 559 560#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 561 constexpr bool 562 isfinite(float __x) 563 { return __builtin_isfinite(__x); } 564 565 constexpr bool 566 isfinite(double __x) 567 { return __builtin_isfinite(__x); } 568 569 constexpr bool 570 isfinite(long double __x) 571 { return __builtin_isfinite(__x); } 572#endif 573 574#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 575 template<typename _Tp> 576 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 577 bool>::__type 578 isfinite(_Tp __x) 579 { return true; } 580#endif 581 582#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 583 constexpr bool 584 isinf(float __x) 585 { return __builtin_isinf(__x); } 586 587#if _GLIBCXX_HAVE_OBSOLETE_ISINF \ 588 && !_GLIBCXX_NO_OBSOLETE_ISINF_ISNAN_DYNAMIC 589 using ::isinf; 590#else 591 constexpr bool 592 isinf(double __x) 593 { return __builtin_isinf(__x); } 594#endif 595 596 constexpr bool 597 isinf(long double __x) 598 { return __builtin_isinf(__x); } 599#endif 600 601#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 602 template<typename _Tp> 603 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 604 bool>::__type 605 isinf(_Tp __x) 606 { return false; } 607#endif 608 609#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 610 constexpr bool 611 isnan(float __x) 612 { return __builtin_isnan(__x); } 613 614#if _GLIBCXX_HAVE_OBSOLETE_ISNAN \ 615 && !_GLIBCXX_NO_OBSOLETE_ISINF_ISNAN_DYNAMIC 616 using ::isnan; 617#else 618 constexpr bool 619 isnan(double __x) 620 { return __builtin_isnan(__x); } 621#endif 622 623 constexpr bool 624 isnan(long double __x) 625 { return __builtin_isnan(__x); } 626#endif 627 628#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 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#endif 635 636#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 637 constexpr bool 638 isnormal(float __x) 639 { return __builtin_isnormal(__x); } 640 641 constexpr bool 642 isnormal(double __x) 643 { return __builtin_isnormal(__x); } 644 645 constexpr bool 646 isnormal(long double __x) 647 { return __builtin_isnormal(__x); } 648#endif 649 650#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 651 template<typename _Tp> 652 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 653 bool>::__type 654 isnormal(_Tp __x) 655 { return __x != 0 ? true : false; } 656#endif 657 658#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 659 // Note: middle-end/36757 is fixed, __builtin_signbit is type-generic. 660 constexpr bool 661 signbit(float __x) 662 { return __builtin_signbit(__x); } 663 664 constexpr bool 665 signbit(double __x) 666 { return __builtin_signbit(__x); } 667 668 constexpr bool 669 signbit(long double __x) 670 { return __builtin_signbit(__x); } 671#endif 672 673#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 674 template<typename _Tp> 675 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 676 bool>::__type 677 signbit(_Tp __x) 678 { return __x < 0 ? true : false; } 679#endif 680 681#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 682 constexpr bool 683 isgreater(float __x, float __y) 684 { return __builtin_isgreater(__x, __y); } 685 686 constexpr bool 687 isgreater(double __x, double __y) 688 { return __builtin_isgreater(__x, __y); } 689 690 constexpr bool 691 isgreater(long double __x, long double __y) 692 { return __builtin_isgreater(__x, __y); } 693#endif 694 695#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 696 template<typename _Tp, typename _Up> 697 constexpr typename 698 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 699 && __is_arithmetic<_Up>::__value), bool>::__type 700 isgreater(_Tp __x, _Up __y) 701 { 702 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 703 return __builtin_isgreater(__type(__x), __type(__y)); 704 } 705#endif 706 707#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 708 constexpr bool 709 isgreaterequal(float __x, float __y) 710 { return __builtin_isgreaterequal(__x, __y); } 711 712 constexpr bool 713 isgreaterequal(double __x, double __y) 714 { return __builtin_isgreaterequal(__x, __y); } 715 716 constexpr bool 717 isgreaterequal(long double __x, long double __y) 718 { return __builtin_isgreaterequal(__x, __y); } 719#endif 720 721#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 722 template<typename _Tp, typename _Up> 723 constexpr typename 724 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 725 && __is_arithmetic<_Up>::__value), bool>::__type 726 isgreaterequal(_Tp __x, _Up __y) 727 { 728 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 729 return __builtin_isgreaterequal(__type(__x), __type(__y)); 730 } 731#endif 732 733#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 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#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 748 template<typename _Tp, typename _Up> 749 constexpr typename 750 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 751 && __is_arithmetic<_Up>::__value), bool>::__type 752 isless(_Tp __x, _Up __y) 753 { 754 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 755 return __builtin_isless(__type(__x), __type(__y)); 756 } 757#endif 758 759#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 760 constexpr bool 761 islessequal(float __x, float __y) 762 { return __builtin_islessequal(__x, __y); } 763 764 constexpr bool 765 islessequal(double __x, double __y) 766 { return __builtin_islessequal(__x, __y); } 767 768 constexpr bool 769 islessequal(long double __x, long double __y) 770 { return __builtin_islessequal(__x, __y); } 771#endif 772 773#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 774 template<typename _Tp, typename _Up> 775 constexpr typename 776 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 777 && __is_arithmetic<_Up>::__value), bool>::__type 778 islessequal(_Tp __x, _Up __y) 779 { 780 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 781 return __builtin_islessequal(__type(__x), __type(__y)); 782 } 783#endif 784 785#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 786 constexpr bool 787 islessgreater(float __x, float __y) 788 { return __builtin_islessgreater(__x, __y); } 789 790 constexpr bool 791 islessgreater(double __x, double __y) 792 { return __builtin_islessgreater(__x, __y); } 793 794 constexpr bool 795 islessgreater(long double __x, long double __y) 796 { return __builtin_islessgreater(__x, __y); } 797#endif 798 799#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 800 template<typename _Tp, typename _Up> 801 constexpr typename 802 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 803 && __is_arithmetic<_Up>::__value), bool>::__type 804 islessgreater(_Tp __x, _Up __y) 805 { 806 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 807 return __builtin_islessgreater(__type(__x), __type(__y)); 808 } 809#endif 810 811#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 812 constexpr bool 813 isunordered(float __x, float __y) 814 { return __builtin_isunordered(__x, __y); } 815 816 constexpr bool 817 isunordered(double __x, double __y) 818 { return __builtin_isunordered(__x, __y); } 819 820 constexpr bool 821 isunordered(long double __x, long double __y) 822 { return __builtin_isunordered(__x, __y); } 823#endif 824 825#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 826 template<typename _Tp, typename _Up> 827 constexpr typename 828 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value 829 && __is_arithmetic<_Up>::__value), bool>::__type 830 isunordered(_Tp __x, _Up __y) 831 { 832 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 833 return __builtin_isunordered(__type(__x), __type(__y)); 834 } 835#endif 836 837#else 838 839 template<typename _Tp> 840 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 841 int>::__type 842 fpclassify(_Tp __f) 843 { 844 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 845 return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, 846 FP_SUBNORMAL, FP_ZERO, __type(__f)); 847 } 848 849 template<typename _Tp> 850 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 851 int>::__type 852 isfinite(_Tp __f) 853 { 854 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 855 return __builtin_isfinite(__type(__f)); 856 } 857 858 template<typename _Tp> 859 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 860 int>::__type 861 isinf(_Tp __f) 862 { 863 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 864 return __builtin_isinf(__type(__f)); 865 } 866 867 template<typename _Tp> 868 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 869 int>::__type 870 isnan(_Tp __f) 871 { 872 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 873 return __builtin_isnan(__type(__f)); 874 } 875 876 template<typename _Tp> 877 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 878 int>::__type 879 isnormal(_Tp __f) 880 { 881 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 882 return __builtin_isnormal(__type(__f)); 883 } 884 885 template<typename _Tp> 886 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 887 int>::__type 888 signbit(_Tp __f) 889 { 890 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 891 return __builtin_signbit(__type(__f)); 892 } 893 894 template<typename _Tp> 895 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 896 int>::__type 897 isgreater(_Tp __f1, _Tp __f2) 898 { 899 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 900 return __builtin_isgreater(__type(__f1), __type(__f2)); 901 } 902 903 template<typename _Tp> 904 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 905 int>::__type 906 isgreaterequal(_Tp __f1, _Tp __f2) 907 { 908 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 909 return __builtin_isgreaterequal(__type(__f1), __type(__f2)); 910 } 911 912 template<typename _Tp> 913 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 914 int>::__type 915 isless(_Tp __f1, _Tp __f2) 916 { 917 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 918 return __builtin_isless(__type(__f1), __type(__f2)); 919 } 920 921 template<typename _Tp> 922 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 923 int>::__type 924 islessequal(_Tp __f1, _Tp __f2) 925 { 926 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 927 return __builtin_islessequal(__type(__f1), __type(__f2)); 928 } 929 930 template<typename _Tp> 931 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 932 int>::__type 933 islessgreater(_Tp __f1, _Tp __f2) 934 { 935 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 936 return __builtin_islessgreater(__type(__f1), __type(__f2)); 937 } 938 939 template<typename _Tp> 940 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value, 941 int>::__type 942 isunordered(_Tp __f1, _Tp __f2) 943 { 944 typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 945 return __builtin_isunordered(__type(__f1), __type(__f2)); 946 } 947 948#endif // C++11 949#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */ 950#endif /* _GLIBCXX_USE_C99_MATH */ 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#ifndef _GLIBCXX_NO_C99_ROUNDING_FUNCS 1005#undef llrint 1006#undef llrintf 1007#undef llrintl 1008#undef llround 1009#undef llroundf 1010#undef llroundl 1011#endif 1012#undef log1p 1013#undef log1pf 1014#undef log1pl 1015#undef log2 1016#undef log2f 1017#undef log2l 1018#undef logb 1019#undef logbf 1020#undef logbl 1021#undef lrint 1022#undef lrintf 1023#undef lrintl 1024#undef lround 1025#undef lroundf 1026#undef lroundl 1027#undef nan 1028#undef nanf 1029#undef nanl 1030#undef nearbyint 1031#undef nearbyintf 1032#undef nearbyintl 1033#undef nextafter 1034#undef nextafterf 1035#undef nextafterl 1036#undef nexttoward 1037#undef nexttowardf 1038#undef nexttowardl 1039#undef remainder 1040#undef remainderf 1041#undef remainderl 1042#undef remquo 1043#undef remquof 1044#undef remquol 1045#undef rint 1046#undef rintf 1047#undef rintl 1048#undef round 1049#undef roundf 1050#undef roundl 1051#undef scalbln 1052#undef scalblnf 1053#undef scalblnl 1054#undef scalbn 1055#undef scalbnf 1056#undef scalbnl 1057#undef tgamma 1058#undef tgammaf 1059#undef tgammal 1060#undef trunc 1061#undef truncf 1062#undef truncl 1063 1064 // types 1065 using ::double_t; 1066 using ::float_t; 1067 1068 // functions 1069 using ::acosh; 1070 using ::acoshf; 1071 using ::acoshl; 1072 1073 using ::asinh; 1074 using ::asinhf; 1075 using ::asinhl; 1076 1077 using ::atanh; 1078 using ::atanhf; 1079 using ::atanhl; 1080 1081 using ::cbrt; 1082 using ::cbrtf; 1083 using ::cbrtl; 1084 1085 using ::copysign; 1086 using ::copysignf; 1087 using ::copysignl; 1088 1089 using ::erf; 1090 using ::erff; 1091 using ::erfl; 1092 1093 using ::erfc; 1094 using ::erfcf; 1095 using ::erfcl; 1096 1097 using ::exp2; 1098 using ::exp2f; 1099 using ::exp2l; 1100 1101 using ::expm1; 1102 using ::expm1f; 1103 using ::expm1l; 1104 1105 using ::fdim; 1106 using ::fdimf; 1107 using ::fdiml; 1108 1109 using ::fma; 1110 using ::fmaf; 1111 using ::fmal; 1112 1113 using ::fmax; 1114 using ::fmaxf; 1115 using ::fmaxl; 1116 1117 using ::fmin; 1118 using ::fminf; 1119 using ::fminl; 1120 1121 using ::hypot; 1122 using ::hypotf; 1123 using ::hypotl; 1124 1125 using ::ilogb; 1126 using ::ilogbf; 1127 using ::ilogbl; 1128 1129 using ::lgamma; 1130 using ::lgammaf; 1131 using ::lgammal; 1132 1133#ifndef _GLIBCXX_NO_C99_ROUNDING_FUNCS 1134 using ::llrint; 1135 using ::llrintf; 1136 using ::llrintl; 1137 1138 using ::llround; 1139 using ::llroundf; 1140 using ::llroundl; 1141#endif 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_FP 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#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1223 template<typename _Tp> 1224 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1225 double>::__type 1226 acosh(_Tp __x) 1227 { return __builtin_acosh(__x); } 1228#endif 1229 1230#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1231 constexpr float 1232 asinh(float __x) 1233 { return __builtin_asinhf(__x); } 1234 1235 constexpr long double 1236 asinh(long double __x) 1237 { return __builtin_asinhl(__x); } 1238#endif 1239 1240#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1241 template<typename _Tp> 1242 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1243 double>::__type 1244 asinh(_Tp __x) 1245 { return __builtin_asinh(__x); } 1246#endif 1247 1248#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1249 constexpr float 1250 atanh(float __x) 1251 { return __builtin_atanhf(__x); } 1252 1253 constexpr long double 1254 atanh(long double __x) 1255 { return __builtin_atanhl(__x); } 1256#endif 1257 1258#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1259 template<typename _Tp> 1260 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1261 double>::__type 1262 atanh(_Tp __x) 1263 { return __builtin_atanh(__x); } 1264#endif 1265 1266#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1267 constexpr float 1268 cbrt(float __x) 1269 { return __builtin_cbrtf(__x); } 1270 1271 constexpr long double 1272 cbrt(long double __x) 1273 { return __builtin_cbrtl(__x); } 1274#endif 1275 1276#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1277 template<typename _Tp> 1278 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1279 double>::__type 1280 cbrt(_Tp __x) 1281 { return __builtin_cbrt(__x); } 1282#endif 1283 1284#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1285 constexpr float 1286 copysign(float __x, float __y) 1287 { return __builtin_copysignf(__x, __y); } 1288 1289 constexpr long double 1290 copysign(long double __x, long double __y) 1291 { return __builtin_copysignl(__x, __y); } 1292#endif 1293 1294#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1295 template<typename _Tp, typename _Up> 1296 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1297 copysign(_Tp __x, _Up __y) 1298 { 1299 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1300 return copysign(__type(__x), __type(__y)); 1301 } 1302#endif 1303 1304#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1305 constexpr float 1306 erf(float __x) 1307 { return __builtin_erff(__x); } 1308 1309 constexpr long double 1310 erf(long double __x) 1311 { return __builtin_erfl(__x); } 1312#endif 1313 1314#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1315 template<typename _Tp> 1316 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1317 double>::__type 1318 erf(_Tp __x) 1319 { return __builtin_erf(__x); } 1320#endif 1321 1322#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1323 constexpr float 1324 erfc(float __x) 1325 { return __builtin_erfcf(__x); } 1326 1327 constexpr long double 1328 erfc(long double __x) 1329 { return __builtin_erfcl(__x); } 1330#endif 1331 1332#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1333 template<typename _Tp> 1334 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1335 double>::__type 1336 erfc(_Tp __x) 1337 { return __builtin_erfc(__x); } 1338#endif 1339 1340#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1341 constexpr float 1342 exp2(float __x) 1343 { return __builtin_exp2f(__x); } 1344 1345 constexpr long double 1346 exp2(long double __x) 1347 { return __builtin_exp2l(__x); } 1348#endif 1349 1350#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1351 template<typename _Tp> 1352 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1353 double>::__type 1354 exp2(_Tp __x) 1355 { return __builtin_exp2(__x); } 1356#endif 1357 1358#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1359 constexpr float 1360 expm1(float __x) 1361 { return __builtin_expm1f(__x); } 1362 1363 constexpr long double 1364 expm1(long double __x) 1365 { return __builtin_expm1l(__x); } 1366#endif 1367 1368#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1369 template<typename _Tp> 1370 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1371 double>::__type 1372 expm1(_Tp __x) 1373 { return __builtin_expm1(__x); } 1374#endif 1375 1376#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1377 constexpr float 1378 fdim(float __x, float __y) 1379 { return __builtin_fdimf(__x, __y); } 1380 1381 constexpr long double 1382 fdim(long double __x, long double __y) 1383 { return __builtin_fdiml(__x, __y); } 1384#endif 1385 1386#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1387 template<typename _Tp, typename _Up> 1388 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1389 fdim(_Tp __x, _Up __y) 1390 { 1391 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1392 return fdim(__type(__x), __type(__y)); 1393 } 1394#endif 1395 1396#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1397 constexpr float 1398 fma(float __x, float __y, float __z) 1399 { return __builtin_fmaf(__x, __y, __z); } 1400 1401 constexpr long double 1402 fma(long double __x, long double __y, long double __z) 1403 { return __builtin_fmal(__x, __y, __z); } 1404#endif 1405 1406#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1407 template<typename _Tp, typename _Up, typename _Vp> 1408 constexpr typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type 1409 fma(_Tp __x, _Up __y, _Vp __z) 1410 { 1411 typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type; 1412 return fma(__type(__x), __type(__y), __type(__z)); 1413 } 1414#endif 1415 1416#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1417 constexpr float 1418 fmax(float __x, float __y) 1419 { return __builtin_fmaxf(__x, __y); } 1420 1421 constexpr long double 1422 fmax(long double __x, long double __y) 1423 { return __builtin_fmaxl(__x, __y); } 1424#endif 1425 1426#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1427 template<typename _Tp, typename _Up> 1428 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1429 fmax(_Tp __x, _Up __y) 1430 { 1431 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1432 return fmax(__type(__x), __type(__y)); 1433 } 1434#endif 1435 1436#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1437 constexpr float 1438 fmin(float __x, float __y) 1439 { return __builtin_fminf(__x, __y); } 1440 1441 constexpr long double 1442 fmin(long double __x, long double __y) 1443 { return __builtin_fminl(__x, __y); } 1444#endif 1445 1446#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1447 template<typename _Tp, typename _Up> 1448 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1449 fmin(_Tp __x, _Up __y) 1450 { 1451 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1452 return fmin(__type(__x), __type(__y)); 1453 } 1454#endif 1455 1456#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1457 constexpr float 1458 hypot(float __x, float __y) 1459 { return __builtin_hypotf(__x, __y); } 1460 1461 constexpr long double 1462 hypot(long double __x, long double __y) 1463 { return __builtin_hypotl(__x, __y); } 1464#endif 1465 1466#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1467 template<typename _Tp, typename _Up> 1468 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1469 hypot(_Tp __x, _Up __y) 1470 { 1471 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1472 return hypot(__type(__x), __type(__y)); 1473 } 1474#endif 1475 1476#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1477 constexpr int 1478 ilogb(float __x) 1479 { return __builtin_ilogbf(__x); } 1480 1481 constexpr int 1482 ilogb(long double __x) 1483 { return __builtin_ilogbl(__x); } 1484#endif 1485 1486#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1487 template<typename _Tp> 1488 constexpr 1489 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1490 int>::__type 1491 ilogb(_Tp __x) 1492 { return __builtin_ilogb(__x); } 1493#endif 1494 1495#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1496 constexpr float 1497 lgamma(float __x) 1498 { return __builtin_lgammaf(__x); } 1499 1500 constexpr long double 1501 lgamma(long double __x) 1502 { return __builtin_lgammal(__x); } 1503#endif 1504 1505#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1506 template<typename _Tp> 1507 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1508 double>::__type 1509 lgamma(_Tp __x) 1510 { return __builtin_lgamma(__x); } 1511#endif 1512 1513#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1514 constexpr long long 1515 llrint(float __x) 1516 { return __builtin_llrintf(__x); } 1517 1518 constexpr long long 1519 llrint(long double __x) 1520 { return __builtin_llrintl(__x); } 1521#endif 1522 1523#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1524 template<typename _Tp> 1525 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1526 long long>::__type 1527 llrint(_Tp __x) 1528 { return __builtin_llrint(__x); } 1529#endif 1530 1531#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1532 constexpr long long 1533 llround(float __x) 1534 { return __builtin_llroundf(__x); } 1535 1536 constexpr long long 1537 llround(long double __x) 1538 { return __builtin_llroundl(__x); } 1539#endif 1540 1541#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1542 template<typename _Tp> 1543 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1544 long long>::__type 1545 llround(_Tp __x) 1546 { return __builtin_llround(__x); } 1547#endif 1548 1549#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1550 constexpr float 1551 log1p(float __x) 1552 { return __builtin_log1pf(__x); } 1553 1554 constexpr long double 1555 log1p(long double __x) 1556 { return __builtin_log1pl(__x); } 1557#endif 1558 1559#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1560 template<typename _Tp> 1561 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1562 double>::__type 1563 log1p(_Tp __x) 1564 { return __builtin_log1p(__x); } 1565#endif 1566 1567#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1568 // DR 568. 1569 constexpr float 1570 log2(float __x) 1571 { return __builtin_log2f(__x); } 1572 1573 constexpr long double 1574 log2(long double __x) 1575 { return __builtin_log2l(__x); } 1576#endif 1577 1578#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1579 template<typename _Tp> 1580 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1581 double>::__type 1582 log2(_Tp __x) 1583 { return __builtin_log2(__x); } 1584#endif 1585 1586#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1587 constexpr float 1588 logb(float __x) 1589 { return __builtin_logbf(__x); } 1590 1591 constexpr long double 1592 logb(long double __x) 1593 { return __builtin_logbl(__x); } 1594#endif 1595 1596#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1597 template<typename _Tp> 1598 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1599 double>::__type 1600 logb(_Tp __x) 1601 { return __builtin_logb(__x); } 1602#endif 1603 1604#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1605 constexpr long 1606 lrint(float __x) 1607 { return __builtin_lrintf(__x); } 1608 1609 constexpr long 1610 lrint(long double __x) 1611 { return __builtin_lrintl(__x); } 1612#endif 1613 1614#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1615 template<typename _Tp> 1616 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1617 long>::__type 1618 lrint(_Tp __x) 1619 { return __builtin_lrint(__x); } 1620#endif 1621 1622#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1623 constexpr long 1624 lround(float __x) 1625 { return __builtin_lroundf(__x); } 1626 1627 constexpr long 1628 lround(long double __x) 1629 { return __builtin_lroundl(__x); } 1630#endif 1631 1632#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1633 template<typename _Tp> 1634 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1635 long>::__type 1636 lround(_Tp __x) 1637 { return __builtin_lround(__x); } 1638#endif 1639 1640#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1641 constexpr float 1642 nearbyint(float __x) 1643 { return __builtin_nearbyintf(__x); } 1644 1645 constexpr long double 1646 nearbyint(long double __x) 1647 { return __builtin_nearbyintl(__x); } 1648#endif 1649 1650#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1651 template<typename _Tp> 1652 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1653 double>::__type 1654 nearbyint(_Tp __x) 1655 { return __builtin_nearbyint(__x); } 1656#endif 1657 1658#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1659 constexpr float 1660 nextafter(float __x, float __y) 1661 { return __builtin_nextafterf(__x, __y); } 1662 1663 constexpr long double 1664 nextafter(long double __x, long double __y) 1665 { return __builtin_nextafterl(__x, __y); } 1666#endif 1667 1668#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1669 template<typename _Tp, typename _Up> 1670 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1671 nextafter(_Tp __x, _Up __y) 1672 { 1673 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1674 return nextafter(__type(__x), __type(__y)); 1675 } 1676#endif 1677 1678#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1679 constexpr float 1680 nexttoward(float __x, long double __y) 1681 { return __builtin_nexttowardf(__x, __y); } 1682 1683 constexpr long double 1684 nexttoward(long double __x, long double __y) 1685 { return __builtin_nexttowardl(__x, __y); } 1686#endif 1687 1688#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1689 template<typename _Tp> 1690 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1691 double>::__type 1692 nexttoward(_Tp __x, long double __y) 1693 { return __builtin_nexttoward(__x, __y); } 1694#endif 1695 1696#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1697 constexpr float 1698 remainder(float __x, float __y) 1699 { return __builtin_remainderf(__x, __y); } 1700 1701 constexpr long double 1702 remainder(long double __x, long double __y) 1703 { return __builtin_remainderl(__x, __y); } 1704#endif 1705 1706#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1707 template<typename _Tp, typename _Up> 1708 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1709 remainder(_Tp __x, _Up __y) 1710 { 1711 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1712 return remainder(__type(__x), __type(__y)); 1713 } 1714#endif 1715 1716#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1717 inline float 1718 remquo(float __x, float __y, int* __pquo) 1719 { return __builtin_remquof(__x, __y, __pquo); } 1720 1721 inline long double 1722 remquo(long double __x, long double __y, int* __pquo) 1723 { return __builtin_remquol(__x, __y, __pquo); } 1724#endif 1725 1726#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1727 template<typename _Tp, typename _Up> 1728 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type 1729 remquo(_Tp __x, _Up __y, int* __pquo) 1730 { 1731 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1732 return remquo(__type(__x), __type(__y), __pquo); 1733 } 1734#endif 1735 1736#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1737 constexpr float 1738 rint(float __x) 1739 { return __builtin_rintf(__x); } 1740 1741 constexpr long double 1742 rint(long double __x) 1743 { return __builtin_rintl(__x); } 1744#endif 1745 1746#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1747 template<typename _Tp> 1748 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1749 double>::__type 1750 rint(_Tp __x) 1751 { return __builtin_rint(__x); } 1752#endif 1753 1754#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1755 constexpr float 1756 round(float __x) 1757 { return __builtin_roundf(__x); } 1758 1759 constexpr long double 1760 round(long double __x) 1761 { return __builtin_roundl(__x); } 1762#endif 1763 1764#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1765 template<typename _Tp> 1766 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1767 double>::__type 1768 round(_Tp __x) 1769 { return __builtin_round(__x); } 1770#endif 1771 1772#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1773 constexpr float 1774 scalbln(float __x, long __ex) 1775 { return __builtin_scalblnf(__x, __ex); } 1776 1777 constexpr long double 1778 scalbln(long double __x, long __ex) 1779 { return __builtin_scalblnl(__x, __ex); } 1780#endif 1781 1782#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1783 template<typename _Tp> 1784 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1785 double>::__type 1786 scalbln(_Tp __x, long __ex) 1787 { return __builtin_scalbln(__x, __ex); } 1788#endif 1789 1790#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1791 constexpr float 1792 scalbn(float __x, int __ex) 1793 { return __builtin_scalbnf(__x, __ex); } 1794 1795 constexpr long double 1796 scalbn(long double __x, int __ex) 1797 { return __builtin_scalbnl(__x, __ex); } 1798#endif 1799 1800#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1801 template<typename _Tp> 1802 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1803 double>::__type 1804 scalbn(_Tp __x, int __ex) 1805 { return __builtin_scalbn(__x, __ex); } 1806#endif 1807 1808#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1809 constexpr float 1810 tgamma(float __x) 1811 { return __builtin_tgammaf(__x); } 1812 1813 constexpr long double 1814 tgamma(long double __x) 1815 { return __builtin_tgammal(__x); } 1816#endif 1817 1818#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1819 template<typename _Tp> 1820 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1821 double>::__type 1822 tgamma(_Tp __x) 1823 { return __builtin_tgamma(__x); } 1824#endif 1825 1826#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1827 constexpr float 1828 trunc(float __x) 1829 { return __builtin_truncf(__x); } 1830 1831 constexpr long double 1832 trunc(long double __x) 1833 { return __builtin_truncl(__x); } 1834#endif 1835 1836#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1837 template<typename _Tp> 1838 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 1839 double>::__type 1840 trunc(_Tp __x) 1841 { return __builtin_trunc(__x); } 1842#endif 1843 1844#endif // _GLIBCXX_USE_C99_MATH_TR1 1845#endif // C++11 1846 1847#if __cplusplus >= 201703L 1848 1849 // [c.math.hypot3], three-dimensional hypotenuse 1850#define __cpp_lib_hypot 201603 1851 1852 template<typename _Tp> 1853 inline _Tp 1854 __hypot3(_Tp __x, _Tp __y, _Tp __z) 1855 { 1856 __x = std::abs(__x); 1857 __y = std::abs(__y); 1858 __z = std::abs(__z); 1859 if (_Tp __a = __x < __y ? __y < __z ? __z : __y : __x < __z ? __z : __x) 1860 return __a * std::sqrt((__x / __a) * (__x / __a) 1861 + (__y / __a) * (__y / __a) 1862 + (__z / __a) * (__z / __a)); 1863 else 1864 return {}; 1865 } 1866 1867 inline float 1868 hypot(float __x, float __y, float __z) 1869 { return std::__hypot3<float>(__x, __y, __z); } 1870 1871 inline double 1872 hypot(double __x, double __y, double __z) 1873 { return std::__hypot3<double>(__x, __y, __z); } 1874 1875 inline long double 1876 hypot(long double __x, long double __y, long double __z) 1877 { return std::__hypot3<long double>(__x, __y, __z); } 1878 1879 template<typename _Tp, typename _Up, typename _Vp> 1880 __gnu_cxx::__promoted_t<_Tp, _Up, _Vp> 1881 hypot(_Tp __x, _Up __y, _Vp __z) 1882 { 1883 using __type = __gnu_cxx::__promoted_t<_Tp, _Up, _Vp>; 1884 return std::__hypot3<__type>(__x, __y, __z); 1885 } 1886#endif // C++17 1887 1888#if __cplusplus >= 202002L 1889 // linear interpolation 1890# define __cpp_lib_interpolate 201902L 1891 1892 template<typename _Fp> 1893 constexpr _Fp 1894 __lerp(_Fp __a, _Fp __b, _Fp __t) noexcept 1895 { 1896 if ((__a <= 0 && __b >= 0) || (__a >= 0 && __b <= 0)) 1897 return __t * __b + (1 - __t) * __a; 1898 1899 if (__t == 1) 1900 return __b; // exact 1901 1902 // Exact at __t=0, monotonic except near __t=1, 1903 // bounded, determinate, and consistent: 1904 const _Fp __x = __a + __t * (__b - __a); 1905 return (__t > 1) == (__b > __a) 1906 ? (__b < __x ? __x : __b) 1907 : (__b > __x ? __x : __b); // monotonic near __t=1 1908 } 1909 1910 constexpr float 1911 lerp(float __a, float __b, float __t) noexcept 1912 { return std::__lerp(__a, __b, __t); } 1913 1914 constexpr double 1915 lerp(double __a, double __b, double __t) noexcept 1916 { return std::__lerp(__a, __b, __t); } 1917 1918 constexpr long double 1919 lerp(long double __a, long double __b, long double __t) noexcept 1920 { return std::__lerp(__a, __b, __t); } 1921 1922 template<typename _Tp, typename _Up, typename _Vp> 1923 constexpr __gnu_cxx::__promoted_t<_Tp, _Up, _Vp> 1924 lerp(_Tp __x, _Up __y, _Vp __z) noexcept 1925 { 1926 using __type = __gnu_cxx::__promoted_t<_Tp, _Up, _Vp>; 1927 return std::__lerp<__type>(__x, __y, __z); 1928 } 1929#endif // C++20 1930 1931_GLIBCXX_END_NAMESPACE_VERSION 1932} // namespace 1933 1934#if _GLIBCXX_USE_STD_SPEC_FUNCS 1935# include <bits/specfun.h> 1936#endif 1937 1938} // extern "C++" 1939 1940#endif 1941