1e78f53d1SNikolas Klauser // -*- C++ -*- 2e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===// 3e78f53d1SNikolas Klauser // 4e78f53d1SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5e78f53d1SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 6e78f53d1SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7e78f53d1SNikolas Klauser // 8e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===// 9e78f53d1SNikolas Klauser 10*ce777190SNikolas Klauser #ifndef _LIBCPP___CXX03_MATH_H 11*ce777190SNikolas Klauser # define _LIBCPP___CXX03_MATH_H 12e78f53d1SNikolas Klauser 13e78f53d1SNikolas Klauser /* 14e78f53d1SNikolas Klauser math.h synopsis 15e78f53d1SNikolas Klauser 16e78f53d1SNikolas Klauser Macros: 17e78f53d1SNikolas Klauser 18e78f53d1SNikolas Klauser HUGE_VAL 19e78f53d1SNikolas Klauser HUGE_VALF // C99 20e78f53d1SNikolas Klauser HUGE_VALL // C99 21e78f53d1SNikolas Klauser INFINITY // C99 22e78f53d1SNikolas Klauser NAN // C99 23e78f53d1SNikolas Klauser FP_INFINITE // C99 24e78f53d1SNikolas Klauser FP_NAN // C99 25e78f53d1SNikolas Klauser FP_NORMAL // C99 26e78f53d1SNikolas Klauser FP_SUBNORMAL // C99 27e78f53d1SNikolas Klauser FP_ZERO // C99 28e78f53d1SNikolas Klauser FP_FAST_FMA // C99 29e78f53d1SNikolas Klauser FP_FAST_FMAF // C99 30e78f53d1SNikolas Klauser FP_FAST_FMAL // C99 31e78f53d1SNikolas Klauser FP_ILOGB0 // C99 32e78f53d1SNikolas Klauser FP_ILOGBNAN // C99 33e78f53d1SNikolas Klauser MATH_ERRNO // C99 34e78f53d1SNikolas Klauser MATH_ERREXCEPT // C99 35e78f53d1SNikolas Klauser math_errhandling // C99 36e78f53d1SNikolas Klauser 37e78f53d1SNikolas Klauser Types: 38e78f53d1SNikolas Klauser 39e78f53d1SNikolas Klauser float_t // C99 40e78f53d1SNikolas Klauser double_t // C99 41e78f53d1SNikolas Klauser 42e78f53d1SNikolas Klauser // C90 43e78f53d1SNikolas Klauser 44e78f53d1SNikolas Klauser floating_point abs(floating_point x); 45e78f53d1SNikolas Klauser 46e78f53d1SNikolas Klauser floating_point acos (arithmetic x); 47e78f53d1SNikolas Klauser float acosf(float x); 48e78f53d1SNikolas Klauser long double acosl(long double x); 49e78f53d1SNikolas Klauser 50e78f53d1SNikolas Klauser floating_point asin (arithmetic x); 51e78f53d1SNikolas Klauser float asinf(float x); 52e78f53d1SNikolas Klauser long double asinl(long double x); 53e78f53d1SNikolas Klauser 54e78f53d1SNikolas Klauser floating_point atan (arithmetic x); 55e78f53d1SNikolas Klauser float atanf(float x); 56e78f53d1SNikolas Klauser long double atanl(long double x); 57e78f53d1SNikolas Klauser 58e78f53d1SNikolas Klauser floating_point atan2 (arithmetic y, arithmetic x); 59e78f53d1SNikolas Klauser float atan2f(float y, float x); 60e78f53d1SNikolas Klauser long double atan2l(long double y, long double x); 61e78f53d1SNikolas Klauser 62e78f53d1SNikolas Klauser floating_point ceil (arithmetic x); 63e78f53d1SNikolas Klauser float ceilf(float x); 64e78f53d1SNikolas Klauser long double ceill(long double x); 65e78f53d1SNikolas Klauser 66e78f53d1SNikolas Klauser floating_point cos (arithmetic x); 67e78f53d1SNikolas Klauser float cosf(float x); 68e78f53d1SNikolas Klauser long double cosl(long double x); 69e78f53d1SNikolas Klauser 70e78f53d1SNikolas Klauser floating_point cosh (arithmetic x); 71e78f53d1SNikolas Klauser float coshf(float x); 72e78f53d1SNikolas Klauser long double coshl(long double x); 73e78f53d1SNikolas Klauser 74e78f53d1SNikolas Klauser floating_point exp (arithmetic x); 75e78f53d1SNikolas Klauser float expf(float x); 76e78f53d1SNikolas Klauser long double expl(long double x); 77e78f53d1SNikolas Klauser 78e78f53d1SNikolas Klauser floating_point fabs (arithmetic x); 79e78f53d1SNikolas Klauser float fabsf(float x); 80e78f53d1SNikolas Klauser long double fabsl(long double x); 81e78f53d1SNikolas Klauser 82e78f53d1SNikolas Klauser floating_point floor (arithmetic x); 83e78f53d1SNikolas Klauser float floorf(float x); 84e78f53d1SNikolas Klauser long double floorl(long double x); 85e78f53d1SNikolas Klauser 86e78f53d1SNikolas Klauser floating_point fmod (arithmetic x, arithmetic y); 87e78f53d1SNikolas Klauser float fmodf(float x, float y); 88e78f53d1SNikolas Klauser long double fmodl(long double x, long double y); 89e78f53d1SNikolas Klauser 90e78f53d1SNikolas Klauser floating_point frexp (arithmetic value, int* exp); 91e78f53d1SNikolas Klauser float frexpf(float value, int* exp); 92e78f53d1SNikolas Klauser long double frexpl(long double value, int* exp); 93e78f53d1SNikolas Klauser 94e78f53d1SNikolas Klauser floating_point ldexp (arithmetic value, int exp); 95e78f53d1SNikolas Klauser float ldexpf(float value, int exp); 96e78f53d1SNikolas Klauser long double ldexpl(long double value, int exp); 97e78f53d1SNikolas Klauser 98e78f53d1SNikolas Klauser floating_point log (arithmetic x); 99e78f53d1SNikolas Klauser float logf(float x); 100e78f53d1SNikolas Klauser long double logl(long double x); 101e78f53d1SNikolas Klauser 102e78f53d1SNikolas Klauser floating_point log10 (arithmetic x); 103e78f53d1SNikolas Klauser float log10f(float x); 104e78f53d1SNikolas Klauser long double log10l(long double x); 105e78f53d1SNikolas Klauser 106e78f53d1SNikolas Klauser floating_point modf (floating_point value, floating_point* iptr); 107e78f53d1SNikolas Klauser float modff(float value, float* iptr); 108e78f53d1SNikolas Klauser long double modfl(long double value, long double* iptr); 109e78f53d1SNikolas Klauser 110e78f53d1SNikolas Klauser floating_point pow (arithmetic x, arithmetic y); 111e78f53d1SNikolas Klauser float powf(float x, float y); 112e78f53d1SNikolas Klauser long double powl(long double x, long double y); 113e78f53d1SNikolas Klauser 114e78f53d1SNikolas Klauser floating_point sin (arithmetic x); 115e78f53d1SNikolas Klauser float sinf(float x); 116e78f53d1SNikolas Klauser long double sinl(long double x); 117e78f53d1SNikolas Klauser 118e78f53d1SNikolas Klauser floating_point sinh (arithmetic x); 119e78f53d1SNikolas Klauser float sinhf(float x); 120e78f53d1SNikolas Klauser long double sinhl(long double x); 121e78f53d1SNikolas Klauser 122e78f53d1SNikolas Klauser floating_point sqrt (arithmetic x); 123e78f53d1SNikolas Klauser float sqrtf(float x); 124e78f53d1SNikolas Klauser long double sqrtl(long double x); 125e78f53d1SNikolas Klauser 126e78f53d1SNikolas Klauser floating_point tan (arithmetic x); 127e78f53d1SNikolas Klauser float tanf(float x); 128e78f53d1SNikolas Klauser long double tanl(long double x); 129e78f53d1SNikolas Klauser 130e78f53d1SNikolas Klauser floating_point tanh (arithmetic x); 131e78f53d1SNikolas Klauser float tanhf(float x); 132e78f53d1SNikolas Klauser long double tanhl(long double x); 133e78f53d1SNikolas Klauser 134e78f53d1SNikolas Klauser // C99 135e78f53d1SNikolas Klauser 136e78f53d1SNikolas Klauser bool signbit(arithmetic x); 137e78f53d1SNikolas Klauser 138e78f53d1SNikolas Klauser int fpclassify(arithmetic x); 139e78f53d1SNikolas Klauser 140e78f53d1SNikolas Klauser bool isfinite(arithmetic x); 141e78f53d1SNikolas Klauser bool isinf(arithmetic x); 142e78f53d1SNikolas Klauser bool isnan(arithmetic x); 143e78f53d1SNikolas Klauser bool isnormal(arithmetic x); 144e78f53d1SNikolas Klauser 145e78f53d1SNikolas Klauser bool isgreater(arithmetic x, arithmetic y); 146e78f53d1SNikolas Klauser bool isgreaterequal(arithmetic x, arithmetic y); 147e78f53d1SNikolas Klauser bool isless(arithmetic x, arithmetic y); 148e78f53d1SNikolas Klauser bool islessequal(arithmetic x, arithmetic y); 149e78f53d1SNikolas Klauser bool islessgreater(arithmetic x, arithmetic y); 150e78f53d1SNikolas Klauser bool isunordered(arithmetic x, arithmetic y); 151e78f53d1SNikolas Klauser 152e78f53d1SNikolas Klauser floating_point acosh (arithmetic x); 153e78f53d1SNikolas Klauser float acoshf(float x); 154e78f53d1SNikolas Klauser long double acoshl(long double x); 155e78f53d1SNikolas Klauser 156e78f53d1SNikolas Klauser floating_point asinh (arithmetic x); 157e78f53d1SNikolas Klauser float asinhf(float x); 158e78f53d1SNikolas Klauser long double asinhl(long double x); 159e78f53d1SNikolas Klauser 160e78f53d1SNikolas Klauser floating_point atanh (arithmetic x); 161e78f53d1SNikolas Klauser float atanhf(float x); 162e78f53d1SNikolas Klauser long double atanhl(long double x); 163e78f53d1SNikolas Klauser 164e78f53d1SNikolas Klauser floating_point cbrt (arithmetic x); 165e78f53d1SNikolas Klauser float cbrtf(float x); 166e78f53d1SNikolas Klauser long double cbrtl(long double x); 167e78f53d1SNikolas Klauser 168e78f53d1SNikolas Klauser floating_point copysign (arithmetic x, arithmetic y); 169e78f53d1SNikolas Klauser float copysignf(float x, float y); 170e78f53d1SNikolas Klauser long double copysignl(long double x, long double y); 171e78f53d1SNikolas Klauser 172e78f53d1SNikolas Klauser floating_point erf (arithmetic x); 173e78f53d1SNikolas Klauser float erff(float x); 174e78f53d1SNikolas Klauser long double erfl(long double x); 175e78f53d1SNikolas Klauser 176e78f53d1SNikolas Klauser floating_point erfc (arithmetic x); 177e78f53d1SNikolas Klauser float erfcf(float x); 178e78f53d1SNikolas Klauser long double erfcl(long double x); 179e78f53d1SNikolas Klauser 180e78f53d1SNikolas Klauser floating_point exp2 (arithmetic x); 181e78f53d1SNikolas Klauser float exp2f(float x); 182e78f53d1SNikolas Klauser long double exp2l(long double x); 183e78f53d1SNikolas Klauser 184e78f53d1SNikolas Klauser floating_point expm1 (arithmetic x); 185e78f53d1SNikolas Klauser float expm1f(float x); 186e78f53d1SNikolas Klauser long double expm1l(long double x); 187e78f53d1SNikolas Klauser 188e78f53d1SNikolas Klauser floating_point fdim (arithmetic x, arithmetic y); 189e78f53d1SNikolas Klauser float fdimf(float x, float y); 190e78f53d1SNikolas Klauser long double fdiml(long double x, long double y); 191e78f53d1SNikolas Klauser 192e78f53d1SNikolas Klauser floating_point fma (arithmetic x, arithmetic y, arithmetic z); 193e78f53d1SNikolas Klauser float fmaf(float x, float y, float z); 194e78f53d1SNikolas Klauser long double fmal(long double x, long double y, long double z); 195e78f53d1SNikolas Klauser 196e78f53d1SNikolas Klauser floating_point fmax (arithmetic x, arithmetic y); 197e78f53d1SNikolas Klauser float fmaxf(float x, float y); 198e78f53d1SNikolas Klauser long double fmaxl(long double x, long double y); 199e78f53d1SNikolas Klauser 200e78f53d1SNikolas Klauser floating_point fmin (arithmetic x, arithmetic y); 201e78f53d1SNikolas Klauser float fminf(float x, float y); 202e78f53d1SNikolas Klauser long double fminl(long double x, long double y); 203e78f53d1SNikolas Klauser 204e78f53d1SNikolas Klauser floating_point hypot (arithmetic x, arithmetic y); 205e78f53d1SNikolas Klauser float hypotf(float x, float y); 206e78f53d1SNikolas Klauser long double hypotl(long double x, long double y); 207e78f53d1SNikolas Klauser 208e78f53d1SNikolas Klauser int ilogb (arithmetic x); 209e78f53d1SNikolas Klauser int ilogbf(float x); 210e78f53d1SNikolas Klauser int ilogbl(long double x); 211e78f53d1SNikolas Klauser 212e78f53d1SNikolas Klauser floating_point lgamma (arithmetic x); 213e78f53d1SNikolas Klauser float lgammaf(float x); 214e78f53d1SNikolas Klauser long double lgammal(long double x); 215e78f53d1SNikolas Klauser 216e78f53d1SNikolas Klauser long long llrint (arithmetic x); 217e78f53d1SNikolas Klauser long long llrintf(float x); 218e78f53d1SNikolas Klauser long long llrintl(long double x); 219e78f53d1SNikolas Klauser 220e78f53d1SNikolas Klauser long long llround (arithmetic x); 221e78f53d1SNikolas Klauser long long llroundf(float x); 222e78f53d1SNikolas Klauser long long llroundl(long double x); 223e78f53d1SNikolas Klauser 224e78f53d1SNikolas Klauser floating_point log1p (arithmetic x); 225e78f53d1SNikolas Klauser float log1pf(float x); 226e78f53d1SNikolas Klauser long double log1pl(long double x); 227e78f53d1SNikolas Klauser 228e78f53d1SNikolas Klauser floating_point log2 (arithmetic x); 229e78f53d1SNikolas Klauser float log2f(float x); 230e78f53d1SNikolas Klauser long double log2l(long double x); 231e78f53d1SNikolas Klauser 232e78f53d1SNikolas Klauser floating_point logb (arithmetic x); 233e78f53d1SNikolas Klauser float logbf(float x); 234e78f53d1SNikolas Klauser long double logbl(long double x); 235e78f53d1SNikolas Klauser 236e78f53d1SNikolas Klauser long lrint (arithmetic x); 237e78f53d1SNikolas Klauser long lrintf(float x); 238e78f53d1SNikolas Klauser long lrintl(long double x); 239e78f53d1SNikolas Klauser 240e78f53d1SNikolas Klauser long lround (arithmetic x); 241e78f53d1SNikolas Klauser long lroundf(float x); 242e78f53d1SNikolas Klauser long lroundl(long double x); 243e78f53d1SNikolas Klauser 244e78f53d1SNikolas Klauser double nan (const char* str); 245e78f53d1SNikolas Klauser float nanf(const char* str); 246e78f53d1SNikolas Klauser long double nanl(const char* str); 247e78f53d1SNikolas Klauser 248e78f53d1SNikolas Klauser floating_point nearbyint (arithmetic x); 249e78f53d1SNikolas Klauser float nearbyintf(float x); 250e78f53d1SNikolas Klauser long double nearbyintl(long double x); 251e78f53d1SNikolas Klauser 252e78f53d1SNikolas Klauser floating_point nextafter (arithmetic x, arithmetic y); 253e78f53d1SNikolas Klauser float nextafterf(float x, float y); 254e78f53d1SNikolas Klauser long double nextafterl(long double x, long double y); 255e78f53d1SNikolas Klauser 256e78f53d1SNikolas Klauser floating_point nexttoward (arithmetic x, long double y); 257e78f53d1SNikolas Klauser float nexttowardf(float x, long double y); 258e78f53d1SNikolas Klauser long double nexttowardl(long double x, long double y); 259e78f53d1SNikolas Klauser 260e78f53d1SNikolas Klauser floating_point remainder (arithmetic x, arithmetic y); 261e78f53d1SNikolas Klauser float remainderf(float x, float y); 262e78f53d1SNikolas Klauser long double remainderl(long double x, long double y); 263e78f53d1SNikolas Klauser 264e78f53d1SNikolas Klauser floating_point remquo (arithmetic x, arithmetic y, int* pquo); 265e78f53d1SNikolas Klauser float remquof(float x, float y, int* pquo); 266e78f53d1SNikolas Klauser long double remquol(long double x, long double y, int* pquo); 267e78f53d1SNikolas Klauser 268e78f53d1SNikolas Klauser floating_point rint (arithmetic x); 269e78f53d1SNikolas Klauser float rintf(float x); 270e78f53d1SNikolas Klauser long double rintl(long double x); 271e78f53d1SNikolas Klauser 272e78f53d1SNikolas Klauser floating_point round (arithmetic x); 273e78f53d1SNikolas Klauser float roundf(float x); 274e78f53d1SNikolas Klauser long double roundl(long double x); 275e78f53d1SNikolas Klauser 276e78f53d1SNikolas Klauser floating_point scalbln (arithmetic x, long ex); 277e78f53d1SNikolas Klauser float scalblnf(float x, long ex); 278e78f53d1SNikolas Klauser long double scalblnl(long double x, long ex); 279e78f53d1SNikolas Klauser 280e78f53d1SNikolas Klauser floating_point scalbn (arithmetic x, int ex); 281e78f53d1SNikolas Klauser float scalbnf(float x, int ex); 282e78f53d1SNikolas Klauser long double scalbnl(long double x, int ex); 283e78f53d1SNikolas Klauser 284e78f53d1SNikolas Klauser floating_point tgamma (arithmetic x); 285e78f53d1SNikolas Klauser float tgammaf(float x); 286e78f53d1SNikolas Klauser long double tgammal(long double x); 287e78f53d1SNikolas Klauser 288e78f53d1SNikolas Klauser floating_point trunc (arithmetic x); 289e78f53d1SNikolas Klauser float truncf(float x); 290e78f53d1SNikolas Klauser long double truncl(long double x); 291e78f53d1SNikolas Klauser 292e78f53d1SNikolas Klauser */ 293e78f53d1SNikolas Klauser 29473fbae83SNikolas Klauser # include <__cxx03/__config> 295e78f53d1SNikolas Klauser 296e78f53d1SNikolas Klauser # if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 297e78f53d1SNikolas Klauser # pragma GCC system_header 298e78f53d1SNikolas Klauser # endif 299e78f53d1SNikolas Klauser 300e78f53d1SNikolas Klauser # if __has_include_next(<math.h>) 301e78f53d1SNikolas Klauser # include_next <math.h> 302e78f53d1SNikolas Klauser # endif 303e78f53d1SNikolas Klauser 304e78f53d1SNikolas Klauser # ifdef __cplusplus 305e78f53d1SNikolas Klauser 306e78f53d1SNikolas Klauser // We support including .h headers inside 'extern "C"' contexts, so switch 307e78f53d1SNikolas Klauser // back to C++ linkage before including these C++ headers. 308e78f53d1SNikolas Klauser extern "C++" { 309e78f53d1SNikolas Klauser 310e78f53d1SNikolas Klauser # ifdef fpclassify 311e78f53d1SNikolas Klauser # undef fpclassify 312e78f53d1SNikolas Klauser # endif 313e78f53d1SNikolas Klauser 314e78f53d1SNikolas Klauser # ifdef signbit 315e78f53d1SNikolas Klauser # undef signbit 316e78f53d1SNikolas Klauser # endif 317e78f53d1SNikolas Klauser 318e78f53d1SNikolas Klauser # ifdef isfinite 319e78f53d1SNikolas Klauser # undef isfinite 320e78f53d1SNikolas Klauser # endif 321e78f53d1SNikolas Klauser 322e78f53d1SNikolas Klauser # ifdef isinf 323e78f53d1SNikolas Klauser # undef isinf 324e78f53d1SNikolas Klauser # endif 325e78f53d1SNikolas Klauser 326e78f53d1SNikolas Klauser # ifdef isnan 327e78f53d1SNikolas Klauser # undef isnan 328e78f53d1SNikolas Klauser # endif 329e78f53d1SNikolas Klauser 330e78f53d1SNikolas Klauser # ifdef isnormal 331e78f53d1SNikolas Klauser # undef isnormal 332e78f53d1SNikolas Klauser # endif 333e78f53d1SNikolas Klauser 334e78f53d1SNikolas Klauser # ifdef isgreater 335e78f53d1SNikolas Klauser # undef isgreater 336e78f53d1SNikolas Klauser # endif 337e78f53d1SNikolas Klauser 338e78f53d1SNikolas Klauser # ifdef isgreaterequal 339e78f53d1SNikolas Klauser # undef isgreaterequal 340e78f53d1SNikolas Klauser # endif 341e78f53d1SNikolas Klauser 342e78f53d1SNikolas Klauser # ifdef isless 343e78f53d1SNikolas Klauser # undef isless 344e78f53d1SNikolas Klauser # endif 345e78f53d1SNikolas Klauser 346e78f53d1SNikolas Klauser # ifdef islessequal 347e78f53d1SNikolas Klauser # undef islessequal 348e78f53d1SNikolas Klauser # endif 349e78f53d1SNikolas Klauser 350e78f53d1SNikolas Klauser # ifdef islessgreater 351e78f53d1SNikolas Klauser # undef islessgreater 352e78f53d1SNikolas Klauser # endif 353e78f53d1SNikolas Klauser 354e78f53d1SNikolas Klauser # ifdef isunordered 355e78f53d1SNikolas Klauser # undef isunordered 356e78f53d1SNikolas Klauser # endif 357e78f53d1SNikolas Klauser 35873fbae83SNikolas Klauser # include <__cxx03/__math/abs.h> 35973fbae83SNikolas Klauser # include <__cxx03/__math/copysign.h> 36073fbae83SNikolas Klauser # include <__cxx03/__math/error_functions.h> 36173fbae83SNikolas Klauser # include <__cxx03/__math/exponential_functions.h> 36273fbae83SNikolas Klauser # include <__cxx03/__math/fdim.h> 36373fbae83SNikolas Klauser # include <__cxx03/__math/fma.h> 36473fbae83SNikolas Klauser # include <__cxx03/__math/gamma.h> 36573fbae83SNikolas Klauser # include <__cxx03/__math/hyperbolic_functions.h> 36673fbae83SNikolas Klauser # include <__cxx03/__math/hypot.h> 36773fbae83SNikolas Klauser # include <__cxx03/__math/inverse_hyperbolic_functions.h> 36873fbae83SNikolas Klauser # include <__cxx03/__math/inverse_trigonometric_functions.h> 36973fbae83SNikolas Klauser # include <__cxx03/__math/logarithms.h> 37073fbae83SNikolas Klauser # include <__cxx03/__math/min_max.h> 37173fbae83SNikolas Klauser # include <__cxx03/__math/modulo.h> 37273fbae83SNikolas Klauser # include <__cxx03/__math/remainder.h> 37373fbae83SNikolas Klauser # include <__cxx03/__math/roots.h> 37473fbae83SNikolas Klauser # include <__cxx03/__math/rounding_functions.h> 37573fbae83SNikolas Klauser # include <__cxx03/__math/traits.h> 37673fbae83SNikolas Klauser # include <__cxx03/__math/trigonometric_functions.h> 37773fbae83SNikolas Klauser # include <__cxx03/__type_traits/enable_if.h> 37873fbae83SNikolas Klauser # include <__cxx03/__type_traits/is_floating_point.h> 37973fbae83SNikolas Klauser # include <__cxx03/__type_traits/is_integral.h> 38073fbae83SNikolas Klauser # include <__cxx03/stdlib.h> 381e78f53d1SNikolas Klauser 382e78f53d1SNikolas Klauser // fpclassify relies on implementation-defined constants, so we can't move it to a detail header 383e78f53d1SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 384e78f53d1SNikolas Klauser 385e78f53d1SNikolas Klauser namespace __math { 386e78f53d1SNikolas Klauser 387e78f53d1SNikolas Klauser // fpclassify 388e78f53d1SNikolas Klauser 389e78f53d1SNikolas Klauser // template on non-double overloads to make them weaker than same overloads from MSVC runtime 390e78f53d1SNikolas Klauser template <class = int> 391e78f53d1SNikolas Klauser _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI int fpclassify(float __x) _NOEXCEPT { 392e78f53d1SNikolas Klauser return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x); 393e78f53d1SNikolas Klauser } 394e78f53d1SNikolas Klauser 395e78f53d1SNikolas Klauser template <class = int> 396e78f53d1SNikolas Klauser _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI int fpclassify(double __x) _NOEXCEPT { 397e78f53d1SNikolas Klauser return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x); 398e78f53d1SNikolas Klauser } 399e78f53d1SNikolas Klauser 400e78f53d1SNikolas Klauser template <class = int> 401e78f53d1SNikolas Klauser _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI int fpclassify(long double __x) _NOEXCEPT { 402e78f53d1SNikolas Klauser return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x); 403e78f53d1SNikolas Klauser } 404e78f53d1SNikolas Klauser 405e78f53d1SNikolas Klauser template <class _A1, std::__enable_if_t<std::is_integral<_A1>::value, int> = 0> 406e78f53d1SNikolas Klauser _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI int fpclassify(_A1 __x) _NOEXCEPT { 407e78f53d1SNikolas Klauser return __x == 0 ? FP_ZERO : FP_NORMAL; 408e78f53d1SNikolas Klauser } 409e78f53d1SNikolas Klauser 410e78f53d1SNikolas Klauser } // namespace __math 411e78f53d1SNikolas Klauser 412e78f53d1SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 413e78f53d1SNikolas Klauser 414e78f53d1SNikolas Klauser using std::__math::fpclassify; 415e78f53d1SNikolas Klauser using std::__math::signbit; 416e78f53d1SNikolas Klauser 417e78f53d1SNikolas Klauser // The MSVC runtime already provides these functions as templates 418e78f53d1SNikolas Klauser # ifndef _LIBCPP_MSVCRT 419e78f53d1SNikolas Klauser using std::__math::isfinite; 420e78f53d1SNikolas Klauser using std::__math::isgreater; 421e78f53d1SNikolas Klauser using std::__math::isgreaterequal; 422e78f53d1SNikolas Klauser using std::__math::isinf; 423e78f53d1SNikolas Klauser using std::__math::isless; 424e78f53d1SNikolas Klauser using std::__math::islessequal; 425e78f53d1SNikolas Klauser using std::__math::islessgreater; 426e78f53d1SNikolas Klauser using std::__math::isnan; 427e78f53d1SNikolas Klauser using std::__math::isnormal; 428e78f53d1SNikolas Klauser using std::__math::isunordered; 429e78f53d1SNikolas Klauser # endif // _LIBCPP_MSVCRT 430e78f53d1SNikolas Klauser 431e78f53d1SNikolas Klauser // abs 432e78f53d1SNikolas Klauser // 433e78f53d1SNikolas Klauser // handled in stdlib.h 434e78f53d1SNikolas Klauser 435e78f53d1SNikolas Klauser // div 436e78f53d1SNikolas Klauser // 437e78f53d1SNikolas Klauser // handled in stdlib.h 438e78f53d1SNikolas Klauser 439e78f53d1SNikolas Klauser // We have to provide double overloads for <math.h> to work on platforms that don't provide the full set of math 440e78f53d1SNikolas Klauser // functions. To make the overload set work with multiple functions that take the same arguments, we make our overloads 441e78f53d1SNikolas Klauser // templates. Functions are preferred over function templates during overload resolution, which means that our overload 442e78f53d1SNikolas Klauser // will only be selected when the C library doesn't provide one. 443e78f53d1SNikolas Klauser 444e78f53d1SNikolas Klauser using std::__math::acos; 445e78f53d1SNikolas Klauser using std::__math::acosh; 446e78f53d1SNikolas Klauser using std::__math::asin; 447e78f53d1SNikolas Klauser using std::__math::asinh; 448e78f53d1SNikolas Klauser using std::__math::atan; 449e78f53d1SNikolas Klauser using std::__math::atan2; 450e78f53d1SNikolas Klauser using std::__math::atanh; 451e78f53d1SNikolas Klauser using std::__math::cbrt; 452e78f53d1SNikolas Klauser using std::__math::ceil; 453e78f53d1SNikolas Klauser using std::__math::copysign; 454e78f53d1SNikolas Klauser using std::__math::cos; 455e78f53d1SNikolas Klauser using std::__math::cosh; 456e78f53d1SNikolas Klauser using std::__math::erf; 457e78f53d1SNikolas Klauser using std::__math::erfc; 458e78f53d1SNikolas Klauser using std::__math::exp; 459e78f53d1SNikolas Klauser using std::__math::exp2; 460e78f53d1SNikolas Klauser using std::__math::expm1; 461e78f53d1SNikolas Klauser using std::__math::fabs; 462e78f53d1SNikolas Klauser using std::__math::fdim; 463e78f53d1SNikolas Klauser using std::__math::floor; 464e78f53d1SNikolas Klauser using std::__math::fma; 465e78f53d1SNikolas Klauser using std::__math::fmax; 466e78f53d1SNikolas Klauser using std::__math::fmin; 467e78f53d1SNikolas Klauser using std::__math::fmod; 468e78f53d1SNikolas Klauser using std::__math::frexp; 469e78f53d1SNikolas Klauser using std::__math::hypot; 470e78f53d1SNikolas Klauser using std::__math::ilogb; 471e78f53d1SNikolas Klauser using std::__math::ldexp; 472e78f53d1SNikolas Klauser using std::__math::lgamma; 473e78f53d1SNikolas Klauser using std::__math::llrint; 474e78f53d1SNikolas Klauser using std::__math::llround; 475e78f53d1SNikolas Klauser using std::__math::log; 476e78f53d1SNikolas Klauser using std::__math::log10; 477e78f53d1SNikolas Klauser using std::__math::log1p; 478e78f53d1SNikolas Klauser using std::__math::log2; 479e78f53d1SNikolas Klauser using std::__math::logb; 480e78f53d1SNikolas Klauser using std::__math::lrint; 481e78f53d1SNikolas Klauser using std::__math::lround; 482e78f53d1SNikolas Klauser using std::__math::modf; 483e78f53d1SNikolas Klauser using std::__math::nearbyint; 484e78f53d1SNikolas Klauser using std::__math::nextafter; 485e78f53d1SNikolas Klauser using std::__math::nexttoward; 486e78f53d1SNikolas Klauser using std::__math::pow; 487e78f53d1SNikolas Klauser using std::__math::remainder; 488e78f53d1SNikolas Klauser using std::__math::remquo; 489e78f53d1SNikolas Klauser using std::__math::rint; 490e78f53d1SNikolas Klauser using std::__math::round; 491e78f53d1SNikolas Klauser using std::__math::scalbln; 492e78f53d1SNikolas Klauser using std::__math::scalbn; 493e78f53d1SNikolas Klauser using std::__math::signbit; 494e78f53d1SNikolas Klauser using std::__math::sin; 495e78f53d1SNikolas Klauser using std::__math::sinh; 496e78f53d1SNikolas Klauser using std::__math::sqrt; 497e78f53d1SNikolas Klauser using std::__math::tan; 498e78f53d1SNikolas Klauser using std::__math::tanh; 499e78f53d1SNikolas Klauser using std::__math::tgamma; 500e78f53d1SNikolas Klauser using std::__math::trunc; 501e78f53d1SNikolas Klauser 502e78f53d1SNikolas Klauser } // extern "C++" 503e78f53d1SNikolas Klauser 504e78f53d1SNikolas Klauser # endif // __cplusplus 505e78f53d1SNikolas Klauser 506*ce777190SNikolas Klauser #else // _LIBCPP___CXX03_MATH_H 507e78f53d1SNikolas Klauser 508e78f53d1SNikolas Klauser // This include lives outside the header guard in order to support an MSVC 509e78f53d1SNikolas Klauser // extension which allows users to do: 510e78f53d1SNikolas Klauser // 511e78f53d1SNikolas Klauser // #define _USE_MATH_DEFINES 51273fbae83SNikolas Klauser // #include <__cxx03/math.h> 513e78f53d1SNikolas Klauser // 514e78f53d1SNikolas Klauser // and receive the definitions of mathematical constants, even if <math.h> 515e78f53d1SNikolas Klauser // has previously been included. 516e78f53d1SNikolas Klauser # if defined(_LIBCPP_MSVCRT) && defined(_USE_MATH_DEFINES) 517e78f53d1SNikolas Klauser # include_next <math.h> 518e78f53d1SNikolas Klauser # endif 519e78f53d1SNikolas Klauser 520*ce777190SNikolas Klauser #endif // _LIBCPP___CXX03_MATH_H 521