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