1 // -*- C++ -*- 2 //===---------------------------- math.h ----------------------------------===// 3 // 4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 // See https://llvm.org/LICENSE.txt for license information. 6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef _LIBCPP_MATH_H 11 #define _LIBCPP_MATH_H 12 13 /* 14 math.h synopsis 15 16 Macros: 17 18 HUGE_VAL 19 HUGE_VALF // C99 20 HUGE_VALL // C99 21 INFINITY // C99 22 NAN // C99 23 FP_INFINITE // C99 24 FP_NAN // C99 25 FP_NORMAL // C99 26 FP_SUBNORMAL // C99 27 FP_ZERO // C99 28 FP_FAST_FMA // C99 29 FP_FAST_FMAF // C99 30 FP_FAST_FMAL // C99 31 FP_ILOGB0 // C99 32 FP_ILOGBNAN // C99 33 MATH_ERRNO // C99 34 MATH_ERREXCEPT // C99 35 math_errhandling // C99 36 37 Types: 38 39 float_t // C99 40 double_t // C99 41 42 // C90 43 44 floating_point abs(floating_point x); 45 46 floating_point acos (arithmetic x); 47 float acosf(float x); 48 long double acosl(long double x); 49 50 floating_point asin (arithmetic x); 51 float asinf(float x); 52 long double asinl(long double x); 53 54 floating_point atan (arithmetic x); 55 float atanf(float x); 56 long double atanl(long double x); 57 58 floating_point atan2 (arithmetic y, arithmetic x); 59 float atan2f(float y, float x); 60 long double atan2l(long double y, long double x); 61 62 floating_point ceil (arithmetic x); 63 float ceilf(float x); 64 long double ceill(long double x); 65 66 floating_point cos (arithmetic x); 67 float cosf(float x); 68 long double cosl(long double x); 69 70 floating_point cosh (arithmetic x); 71 float coshf(float x); 72 long double coshl(long double x); 73 74 floating_point exp (arithmetic x); 75 float expf(float x); 76 long double expl(long double x); 77 78 floating_point fabs (arithmetic x); 79 float fabsf(float x); 80 long double fabsl(long double x); 81 82 floating_point floor (arithmetic x); 83 float floorf(float x); 84 long double floorl(long double x); 85 86 floating_point fmod (arithmetic x, arithmetic y); 87 float fmodf(float x, float y); 88 long double fmodl(long double x, long double y); 89 90 floating_point frexp (arithmetic value, int* exp); 91 float frexpf(float value, int* exp); 92 long double frexpl(long double value, int* exp); 93 94 floating_point ldexp (arithmetic value, int exp); 95 float ldexpf(float value, int exp); 96 long double ldexpl(long double value, int exp); 97 98 floating_point log (arithmetic x); 99 float logf(float x); 100 long double logl(long double x); 101 102 floating_point log10 (arithmetic x); 103 float log10f(float x); 104 long double log10l(long double x); 105 106 floating_point modf (floating_point value, floating_point* iptr); 107 float modff(float value, float* iptr); 108 long double modfl(long double value, long double* iptr); 109 110 floating_point pow (arithmetic x, arithmetic y); 111 float powf(float x, float y); 112 long double powl(long double x, long double y); 113 114 floating_point sin (arithmetic x); 115 float sinf(float x); 116 long double sinl(long double x); 117 118 floating_point sinh (arithmetic x); 119 float sinhf(float x); 120 long double sinhl(long double x); 121 122 floating_point sqrt (arithmetic x); 123 float sqrtf(float x); 124 long double sqrtl(long double x); 125 126 floating_point tan (arithmetic x); 127 float tanf(float x); 128 long double tanl(long double x); 129 130 floating_point tanh (arithmetic x); 131 float tanhf(float x); 132 long double tanhl(long double x); 133 134 // C99 135 136 bool signbit(arithmetic x); 137 138 int fpclassify(arithmetic x); 139 140 bool isfinite(arithmetic x); 141 bool isinf(arithmetic x); 142 bool isnan(arithmetic x); 143 bool isnormal(arithmetic x); 144 145 bool isgreater(arithmetic x, arithmetic y); 146 bool isgreaterequal(arithmetic x, arithmetic y); 147 bool isless(arithmetic x, arithmetic y); 148 bool islessequal(arithmetic x, arithmetic y); 149 bool islessgreater(arithmetic x, arithmetic y); 150 bool isunordered(arithmetic x, arithmetic y); 151 152 floating_point acosh (arithmetic x); 153 float acoshf(float x); 154 long double acoshl(long double x); 155 156 floating_point asinh (arithmetic x); 157 float asinhf(float x); 158 long double asinhl(long double x); 159 160 floating_point atanh (arithmetic x); 161 float atanhf(float x); 162 long double atanhl(long double x); 163 164 floating_point cbrt (arithmetic x); 165 float cbrtf(float x); 166 long double cbrtl(long double x); 167 168 floating_point copysign (arithmetic x, arithmetic y); 169 float copysignf(float x, float y); 170 long double copysignl(long double x, long double y); 171 172 floating_point erf (arithmetic x); 173 float erff(float x); 174 long double erfl(long double x); 175 176 floating_point erfc (arithmetic x); 177 float erfcf(float x); 178 long double erfcl(long double x); 179 180 floating_point exp2 (arithmetic x); 181 float exp2f(float x); 182 long double exp2l(long double x); 183 184 floating_point expm1 (arithmetic x); 185 float expm1f(float x); 186 long double expm1l(long double x); 187 188 floating_point fdim (arithmetic x, arithmetic y); 189 float fdimf(float x, float y); 190 long double fdiml(long double x, long double y); 191 192 floating_point fma (arithmetic x, arithmetic y, arithmetic z); 193 float fmaf(float x, float y, float z); 194 long double fmal(long double x, long double y, long double z); 195 196 floating_point fmax (arithmetic x, arithmetic y); 197 float fmaxf(float x, float y); 198 long double fmaxl(long double x, long double y); 199 200 floating_point fmin (arithmetic x, arithmetic y); 201 float fminf(float x, float y); 202 long double fminl(long double x, long double y); 203 204 floating_point hypot (arithmetic x, arithmetic y); 205 float hypotf(float x, float y); 206 long double hypotl(long double x, long double y); 207 208 int ilogb (arithmetic x); 209 int ilogbf(float x); 210 int ilogbl(long double x); 211 212 floating_point lgamma (arithmetic x); 213 float lgammaf(float x); 214 long double lgammal(long double x); 215 216 long long llrint (arithmetic x); 217 long long llrintf(float x); 218 long long llrintl(long double x); 219 220 long long llround (arithmetic x); 221 long long llroundf(float x); 222 long long llroundl(long double x); 223 224 floating_point log1p (arithmetic x); 225 float log1pf(float x); 226 long double log1pl(long double x); 227 228 floating_point log2 (arithmetic x); 229 float log2f(float x); 230 long double log2l(long double x); 231 232 floating_point logb (arithmetic x); 233 float logbf(float x); 234 long double logbl(long double x); 235 236 long lrint (arithmetic x); 237 long lrintf(float x); 238 long lrintl(long double x); 239 240 long lround (arithmetic x); 241 long lroundf(float x); 242 long lroundl(long double x); 243 244 double nan (const char* str); 245 float nanf(const char* str); 246 long double nanl(const char* str); 247 248 floating_point nearbyint (arithmetic x); 249 float nearbyintf(float x); 250 long double nearbyintl(long double x); 251 252 floating_point nextafter (arithmetic x, arithmetic y); 253 float nextafterf(float x, float y); 254 long double nextafterl(long double x, long double y); 255 256 floating_point nexttoward (arithmetic x, long double y); 257 float nexttowardf(float x, long double y); 258 long double nexttowardl(long double x, long double y); 259 260 floating_point remainder (arithmetic x, arithmetic y); 261 float remainderf(float x, float y); 262 long double remainderl(long double x, long double y); 263 264 floating_point remquo (arithmetic x, arithmetic y, int* pquo); 265 float remquof(float x, float y, int* pquo); 266 long double remquol(long double x, long double y, int* pquo); 267 268 floating_point rint (arithmetic x); 269 float rintf(float x); 270 long double rintl(long double x); 271 272 floating_point round (arithmetic x); 273 float roundf(float x); 274 long double roundl(long double x); 275 276 floating_point scalbln (arithmetic x, long ex); 277 float scalblnf(float x, long ex); 278 long double scalblnl(long double x, long ex); 279 280 floating_point scalbn (arithmetic x, int ex); 281 float scalbnf(float x, int ex); 282 long double scalbnl(long double x, int ex); 283 284 floating_point tgamma (arithmetic x); 285 float tgammaf(float x); 286 long double tgammal(long double x); 287 288 floating_point trunc (arithmetic x); 289 float truncf(float x); 290 long double truncl(long double x); 291 292 */ 293 294 #include <__config> 295 296 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 297 #pragma GCC system_header 298 #endif 299 300 #define _LIBCPP_STDLIB_INCLUDE_NEXT 301 #include <stdlib.h> 302 303 #include_next <math.h> 304 305 #ifdef __cplusplus 306 307 // We support including .h headers inside 'extern "C"' contexts, so switch 308 // back to C++ linkage before including these C++ headers. 309 extern "C++" { 310 311 #include <type_traits> 312 #include <limits> 313 314 // signbit 315 316 #ifdef signbit 317 318 template <class _A1> 319 _LIBCPP_INLINE_VISIBILITY 320 bool 321 __libcpp_signbit(_A1 __lcpp_x) _NOEXCEPT 322 { 323 return signbit(__lcpp_x); 324 } 325 326 #undef signbit 327 328 template <class _A1> 329 inline _LIBCPP_INLINE_VISIBILITY 330 typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type 331 signbit(_A1 __lcpp_x) _NOEXCEPT 332 { 333 return __libcpp_signbit((typename std::__promote<_A1>::type)__lcpp_x); 334 } 335 336 template <class _A1> 337 inline _LIBCPP_INLINE_VISIBILITY 338 typename std::enable_if< 339 std::is_integral<_A1>::value && std::is_signed<_A1>::value, bool>::type 340 signbit(_A1 __lcpp_x) _NOEXCEPT 341 { return __lcpp_x < 0; } 342 343 template <class _A1> 344 inline _LIBCPP_INLINE_VISIBILITY 345 typename std::enable_if< 346 std::is_integral<_A1>::value && !std::is_signed<_A1>::value, bool>::type 347 signbit(_A1) _NOEXCEPT 348 { return false; } 349 350 #elif defined(_LIBCPP_MSVCRT) 351 352 template <typename _A1> 353 inline _LIBCPP_INLINE_VISIBILITY 354 typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type 355 signbit(_A1 __lcpp_x) _NOEXCEPT 356 { 357 return ::signbit(static_cast<typename std::__promote<_A1>::type>(__lcpp_x)); 358 } 359 360 template <class _A1> 361 inline _LIBCPP_INLINE_VISIBILITY 362 typename std::enable_if< 363 std::is_integral<_A1>::value && std::is_signed<_A1>::value, bool>::type 364 signbit(_A1 __lcpp_x) _NOEXCEPT 365 { return __lcpp_x < 0; } 366 367 template <class _A1> 368 inline _LIBCPP_INLINE_VISIBILITY 369 typename std::enable_if< 370 std::is_integral<_A1>::value && !std::is_signed<_A1>::value, bool>::type 371 signbit(_A1) _NOEXCEPT 372 { return false; } 373 374 #endif // signbit 375 376 // fpclassify 377 378 #ifdef fpclassify 379 380 template <class _A1> 381 _LIBCPP_INLINE_VISIBILITY 382 int 383 __libcpp_fpclassify(_A1 __lcpp_x) _NOEXCEPT 384 { 385 return fpclassify(__lcpp_x); 386 } 387 388 #undef fpclassify 389 390 template <class _A1> 391 inline _LIBCPP_INLINE_VISIBILITY 392 typename std::enable_if<std::is_floating_point<_A1>::value, int>::type 393 fpclassify(_A1 __lcpp_x) _NOEXCEPT 394 { 395 return __libcpp_fpclassify((typename std::__promote<_A1>::type)__lcpp_x); 396 } 397 398 template <class _A1> 399 inline _LIBCPP_INLINE_VISIBILITY 400 typename std::enable_if<std::is_integral<_A1>::value, int>::type 401 fpclassify(_A1 __lcpp_x) _NOEXCEPT 402 { return __lcpp_x == 0 ? FP_ZERO : FP_NORMAL; } 403 404 #elif defined(_LIBCPP_MSVCRT) 405 406 template <typename _A1> 407 inline _LIBCPP_INLINE_VISIBILITY 408 typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type 409 fpclassify(_A1 __lcpp_x) _NOEXCEPT 410 { 411 return ::fpclassify(static_cast<typename std::__promote<_A1>::type>(__lcpp_x)); 412 } 413 414 template <class _A1> 415 inline _LIBCPP_INLINE_VISIBILITY 416 typename std::enable_if<std::is_integral<_A1>::value, int>::type 417 fpclassify(_A1 __lcpp_x) _NOEXCEPT 418 { return __lcpp_x == 0 ? FP_ZERO : FP_NORMAL; } 419 420 #endif // fpclassify 421 422 // isfinite 423 424 #ifdef isfinite 425 426 template <class _A1> 427 _LIBCPP_INLINE_VISIBILITY 428 bool 429 __libcpp_isfinite(_A1 __lcpp_x) _NOEXCEPT 430 { 431 return isfinite(__lcpp_x); 432 } 433 434 #undef isfinite 435 436 template <class _A1> 437 inline _LIBCPP_INLINE_VISIBILITY 438 typename std::enable_if< 439 std::is_arithmetic<_A1>::value && std::numeric_limits<_A1>::has_infinity, 440 bool>::type 441 isfinite(_A1 __lcpp_x) _NOEXCEPT 442 { 443 return __libcpp_isfinite((typename std::__promote<_A1>::type)__lcpp_x); 444 } 445 446 template <class _A1> 447 inline _LIBCPP_INLINE_VISIBILITY 448 typename std::enable_if< 449 std::is_arithmetic<_A1>::value && !std::numeric_limits<_A1>::has_infinity, 450 bool>::type 451 isfinite(_A1) _NOEXCEPT 452 { return true; } 453 454 #endif // isfinite 455 456 // isinf 457 458 #ifdef isinf 459 460 template <class _A1> 461 _LIBCPP_INLINE_VISIBILITY 462 bool 463 __libcpp_isinf(_A1 __lcpp_x) _NOEXCEPT 464 { 465 return isinf(__lcpp_x); 466 } 467 468 #undef isinf 469 470 template <class _A1> 471 inline _LIBCPP_INLINE_VISIBILITY 472 typename std::enable_if< 473 std::is_arithmetic<_A1>::value && std::numeric_limits<_A1>::has_infinity, 474 bool>::type 475 isinf(_A1 __lcpp_x) _NOEXCEPT 476 { 477 return __libcpp_isinf((typename std::__promote<_A1>::type)__lcpp_x); 478 } 479 480 template <class _A1> 481 inline _LIBCPP_INLINE_VISIBILITY 482 typename std::enable_if< 483 std::is_arithmetic<_A1>::value && !std::numeric_limits<_A1>::has_infinity, 484 bool>::type 485 isinf(_A1) _NOEXCEPT 486 { return false; } 487 488 #ifdef _LIBCPP_PREFERRED_OVERLOAD 489 inline _LIBCPP_INLINE_VISIBILITY 490 bool 491 isinf(float __lcpp_x) _NOEXCEPT { return __libcpp_isinf(__lcpp_x); } 492 493 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD 494 bool 495 isinf(double __lcpp_x) _NOEXCEPT { return __libcpp_isinf(__lcpp_x); } 496 497 inline _LIBCPP_INLINE_VISIBILITY 498 bool 499 isinf(long double __lcpp_x) _NOEXCEPT { return __libcpp_isinf(__lcpp_x); } 500 #endif 501 502 #endif // isinf 503 504 // isnan 505 506 #ifdef isnan 507 508 template <class _A1> 509 _LIBCPP_INLINE_VISIBILITY 510 bool 511 __libcpp_isnan(_A1 __lcpp_x) _NOEXCEPT 512 { 513 return isnan(__lcpp_x); 514 } 515 516 #undef isnan 517 518 template <class _A1> 519 inline _LIBCPP_INLINE_VISIBILITY 520 typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type 521 isnan(_A1 __lcpp_x) _NOEXCEPT 522 { 523 return __libcpp_isnan((typename std::__promote<_A1>::type)__lcpp_x); 524 } 525 526 template <class _A1> 527 inline _LIBCPP_INLINE_VISIBILITY 528 typename std::enable_if<std::is_integral<_A1>::value, bool>::type 529 isnan(_A1) _NOEXCEPT 530 { return false; } 531 532 #ifdef _LIBCPP_PREFERRED_OVERLOAD 533 inline _LIBCPP_INLINE_VISIBILITY 534 bool 535 isnan(float __lcpp_x) _NOEXCEPT { return __libcpp_isnan(__lcpp_x); } 536 537 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD 538 bool 539 isnan(double __lcpp_x) _NOEXCEPT { return __libcpp_isnan(__lcpp_x); } 540 541 inline _LIBCPP_INLINE_VISIBILITY 542 bool 543 isnan(long double __lcpp_x) _NOEXCEPT { return __libcpp_isnan(__lcpp_x); } 544 #endif 545 546 #endif // isnan 547 548 // isnormal 549 550 #ifdef isnormal 551 552 template <class _A1> 553 _LIBCPP_INLINE_VISIBILITY 554 bool 555 __libcpp_isnormal(_A1 __lcpp_x) _NOEXCEPT 556 { 557 return isnormal(__lcpp_x); 558 } 559 560 #undef isnormal 561 562 template <class _A1> 563 inline _LIBCPP_INLINE_VISIBILITY 564 typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type 565 isnormal(_A1 __lcpp_x) _NOEXCEPT 566 { 567 return __libcpp_isnormal((typename std::__promote<_A1>::type)__lcpp_x); 568 } 569 570 template <class _A1> 571 inline _LIBCPP_INLINE_VISIBILITY 572 typename std::enable_if<std::is_integral<_A1>::value, bool>::type 573 isnormal(_A1 __lcpp_x) _NOEXCEPT 574 { return __lcpp_x != 0; } 575 576 #endif // isnormal 577 578 // isgreater 579 580 #ifdef isgreater 581 582 template <class _A1, class _A2> 583 _LIBCPP_INLINE_VISIBILITY 584 bool 585 __libcpp_isgreater(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 586 { 587 return isgreater(__lcpp_x, __lcpp_y); 588 } 589 590 #undef isgreater 591 592 template <class _A1, class _A2> 593 inline _LIBCPP_INLINE_VISIBILITY 594 typename std::enable_if 595 < 596 std::is_arithmetic<_A1>::value && 597 std::is_arithmetic<_A2>::value, 598 bool 599 >::type 600 isgreater(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 601 { 602 typedef typename std::__promote<_A1, _A2>::type type; 603 return __libcpp_isgreater((type)__lcpp_x, (type)__lcpp_y); 604 } 605 606 #endif // isgreater 607 608 // isgreaterequal 609 610 #ifdef isgreaterequal 611 612 template <class _A1, class _A2> 613 _LIBCPP_INLINE_VISIBILITY 614 bool 615 __libcpp_isgreaterequal(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 616 { 617 return isgreaterequal(__lcpp_x, __lcpp_y); 618 } 619 620 #undef isgreaterequal 621 622 template <class _A1, class _A2> 623 inline _LIBCPP_INLINE_VISIBILITY 624 typename std::enable_if 625 < 626 std::is_arithmetic<_A1>::value && 627 std::is_arithmetic<_A2>::value, 628 bool 629 >::type 630 isgreaterequal(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 631 { 632 typedef typename std::__promote<_A1, _A2>::type type; 633 return __libcpp_isgreaterequal((type)__lcpp_x, (type)__lcpp_y); 634 } 635 636 #endif // isgreaterequal 637 638 // isless 639 640 #ifdef isless 641 642 template <class _A1, class _A2> 643 _LIBCPP_INLINE_VISIBILITY 644 bool 645 __libcpp_isless(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 646 { 647 return isless(__lcpp_x, __lcpp_y); 648 } 649 650 #undef isless 651 652 template <class _A1, class _A2> 653 inline _LIBCPP_INLINE_VISIBILITY 654 typename std::enable_if 655 < 656 std::is_arithmetic<_A1>::value && 657 std::is_arithmetic<_A2>::value, 658 bool 659 >::type 660 isless(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 661 { 662 typedef typename std::__promote<_A1, _A2>::type type; 663 return __libcpp_isless((type)__lcpp_x, (type)__lcpp_y); 664 } 665 666 #endif // isless 667 668 // islessequal 669 670 #ifdef islessequal 671 672 template <class _A1, class _A2> 673 _LIBCPP_INLINE_VISIBILITY 674 bool 675 __libcpp_islessequal(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 676 { 677 return islessequal(__lcpp_x, __lcpp_y); 678 } 679 680 #undef islessequal 681 682 template <class _A1, class _A2> 683 inline _LIBCPP_INLINE_VISIBILITY 684 typename std::enable_if 685 < 686 std::is_arithmetic<_A1>::value && 687 std::is_arithmetic<_A2>::value, 688 bool 689 >::type 690 islessequal(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 691 { 692 typedef typename std::__promote<_A1, _A2>::type type; 693 return __libcpp_islessequal((type)__lcpp_x, (type)__lcpp_y); 694 } 695 696 #endif // islessequal 697 698 // islessgreater 699 700 #ifdef islessgreater 701 702 template <class _A1, class _A2> 703 _LIBCPP_INLINE_VISIBILITY 704 bool 705 __libcpp_islessgreater(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 706 { 707 return islessgreater(__lcpp_x, __lcpp_y); 708 } 709 710 #undef islessgreater 711 712 template <class _A1, class _A2> 713 inline _LIBCPP_INLINE_VISIBILITY 714 typename std::enable_if 715 < 716 std::is_arithmetic<_A1>::value && 717 std::is_arithmetic<_A2>::value, 718 bool 719 >::type 720 islessgreater(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 721 { 722 typedef typename std::__promote<_A1, _A2>::type type; 723 return __libcpp_islessgreater((type)__lcpp_x, (type)__lcpp_y); 724 } 725 726 #endif // islessgreater 727 728 // isunordered 729 730 #ifdef isunordered 731 732 template <class _A1, class _A2> 733 _LIBCPP_INLINE_VISIBILITY 734 bool 735 __libcpp_isunordered(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 736 { 737 return isunordered(__lcpp_x, __lcpp_y); 738 } 739 740 #undef isunordered 741 742 template <class _A1, class _A2> 743 inline _LIBCPP_INLINE_VISIBILITY 744 typename std::enable_if 745 < 746 std::is_arithmetic<_A1>::value && 747 std::is_arithmetic<_A2>::value, 748 bool 749 >::type 750 isunordered(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 751 { 752 typedef typename std::__promote<_A1, _A2>::type type; 753 return __libcpp_isunordered((type)__lcpp_x, (type)__lcpp_y); 754 } 755 756 #endif // isunordered 757 758 // abs 759 760 #undef abs 761 #undef labs 762 #ifndef _LIBCPP_HAS_NO_LONG_LONG 763 #undef llabs 764 #endif 765 766 // MSVCRT already has the correct prototype in <stdlib.h> if __cplusplus is defined 767 #if !defined(_LIBCPP_MSVCRT) && !defined(__sun__) && !defined(_AIX) 768 inline _LIBCPP_INLINE_VISIBILITY long abs(long __x) _NOEXCEPT { 769 return ::labs(__x); 770 } 771 #ifndef _LIBCPP_HAS_NO_LONG_LONG 772 inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) _NOEXCEPT { 773 return ::llabs(__x); 774 } 775 #endif // _LIBCPP_HAS_NO_LONG_LONG 776 #endif // !defined(_LIBCPP_MSVCRT) && !defined(__sun__) && !defined(_AIX) 777 778 779 #if !(defined(_AIX) || defined(__sun__)) 780 inline _LIBCPP_INLINE_VISIBILITY float abs(float __lcpp_x) _NOEXCEPT { 781 return ::fabsf(__lcpp_x); 782 } 783 784 inline _LIBCPP_INLINE_VISIBILITY double abs(double __lcpp_x) _NOEXCEPT { 785 return ::fabs(__lcpp_x); 786 } 787 788 inline _LIBCPP_INLINE_VISIBILITY long double 789 abs(long double __lcpp_x) _NOEXCEPT { 790 return ::fabsl(__lcpp_x); 791 } 792 #endif // !(defined(_AIX) || defined(__sun__)) 793 794 // div 795 796 #undef div 797 #undef ldiv 798 #ifndef _LIBCPP_HAS_NO_LONG_LONG 799 #undef lldiv 800 #endif 801 802 // MSVCRT already has the correct prototype in <stdlib.h> if __cplusplus is defined 803 #if !defined(_LIBCPP_MSVCRT) && !defined(__sun__) && !defined(_AIX) 804 inline _LIBCPP_INLINE_VISIBILITY ldiv_t div(long __x, long __y) _NOEXCEPT { 805 return ::ldiv(__x, __y); 806 } 807 #ifndef _LIBCPP_HAS_NO_LONG_LONG 808 inline _LIBCPP_INLINE_VISIBILITY lldiv_t div(long long __x, 809 long long __y) _NOEXCEPT { 810 return ::lldiv(__x, __y); 811 } 812 #endif // _LIBCPP_HAS_NO_LONG_LONG 813 #endif // _LIBCPP_MSVCRT / __sun__ / _AIX 814 815 // acos 816 817 #if !(defined(_AIX) || defined(__sun__)) 818 inline _LIBCPP_INLINE_VISIBILITY float acos(float __lcpp_x) _NOEXCEPT {return ::acosf(__lcpp_x);} 819 inline _LIBCPP_INLINE_VISIBILITY long double acos(long double __lcpp_x) _NOEXCEPT {return ::acosl(__lcpp_x);} 820 #endif 821 822 template <class _A1> 823 inline _LIBCPP_INLINE_VISIBILITY 824 typename std::enable_if<std::is_integral<_A1>::value, double>::type 825 acos(_A1 __lcpp_x) _NOEXCEPT {return ::acos((double)__lcpp_x);} 826 827 // asin 828 829 #if !(defined(_AIX) || defined(__sun__)) 830 inline _LIBCPP_INLINE_VISIBILITY float asin(float __lcpp_x) _NOEXCEPT {return ::asinf(__lcpp_x);} 831 inline _LIBCPP_INLINE_VISIBILITY long double asin(long double __lcpp_x) _NOEXCEPT {return ::asinl(__lcpp_x);} 832 #endif 833 834 template <class _A1> 835 inline _LIBCPP_INLINE_VISIBILITY 836 typename std::enable_if<std::is_integral<_A1>::value, double>::type 837 asin(_A1 __lcpp_x) _NOEXCEPT {return ::asin((double)__lcpp_x);} 838 839 // atan 840 841 #if !(defined(_AIX) || defined(__sun__)) 842 inline _LIBCPP_INLINE_VISIBILITY float atan(float __lcpp_x) _NOEXCEPT {return ::atanf(__lcpp_x);} 843 inline _LIBCPP_INLINE_VISIBILITY long double atan(long double __lcpp_x) _NOEXCEPT {return ::atanl(__lcpp_x);} 844 #endif 845 846 template <class _A1> 847 inline _LIBCPP_INLINE_VISIBILITY 848 typename std::enable_if<std::is_integral<_A1>::value, double>::type 849 atan(_A1 __lcpp_x) _NOEXCEPT {return ::atan((double)__lcpp_x);} 850 851 // atan2 852 853 #if !(defined(_AIX) || defined(__sun__)) 854 inline _LIBCPP_INLINE_VISIBILITY float atan2(float __lcpp_y, float __lcpp_x) _NOEXCEPT {return ::atan2f(__lcpp_y, __lcpp_x);} 855 inline _LIBCPP_INLINE_VISIBILITY long double atan2(long double __lcpp_y, long double __lcpp_x) _NOEXCEPT {return ::atan2l(__lcpp_y, __lcpp_x);} 856 #endif 857 858 template <class _A1, class _A2> 859 inline _LIBCPP_INLINE_VISIBILITY 860 typename std::_EnableIf 861 < 862 std::is_arithmetic<_A1>::value && 863 std::is_arithmetic<_A2>::value, 864 std::__promote<_A1, _A2> 865 >::type 866 atan2(_A1 __lcpp_y, _A2 __lcpp_x) _NOEXCEPT 867 { 868 typedef typename std::__promote<_A1, _A2>::type __result_type; 869 static_assert((!(std::_IsSame<_A1, __result_type>::value && 870 std::_IsSame<_A2, __result_type>::value)), ""); 871 return ::atan2((__result_type)__lcpp_y, (__result_type)__lcpp_x); 872 } 873 874 // ceil 875 876 #if !(defined(_AIX) || defined(__sun__)) 877 inline _LIBCPP_INLINE_VISIBILITY float ceil(float __lcpp_x) _NOEXCEPT {return ::ceilf(__lcpp_x);} 878 inline _LIBCPP_INLINE_VISIBILITY long double ceil(long double __lcpp_x) _NOEXCEPT {return ::ceill(__lcpp_x);} 879 #endif 880 881 template <class _A1> 882 inline _LIBCPP_INLINE_VISIBILITY 883 typename std::enable_if<std::is_integral<_A1>::value, double>::type 884 ceil(_A1 __lcpp_x) _NOEXCEPT {return ::ceil((double)__lcpp_x);} 885 886 // cos 887 888 #if !(defined(_AIX) || defined(__sun__)) 889 inline _LIBCPP_INLINE_VISIBILITY float cos(float __lcpp_x) _NOEXCEPT {return ::cosf(__lcpp_x);} 890 inline _LIBCPP_INLINE_VISIBILITY long double cos(long double __lcpp_x) _NOEXCEPT {return ::cosl(__lcpp_x);} 891 #endif 892 893 template <class _A1> 894 inline _LIBCPP_INLINE_VISIBILITY 895 typename std::enable_if<std::is_integral<_A1>::value, double>::type 896 cos(_A1 __lcpp_x) _NOEXCEPT {return ::cos((double)__lcpp_x);} 897 898 // cosh 899 900 #if !(defined(_AIX) || defined(__sun__)) 901 inline _LIBCPP_INLINE_VISIBILITY float cosh(float __lcpp_x) _NOEXCEPT {return ::coshf(__lcpp_x);} 902 inline _LIBCPP_INLINE_VISIBILITY long double cosh(long double __lcpp_x) _NOEXCEPT {return ::coshl(__lcpp_x);} 903 #endif 904 905 template <class _A1> 906 inline _LIBCPP_INLINE_VISIBILITY 907 typename std::enable_if<std::is_integral<_A1>::value, double>::type 908 cosh(_A1 __lcpp_x) _NOEXCEPT {return ::cosh((double)__lcpp_x);} 909 910 // exp 911 912 #if !(defined(_AIX) || defined(__sun__)) 913 inline _LIBCPP_INLINE_VISIBILITY float exp(float __lcpp_x) _NOEXCEPT {return ::expf(__lcpp_x);} 914 inline _LIBCPP_INLINE_VISIBILITY long double exp(long double __lcpp_x) _NOEXCEPT {return ::expl(__lcpp_x);} 915 #endif 916 917 template <class _A1> 918 inline _LIBCPP_INLINE_VISIBILITY 919 typename std::enable_if<std::is_integral<_A1>::value, double>::type 920 exp(_A1 __lcpp_x) _NOEXCEPT {return ::exp((double)__lcpp_x);} 921 922 // fabs 923 924 #if !(defined(_AIX) || defined(__sun__)) 925 inline _LIBCPP_INLINE_VISIBILITY float fabs(float __lcpp_x) _NOEXCEPT {return ::fabsf(__lcpp_x);} 926 inline _LIBCPP_INLINE_VISIBILITY long double fabs(long double __lcpp_x) _NOEXCEPT {return ::fabsl(__lcpp_x);} 927 #endif 928 929 template <class _A1> 930 inline _LIBCPP_INLINE_VISIBILITY 931 typename std::enable_if<std::is_integral<_A1>::value, double>::type 932 fabs(_A1 __lcpp_x) _NOEXCEPT {return ::fabs((double)__lcpp_x);} 933 934 // floor 935 936 #if !(defined(_AIX) || defined(__sun__)) 937 inline _LIBCPP_INLINE_VISIBILITY float floor(float __lcpp_x) _NOEXCEPT {return ::floorf(__lcpp_x);} 938 inline _LIBCPP_INLINE_VISIBILITY long double floor(long double __lcpp_x) _NOEXCEPT {return ::floorl(__lcpp_x);} 939 #endif 940 941 template <class _A1> 942 inline _LIBCPP_INLINE_VISIBILITY 943 typename std::enable_if<std::is_integral<_A1>::value, double>::type 944 floor(_A1 __lcpp_x) _NOEXCEPT {return ::floor((double)__lcpp_x);} 945 946 // fmod 947 948 #if !(defined(_AIX) || defined(__sun__)) 949 inline _LIBCPP_INLINE_VISIBILITY float fmod(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::fmodf(__lcpp_x, __lcpp_y);} 950 inline _LIBCPP_INLINE_VISIBILITY long double fmod(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::fmodl(__lcpp_x, __lcpp_y);} 951 #endif 952 953 template <class _A1, class _A2> 954 inline _LIBCPP_INLINE_VISIBILITY 955 typename std::_EnableIf 956 < 957 std::is_arithmetic<_A1>::value && 958 std::is_arithmetic<_A2>::value, 959 std::__promote<_A1, _A2> 960 >::type 961 fmod(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 962 { 963 typedef typename std::__promote<_A1, _A2>::type __result_type; 964 static_assert((!(std::_IsSame<_A1, __result_type>::value && 965 std::_IsSame<_A2, __result_type>::value)), ""); 966 return ::fmod((__result_type)__lcpp_x, (__result_type)__lcpp_y); 967 } 968 969 // frexp 970 971 #if !(defined(_AIX) || defined(__sun__)) 972 inline _LIBCPP_INLINE_VISIBILITY float frexp(float __lcpp_x, int* __lcpp_e) _NOEXCEPT {return ::frexpf(__lcpp_x, __lcpp_e);} 973 inline _LIBCPP_INLINE_VISIBILITY long double frexp(long double __lcpp_x, int* __lcpp_e) _NOEXCEPT {return ::frexpl(__lcpp_x, __lcpp_e);} 974 #endif 975 976 template <class _A1> 977 inline _LIBCPP_INLINE_VISIBILITY 978 typename std::enable_if<std::is_integral<_A1>::value, double>::type 979 frexp(_A1 __lcpp_x, int* __lcpp_e) _NOEXCEPT {return ::frexp((double)__lcpp_x, __lcpp_e);} 980 981 // ldexp 982 983 #if !(defined(_AIX) || defined(__sun__)) 984 inline _LIBCPP_INLINE_VISIBILITY float ldexp(float __lcpp_x, int __lcpp_e) _NOEXCEPT {return ::ldexpf(__lcpp_x, __lcpp_e);} 985 inline _LIBCPP_INLINE_VISIBILITY long double ldexp(long double __lcpp_x, int __lcpp_e) _NOEXCEPT {return ::ldexpl(__lcpp_x, __lcpp_e);} 986 #endif 987 988 template <class _A1> 989 inline _LIBCPP_INLINE_VISIBILITY 990 typename std::enable_if<std::is_integral<_A1>::value, double>::type 991 ldexp(_A1 __lcpp_x, int __lcpp_e) _NOEXCEPT {return ::ldexp((double)__lcpp_x, __lcpp_e);} 992 993 // log 994 995 #if !(defined(_AIX) || defined(__sun__)) 996 inline _LIBCPP_INLINE_VISIBILITY float log(float __lcpp_x) _NOEXCEPT {return ::logf(__lcpp_x);} 997 inline _LIBCPP_INLINE_VISIBILITY long double log(long double __lcpp_x) _NOEXCEPT {return ::logl(__lcpp_x);} 998 #endif 999 1000 template <class _A1> 1001 inline _LIBCPP_INLINE_VISIBILITY 1002 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1003 log(_A1 __lcpp_x) _NOEXCEPT {return ::log((double)__lcpp_x);} 1004 1005 // log10 1006 1007 #if !(defined(_AIX) || defined(__sun__)) 1008 inline _LIBCPP_INLINE_VISIBILITY float log10(float __lcpp_x) _NOEXCEPT {return ::log10f(__lcpp_x);} 1009 inline _LIBCPP_INLINE_VISIBILITY long double log10(long double __lcpp_x) _NOEXCEPT {return ::log10l(__lcpp_x);} 1010 #endif 1011 1012 template <class _A1> 1013 inline _LIBCPP_INLINE_VISIBILITY 1014 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1015 log10(_A1 __lcpp_x) _NOEXCEPT {return ::log10((double)__lcpp_x);} 1016 1017 // modf 1018 1019 #if !(defined(_AIX) || defined(__sun__)) 1020 inline _LIBCPP_INLINE_VISIBILITY float modf(float __lcpp_x, float* __lcpp_y) _NOEXCEPT {return ::modff(__lcpp_x, __lcpp_y);} 1021 inline _LIBCPP_INLINE_VISIBILITY long double modf(long double __lcpp_x, long double* __lcpp_y) _NOEXCEPT {return ::modfl(__lcpp_x, __lcpp_y);} 1022 #endif 1023 1024 // pow 1025 1026 #if !(defined(_AIX) || defined(__sun__)) 1027 inline _LIBCPP_INLINE_VISIBILITY float pow(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::powf(__lcpp_x, __lcpp_y);} 1028 inline _LIBCPP_INLINE_VISIBILITY long double pow(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::powl(__lcpp_x, __lcpp_y);} 1029 #endif 1030 1031 template <class _A1, class _A2> 1032 inline _LIBCPP_INLINE_VISIBILITY 1033 typename std::_EnableIf 1034 < 1035 std::is_arithmetic<_A1>::value && 1036 std::is_arithmetic<_A2>::value, 1037 std::__promote<_A1, _A2> 1038 >::type 1039 pow(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 1040 { 1041 typedef typename std::__promote<_A1, _A2>::type __result_type; 1042 static_assert((!(std::_IsSame<_A1, __result_type>::value && 1043 std::_IsSame<_A2, __result_type>::value)), ""); 1044 return ::pow((__result_type)__lcpp_x, (__result_type)__lcpp_y); 1045 } 1046 1047 // sin 1048 1049 #if !(defined(_AIX) || defined(__sun__)) 1050 inline _LIBCPP_INLINE_VISIBILITY float sin(float __lcpp_x) _NOEXCEPT {return ::sinf(__lcpp_x);} 1051 inline _LIBCPP_INLINE_VISIBILITY long double sin(long double __lcpp_x) _NOEXCEPT {return ::sinl(__lcpp_x);} 1052 #endif 1053 1054 template <class _A1> 1055 inline _LIBCPP_INLINE_VISIBILITY 1056 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1057 sin(_A1 __lcpp_x) _NOEXCEPT {return ::sin((double)__lcpp_x);} 1058 1059 // sinh 1060 1061 #if !(defined(_AIX) || defined(__sun__)) 1062 inline _LIBCPP_INLINE_VISIBILITY float sinh(float __lcpp_x) _NOEXCEPT {return ::sinhf(__lcpp_x);} 1063 inline _LIBCPP_INLINE_VISIBILITY long double sinh(long double __lcpp_x) _NOEXCEPT {return ::sinhl(__lcpp_x);} 1064 #endif 1065 1066 template <class _A1> 1067 inline _LIBCPP_INLINE_VISIBILITY 1068 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1069 sinh(_A1 __lcpp_x) _NOEXCEPT {return ::sinh((double)__lcpp_x);} 1070 1071 // sqrt 1072 1073 #if !(defined(_AIX) || defined(__sun__)) 1074 inline _LIBCPP_INLINE_VISIBILITY float sqrt(float __lcpp_x) _NOEXCEPT {return ::sqrtf(__lcpp_x);} 1075 inline _LIBCPP_INLINE_VISIBILITY long double sqrt(long double __lcpp_x) _NOEXCEPT {return ::sqrtl(__lcpp_x);} 1076 #endif 1077 1078 template <class _A1> 1079 inline _LIBCPP_INLINE_VISIBILITY 1080 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1081 sqrt(_A1 __lcpp_x) _NOEXCEPT {return ::sqrt((double)__lcpp_x);} 1082 1083 // tan 1084 1085 #if !(defined(_AIX) || defined(__sun__)) 1086 inline _LIBCPP_INLINE_VISIBILITY float tan(float __lcpp_x) _NOEXCEPT {return ::tanf(__lcpp_x);} 1087 inline _LIBCPP_INLINE_VISIBILITY long double tan(long double __lcpp_x) _NOEXCEPT {return ::tanl(__lcpp_x);} 1088 #endif 1089 1090 template <class _A1> 1091 inline _LIBCPP_INLINE_VISIBILITY 1092 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1093 tan(_A1 __lcpp_x) _NOEXCEPT {return ::tan((double)__lcpp_x);} 1094 1095 // tanh 1096 1097 #if !(defined(_AIX) || defined(__sun__)) 1098 inline _LIBCPP_INLINE_VISIBILITY float tanh(float __lcpp_x) _NOEXCEPT {return ::tanhf(__lcpp_x);} 1099 inline _LIBCPP_INLINE_VISIBILITY long double tanh(long double __lcpp_x) _NOEXCEPT {return ::tanhl(__lcpp_x);} 1100 #endif 1101 1102 template <class _A1> 1103 inline _LIBCPP_INLINE_VISIBILITY 1104 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1105 tanh(_A1 __lcpp_x) _NOEXCEPT {return ::tanh((double)__lcpp_x);} 1106 1107 // acosh 1108 1109 inline _LIBCPP_INLINE_VISIBILITY float acosh(float __lcpp_x) _NOEXCEPT {return ::acoshf(__lcpp_x);} 1110 inline _LIBCPP_INLINE_VISIBILITY long double acosh(long double __lcpp_x) _NOEXCEPT {return ::acoshl(__lcpp_x);} 1111 1112 template <class _A1> 1113 inline _LIBCPP_INLINE_VISIBILITY 1114 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1115 acosh(_A1 __lcpp_x) _NOEXCEPT {return ::acosh((double)__lcpp_x);} 1116 1117 // asinh 1118 1119 inline _LIBCPP_INLINE_VISIBILITY float asinh(float __lcpp_x) _NOEXCEPT {return ::asinhf(__lcpp_x);} 1120 inline _LIBCPP_INLINE_VISIBILITY long double asinh(long double __lcpp_x) _NOEXCEPT {return ::asinhl(__lcpp_x);} 1121 1122 template <class _A1> 1123 inline _LIBCPP_INLINE_VISIBILITY 1124 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1125 asinh(_A1 __lcpp_x) _NOEXCEPT {return ::asinh((double)__lcpp_x);} 1126 1127 // atanh 1128 1129 inline _LIBCPP_INLINE_VISIBILITY float atanh(float __lcpp_x) _NOEXCEPT {return ::atanhf(__lcpp_x);} 1130 inline _LIBCPP_INLINE_VISIBILITY long double atanh(long double __lcpp_x) _NOEXCEPT {return ::atanhl(__lcpp_x);} 1131 1132 template <class _A1> 1133 inline _LIBCPP_INLINE_VISIBILITY 1134 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1135 atanh(_A1 __lcpp_x) _NOEXCEPT {return ::atanh((double)__lcpp_x);} 1136 1137 // cbrt 1138 1139 inline _LIBCPP_INLINE_VISIBILITY float cbrt(float __lcpp_x) _NOEXCEPT {return ::cbrtf(__lcpp_x);} 1140 inline _LIBCPP_INLINE_VISIBILITY long double cbrt(long double __lcpp_x) _NOEXCEPT {return ::cbrtl(__lcpp_x);} 1141 1142 template <class _A1> 1143 inline _LIBCPP_INLINE_VISIBILITY 1144 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1145 cbrt(_A1 __lcpp_x) _NOEXCEPT {return ::cbrt((double)__lcpp_x);} 1146 1147 // copysign 1148 1149 inline _LIBCPP_INLINE_VISIBILITY float copysign(float __lcpp_x, 1150 float __lcpp_y) _NOEXCEPT { 1151 return ::copysignf(__lcpp_x, __lcpp_y); 1152 } 1153 inline _LIBCPP_INLINE_VISIBILITY long double 1154 copysign(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT { 1155 return ::copysignl(__lcpp_x, __lcpp_y); 1156 } 1157 1158 template <class _A1, class _A2> 1159 inline _LIBCPP_INLINE_VISIBILITY 1160 typename std::_EnableIf 1161 < 1162 std::is_arithmetic<_A1>::value && 1163 std::is_arithmetic<_A2>::value, 1164 std::__promote<_A1, _A2> 1165 >::type 1166 copysign(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 1167 { 1168 typedef typename std::__promote<_A1, _A2>::type __result_type; 1169 static_assert((!(std::_IsSame<_A1, __result_type>::value && 1170 std::_IsSame<_A2, __result_type>::value)), ""); 1171 return ::copysign((__result_type)__lcpp_x, (__result_type)__lcpp_y); 1172 } 1173 1174 // erf 1175 1176 inline _LIBCPP_INLINE_VISIBILITY float erf(float __lcpp_x) _NOEXCEPT {return ::erff(__lcpp_x);} 1177 inline _LIBCPP_INLINE_VISIBILITY long double erf(long double __lcpp_x) _NOEXCEPT {return ::erfl(__lcpp_x);} 1178 1179 template <class _A1> 1180 inline _LIBCPP_INLINE_VISIBILITY 1181 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1182 erf(_A1 __lcpp_x) _NOEXCEPT {return ::erf((double)__lcpp_x);} 1183 1184 // erfc 1185 1186 inline _LIBCPP_INLINE_VISIBILITY float erfc(float __lcpp_x) _NOEXCEPT {return ::erfcf(__lcpp_x);} 1187 inline _LIBCPP_INLINE_VISIBILITY long double erfc(long double __lcpp_x) _NOEXCEPT {return ::erfcl(__lcpp_x);} 1188 1189 template <class _A1> 1190 inline _LIBCPP_INLINE_VISIBILITY 1191 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1192 erfc(_A1 __lcpp_x) _NOEXCEPT {return ::erfc((double)__lcpp_x);} 1193 1194 // exp2 1195 1196 inline _LIBCPP_INLINE_VISIBILITY float exp2(float __lcpp_x) _NOEXCEPT {return ::exp2f(__lcpp_x);} 1197 inline _LIBCPP_INLINE_VISIBILITY long double exp2(long double __lcpp_x) _NOEXCEPT {return ::exp2l(__lcpp_x);} 1198 1199 template <class _A1> 1200 inline _LIBCPP_INLINE_VISIBILITY 1201 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1202 exp2(_A1 __lcpp_x) _NOEXCEPT {return ::exp2((double)__lcpp_x);} 1203 1204 // expm1 1205 1206 inline _LIBCPP_INLINE_VISIBILITY float expm1(float __lcpp_x) _NOEXCEPT {return ::expm1f(__lcpp_x);} 1207 inline _LIBCPP_INLINE_VISIBILITY long double expm1(long double __lcpp_x) _NOEXCEPT {return ::expm1l(__lcpp_x);} 1208 1209 template <class _A1> 1210 inline _LIBCPP_INLINE_VISIBILITY 1211 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1212 expm1(_A1 __lcpp_x) _NOEXCEPT {return ::expm1((double)__lcpp_x);} 1213 1214 // fdim 1215 1216 inline _LIBCPP_INLINE_VISIBILITY float fdim(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::fdimf(__lcpp_x, __lcpp_y);} 1217 inline _LIBCPP_INLINE_VISIBILITY long double fdim(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::fdiml(__lcpp_x, __lcpp_y);} 1218 1219 template <class _A1, class _A2> 1220 inline _LIBCPP_INLINE_VISIBILITY 1221 typename std::_EnableIf 1222 < 1223 std::is_arithmetic<_A1>::value && 1224 std::is_arithmetic<_A2>::value, 1225 std::__promote<_A1, _A2> 1226 >::type 1227 fdim(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 1228 { 1229 typedef typename std::__promote<_A1, _A2>::type __result_type; 1230 static_assert((!(std::_IsSame<_A1, __result_type>::value && 1231 std::_IsSame<_A2, __result_type>::value)), ""); 1232 return ::fdim((__result_type)__lcpp_x, (__result_type)__lcpp_y); 1233 } 1234 1235 // fma 1236 1237 inline _LIBCPP_INLINE_VISIBILITY float fma(float __lcpp_x, float __lcpp_y, float __lcpp_z) _NOEXCEPT {return ::fmaf(__lcpp_x, __lcpp_y, __lcpp_z);} 1238 inline _LIBCPP_INLINE_VISIBILITY long double fma(long double __lcpp_x, long double __lcpp_y, long double __lcpp_z) _NOEXCEPT {return ::fmal(__lcpp_x, __lcpp_y, __lcpp_z);} 1239 1240 template <class _A1, class _A2, class _A3> 1241 inline _LIBCPP_INLINE_VISIBILITY 1242 typename std::_EnableIf 1243 < 1244 std::is_arithmetic<_A1>::value && 1245 std::is_arithmetic<_A2>::value && 1246 std::is_arithmetic<_A3>::value, 1247 std::__promote<_A1, _A2, _A3> 1248 >::type 1249 fma(_A1 __lcpp_x, _A2 __lcpp_y, _A3 __lcpp_z) _NOEXCEPT 1250 { 1251 typedef typename std::__promote<_A1, _A2, _A3>::type __result_type; 1252 static_assert((!(std::_IsSame<_A1, __result_type>::value && 1253 std::_IsSame<_A2, __result_type>::value && 1254 std::_IsSame<_A3, __result_type>::value)), ""); 1255 return ::fma((__result_type)__lcpp_x, (__result_type)__lcpp_y, (__result_type)__lcpp_z); 1256 } 1257 1258 // fmax 1259 1260 inline _LIBCPP_INLINE_VISIBILITY float fmax(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::fmaxf(__lcpp_x, __lcpp_y);} 1261 inline _LIBCPP_INLINE_VISIBILITY long double fmax(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::fmaxl(__lcpp_x, __lcpp_y);} 1262 1263 template <class _A1, class _A2> 1264 inline _LIBCPP_INLINE_VISIBILITY 1265 typename std::_EnableIf 1266 < 1267 std::is_arithmetic<_A1>::value && 1268 std::is_arithmetic<_A2>::value, 1269 std::__promote<_A1, _A2> 1270 >::type 1271 fmax(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 1272 { 1273 typedef typename std::__promote<_A1, _A2>::type __result_type; 1274 static_assert((!(std::_IsSame<_A1, __result_type>::value && 1275 std::_IsSame<_A2, __result_type>::value)), ""); 1276 return ::fmax((__result_type)__lcpp_x, (__result_type)__lcpp_y); 1277 } 1278 1279 // fmin 1280 1281 inline _LIBCPP_INLINE_VISIBILITY float fmin(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::fminf(__lcpp_x, __lcpp_y);} 1282 inline _LIBCPP_INLINE_VISIBILITY long double fmin(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::fminl(__lcpp_x, __lcpp_y);} 1283 1284 template <class _A1, class _A2> 1285 inline _LIBCPP_INLINE_VISIBILITY 1286 typename std::_EnableIf 1287 < 1288 std::is_arithmetic<_A1>::value && 1289 std::is_arithmetic<_A2>::value, 1290 std::__promote<_A1, _A2> 1291 >::type 1292 fmin(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 1293 { 1294 typedef typename std::__promote<_A1, _A2>::type __result_type; 1295 static_assert((!(std::_IsSame<_A1, __result_type>::value && 1296 std::_IsSame<_A2, __result_type>::value)), ""); 1297 return ::fmin((__result_type)__lcpp_x, (__result_type)__lcpp_y); 1298 } 1299 1300 // hypot 1301 1302 inline _LIBCPP_INLINE_VISIBILITY float hypot(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::hypotf(__lcpp_x, __lcpp_y);} 1303 inline _LIBCPP_INLINE_VISIBILITY long double hypot(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::hypotl(__lcpp_x, __lcpp_y);} 1304 1305 template <class _A1, class _A2> 1306 inline _LIBCPP_INLINE_VISIBILITY 1307 typename std::_EnableIf 1308 < 1309 std::is_arithmetic<_A1>::value && 1310 std::is_arithmetic<_A2>::value, 1311 std::__promote<_A1, _A2> 1312 >::type 1313 hypot(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 1314 { 1315 typedef typename std::__promote<_A1, _A2>::type __result_type; 1316 static_assert((!(std::_IsSame<_A1, __result_type>::value && 1317 std::_IsSame<_A2, __result_type>::value)), ""); 1318 return ::hypot((__result_type)__lcpp_x, (__result_type)__lcpp_y); 1319 } 1320 1321 // ilogb 1322 1323 inline _LIBCPP_INLINE_VISIBILITY int ilogb(float __lcpp_x) _NOEXCEPT {return ::ilogbf(__lcpp_x);} 1324 inline _LIBCPP_INLINE_VISIBILITY int ilogb(long double __lcpp_x) _NOEXCEPT {return ::ilogbl(__lcpp_x);} 1325 1326 template <class _A1> 1327 inline _LIBCPP_INLINE_VISIBILITY 1328 typename std::enable_if<std::is_integral<_A1>::value, int>::type 1329 ilogb(_A1 __lcpp_x) _NOEXCEPT {return ::ilogb((double)__lcpp_x);} 1330 1331 // lgamma 1332 1333 inline _LIBCPP_INLINE_VISIBILITY float lgamma(float __lcpp_x) _NOEXCEPT {return ::lgammaf(__lcpp_x);} 1334 inline _LIBCPP_INLINE_VISIBILITY long double lgamma(long double __lcpp_x) _NOEXCEPT {return ::lgammal(__lcpp_x);} 1335 1336 template <class _A1> 1337 inline _LIBCPP_INLINE_VISIBILITY 1338 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1339 lgamma(_A1 __lcpp_x) _NOEXCEPT {return ::lgamma((double)__lcpp_x);} 1340 1341 // llrint 1342 1343 inline _LIBCPP_INLINE_VISIBILITY long long llrint(float __lcpp_x) _NOEXCEPT {return ::llrintf(__lcpp_x);} 1344 inline _LIBCPP_INLINE_VISIBILITY long long llrint(long double __lcpp_x) _NOEXCEPT {return ::llrintl(__lcpp_x);} 1345 1346 template <class _A1> 1347 inline _LIBCPP_INLINE_VISIBILITY 1348 typename std::enable_if<std::is_integral<_A1>::value, long long>::type 1349 llrint(_A1 __lcpp_x) _NOEXCEPT {return ::llrint((double)__lcpp_x);} 1350 1351 // llround 1352 1353 inline _LIBCPP_INLINE_VISIBILITY long long llround(float __lcpp_x) _NOEXCEPT {return ::llroundf(__lcpp_x);} 1354 inline _LIBCPP_INLINE_VISIBILITY long long llround(long double __lcpp_x) _NOEXCEPT {return ::llroundl(__lcpp_x);} 1355 1356 template <class _A1> 1357 inline _LIBCPP_INLINE_VISIBILITY 1358 typename std::enable_if<std::is_integral<_A1>::value, long long>::type 1359 llround(_A1 __lcpp_x) _NOEXCEPT {return ::llround((double)__lcpp_x);} 1360 1361 // log1p 1362 1363 inline _LIBCPP_INLINE_VISIBILITY float log1p(float __lcpp_x) _NOEXCEPT {return ::log1pf(__lcpp_x);} 1364 inline _LIBCPP_INLINE_VISIBILITY long double log1p(long double __lcpp_x) _NOEXCEPT {return ::log1pl(__lcpp_x);} 1365 1366 template <class _A1> 1367 inline _LIBCPP_INLINE_VISIBILITY 1368 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1369 log1p(_A1 __lcpp_x) _NOEXCEPT {return ::log1p((double)__lcpp_x);} 1370 1371 // log2 1372 1373 inline _LIBCPP_INLINE_VISIBILITY float log2(float __lcpp_x) _NOEXCEPT {return ::log2f(__lcpp_x);} 1374 inline _LIBCPP_INLINE_VISIBILITY long double log2(long double __lcpp_x) _NOEXCEPT {return ::log2l(__lcpp_x);} 1375 1376 template <class _A1> 1377 inline _LIBCPP_INLINE_VISIBILITY 1378 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1379 log2(_A1 __lcpp_x) _NOEXCEPT {return ::log2((double)__lcpp_x);} 1380 1381 // logb 1382 1383 inline _LIBCPP_INLINE_VISIBILITY float logb(float __lcpp_x) _NOEXCEPT {return ::logbf(__lcpp_x);} 1384 inline _LIBCPP_INLINE_VISIBILITY long double logb(long double __lcpp_x) _NOEXCEPT {return ::logbl(__lcpp_x);} 1385 1386 template <class _A1> 1387 inline _LIBCPP_INLINE_VISIBILITY 1388 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1389 logb(_A1 __lcpp_x) _NOEXCEPT {return ::logb((double)__lcpp_x);} 1390 1391 // lrint 1392 1393 inline _LIBCPP_INLINE_VISIBILITY long lrint(float __lcpp_x) _NOEXCEPT {return ::lrintf(__lcpp_x);} 1394 inline _LIBCPP_INLINE_VISIBILITY long lrint(long double __lcpp_x) _NOEXCEPT {return ::lrintl(__lcpp_x);} 1395 1396 template <class _A1> 1397 inline _LIBCPP_INLINE_VISIBILITY 1398 typename std::enable_if<std::is_integral<_A1>::value, long>::type 1399 lrint(_A1 __lcpp_x) _NOEXCEPT {return ::lrint((double)__lcpp_x);} 1400 1401 // lround 1402 1403 inline _LIBCPP_INLINE_VISIBILITY long lround(float __lcpp_x) _NOEXCEPT {return ::lroundf(__lcpp_x);} 1404 inline _LIBCPP_INLINE_VISIBILITY long lround(long double __lcpp_x) _NOEXCEPT {return ::lroundl(__lcpp_x);} 1405 1406 template <class _A1> 1407 inline _LIBCPP_INLINE_VISIBILITY 1408 typename std::enable_if<std::is_integral<_A1>::value, long>::type 1409 lround(_A1 __lcpp_x) _NOEXCEPT {return ::lround((double)__lcpp_x);} 1410 1411 // nan 1412 1413 // nearbyint 1414 1415 inline _LIBCPP_INLINE_VISIBILITY float nearbyint(float __lcpp_x) _NOEXCEPT {return ::nearbyintf(__lcpp_x);} 1416 inline _LIBCPP_INLINE_VISIBILITY long double nearbyint(long double __lcpp_x) _NOEXCEPT {return ::nearbyintl(__lcpp_x);} 1417 1418 template <class _A1> 1419 inline _LIBCPP_INLINE_VISIBILITY 1420 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1421 nearbyint(_A1 __lcpp_x) _NOEXCEPT {return ::nearbyint((double)__lcpp_x);} 1422 1423 // nextafter 1424 1425 inline _LIBCPP_INLINE_VISIBILITY float nextafter(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::nextafterf(__lcpp_x, __lcpp_y);} 1426 inline _LIBCPP_INLINE_VISIBILITY long double nextafter(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::nextafterl(__lcpp_x, __lcpp_y);} 1427 1428 template <class _A1, class _A2> 1429 inline _LIBCPP_INLINE_VISIBILITY 1430 typename std::_EnableIf 1431 < 1432 std::is_arithmetic<_A1>::value && 1433 std::is_arithmetic<_A2>::value, 1434 std::__promote<_A1, _A2> 1435 >::type 1436 nextafter(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 1437 { 1438 typedef typename std::__promote<_A1, _A2>::type __result_type; 1439 static_assert((!(std::_IsSame<_A1, __result_type>::value && 1440 std::_IsSame<_A2, __result_type>::value)), ""); 1441 return ::nextafter((__result_type)__lcpp_x, (__result_type)__lcpp_y); 1442 } 1443 1444 // nexttoward 1445 1446 inline _LIBCPP_INLINE_VISIBILITY float nexttoward(float __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::nexttowardf(__lcpp_x, __lcpp_y);} 1447 inline _LIBCPP_INLINE_VISIBILITY long double nexttoward(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::nexttowardl(__lcpp_x, __lcpp_y);} 1448 1449 template <class _A1> 1450 inline _LIBCPP_INLINE_VISIBILITY 1451 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1452 nexttoward(_A1 __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::nexttoward((double)__lcpp_x, __lcpp_y);} 1453 1454 // remainder 1455 1456 inline _LIBCPP_INLINE_VISIBILITY float remainder(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::remainderf(__lcpp_x, __lcpp_y);} 1457 inline _LIBCPP_INLINE_VISIBILITY long double remainder(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::remainderl(__lcpp_x, __lcpp_y);} 1458 1459 template <class _A1, class _A2> 1460 inline _LIBCPP_INLINE_VISIBILITY 1461 typename std::_EnableIf 1462 < 1463 std::is_arithmetic<_A1>::value && 1464 std::is_arithmetic<_A2>::value, 1465 std::__promote<_A1, _A2> 1466 >::type 1467 remainder(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT 1468 { 1469 typedef typename std::__promote<_A1, _A2>::type __result_type; 1470 static_assert((!(std::_IsSame<_A1, __result_type>::value && 1471 std::_IsSame<_A2, __result_type>::value)), ""); 1472 return ::remainder((__result_type)__lcpp_x, (__result_type)__lcpp_y); 1473 } 1474 1475 // remquo 1476 1477 inline _LIBCPP_INLINE_VISIBILITY float remquo(float __lcpp_x, float __lcpp_y, int* __lcpp_z) _NOEXCEPT {return ::remquof(__lcpp_x, __lcpp_y, __lcpp_z);} 1478 inline _LIBCPP_INLINE_VISIBILITY long double remquo(long double __lcpp_x, long double __lcpp_y, int* __lcpp_z) _NOEXCEPT {return ::remquol(__lcpp_x, __lcpp_y, __lcpp_z);} 1479 1480 template <class _A1, class _A2> 1481 inline _LIBCPP_INLINE_VISIBILITY 1482 typename std::_EnableIf 1483 < 1484 std::is_arithmetic<_A1>::value && 1485 std::is_arithmetic<_A2>::value, 1486 std::__promote<_A1, _A2> 1487 >::type 1488 remquo(_A1 __lcpp_x, _A2 __lcpp_y, int* __lcpp_z) _NOEXCEPT 1489 { 1490 typedef typename std::__promote<_A1, _A2>::type __result_type; 1491 static_assert((!(std::_IsSame<_A1, __result_type>::value && 1492 std::_IsSame<_A2, __result_type>::value)), ""); 1493 return ::remquo((__result_type)__lcpp_x, (__result_type)__lcpp_y, __lcpp_z); 1494 } 1495 1496 // rint 1497 1498 inline _LIBCPP_INLINE_VISIBILITY float rint(float __lcpp_x) _NOEXCEPT {return ::rintf(__lcpp_x);} 1499 inline _LIBCPP_INLINE_VISIBILITY long double rint(long double __lcpp_x) _NOEXCEPT {return ::rintl(__lcpp_x);} 1500 1501 template <class _A1> 1502 inline _LIBCPP_INLINE_VISIBILITY 1503 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1504 rint(_A1 __lcpp_x) _NOEXCEPT {return ::rint((double)__lcpp_x);} 1505 1506 // round 1507 1508 inline _LIBCPP_INLINE_VISIBILITY float round(float __lcpp_x) _NOEXCEPT {return ::roundf(__lcpp_x);} 1509 inline _LIBCPP_INLINE_VISIBILITY long double round(long double __lcpp_x) _NOEXCEPT {return ::roundl(__lcpp_x);} 1510 1511 template <class _A1> 1512 inline _LIBCPP_INLINE_VISIBILITY 1513 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1514 round(_A1 __lcpp_x) _NOEXCEPT {return ::round((double)__lcpp_x);} 1515 1516 // scalbln 1517 1518 inline _LIBCPP_INLINE_VISIBILITY float scalbln(float __lcpp_x, long __lcpp_y) _NOEXCEPT {return ::scalblnf(__lcpp_x, __lcpp_y);} 1519 inline _LIBCPP_INLINE_VISIBILITY long double scalbln(long double __lcpp_x, long __lcpp_y) _NOEXCEPT {return ::scalblnl(__lcpp_x, __lcpp_y);} 1520 1521 template <class _A1> 1522 inline _LIBCPP_INLINE_VISIBILITY 1523 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1524 scalbln(_A1 __lcpp_x, long __lcpp_y) _NOEXCEPT {return ::scalbln((double)__lcpp_x, __lcpp_y);} 1525 1526 // scalbn 1527 1528 inline _LIBCPP_INLINE_VISIBILITY float scalbn(float __lcpp_x, int __lcpp_y) _NOEXCEPT {return ::scalbnf(__lcpp_x, __lcpp_y);} 1529 inline _LIBCPP_INLINE_VISIBILITY long double scalbn(long double __lcpp_x, int __lcpp_y) _NOEXCEPT {return ::scalbnl(__lcpp_x, __lcpp_y);} 1530 1531 template <class _A1> 1532 inline _LIBCPP_INLINE_VISIBILITY 1533 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1534 scalbn(_A1 __lcpp_x, int __lcpp_y) _NOEXCEPT {return ::scalbn((double)__lcpp_x, __lcpp_y);} 1535 1536 // tgamma 1537 1538 inline _LIBCPP_INLINE_VISIBILITY float tgamma(float __lcpp_x) _NOEXCEPT {return ::tgammaf(__lcpp_x);} 1539 inline _LIBCPP_INLINE_VISIBILITY long double tgamma(long double __lcpp_x) _NOEXCEPT {return ::tgammal(__lcpp_x);} 1540 1541 template <class _A1> 1542 inline _LIBCPP_INLINE_VISIBILITY 1543 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1544 tgamma(_A1 __lcpp_x) _NOEXCEPT {return ::tgamma((double)__lcpp_x);} 1545 1546 // trunc 1547 1548 inline _LIBCPP_INLINE_VISIBILITY float trunc(float __lcpp_x) _NOEXCEPT {return ::truncf(__lcpp_x);} 1549 inline _LIBCPP_INLINE_VISIBILITY long double trunc(long double __lcpp_x) _NOEXCEPT {return ::truncl(__lcpp_x);} 1550 1551 template <class _A1> 1552 inline _LIBCPP_INLINE_VISIBILITY 1553 typename std::enable_if<std::is_integral<_A1>::value, double>::type 1554 trunc(_A1 __lcpp_x) _NOEXCEPT {return ::trunc((double)__lcpp_x);} 1555 1556 } // extern "C++" 1557 1558 #endif // __cplusplus 1559 1560 #else // _LIBCPP_MATH_H 1561 1562 // This include lives outside the header guard in order to support an MSVC 1563 // extension which allows users to do: 1564 // 1565 // #define _USE_MATH_DEFINES 1566 // #include <math.h> 1567 // 1568 // and receive the definitions of mathematical constants, even if <math.h> 1569 // has previously been included. 1570 #if defined(_LIBCPP_MSVCRT) && defined(_USE_MATH_DEFINES) 1571 #include_next <math.h> 1572 #endif 1573 1574 #endif // _LIBCPP_MATH_H 1575