1#ifndef _MATH_H 2#define _MATH_H 3 4#ifdef __cplusplus 5extern "C" { 6#endif 7 8#include <features.h> 9 10#define __NEED_float_t 11#define __NEED_double_t 12#include <bits/alltypes.h> 13 14#if 100*__GNUC__+__GNUC_MINOR__ >= 303 15#define NAN __builtin_nanf("") 16#define INFINITY __builtin_inff() 17#else 18#define NAN (0.0f/0.0f) 19#define INFINITY 1e5000f 20#endif 21 22#define HUGE_VALF INFINITY 23#define HUGE_VAL ((double)INFINITY) 24#define HUGE_VALL ((long double)INFINITY) 25 26#define MATH_ERRNO 1 27#define MATH_ERREXCEPT 2 28#define math_errhandling 2 29 30#define FP_ILOGBNAN (-1-0x7fffffff) 31#define FP_ILOGB0 FP_ILOGBNAN 32 33#define FP_NAN 0 34#define FP_INFINITE 1 35#define FP_ZERO 2 36#define FP_SUBNORMAL 3 37#define FP_NORMAL 4 38 39#ifdef __FP_FAST_FMA 40#define FP_FAST_FMA 1 41#endif 42 43#ifdef __FP_FAST_FMAF 44#define FP_FAST_FMAF 1 45#endif 46 47#ifdef __FP_FAST_FMAL 48#define FP_FAST_FMAL 1 49#endif 50 51int __fpclassify(double); 52int __fpclassifyf(float); 53int __fpclassifyl(long double); 54 55static __inline unsigned __FLOAT_BITS(float __f) 56{ 57 union {float __f; unsigned __i;} __u; 58 __u.__f = __f; 59 return __u.__i; 60} 61static __inline unsigned long long __DOUBLE_BITS(double __f) 62{ 63 union {double __f; unsigned long long __i;} __u; 64 __u.__f = __f; 65 return __u.__i; 66} 67 68#define fpclassify(x) ( \ 69 sizeof(x) == sizeof(float) ? __fpclassifyf(x) : \ 70 sizeof(x) == sizeof(double) ? __fpclassify(x) : \ 71 __fpclassifyl(x) ) 72 73#define isinf(x) ( \ 74 sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x) & 0x7fffffff) == 0x7f800000 : \ 75 sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL>>1) == 0x7ffULL<<52 : \ 76 __fpclassifyl(x) == FP_INFINITE) 77 78#define isnan(x) ( \ 79 sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x) & 0x7fffffff) > 0x7f800000 : \ 80 sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL>>1) > 0x7ffULL<<52 : \ 81 __fpclassifyl(x) == FP_NAN) 82 83#define isnormal(x) ( \ 84 sizeof(x) == sizeof(float) ? ((__FLOAT_BITS(x)+0x00800000) & 0x7fffffff) >= 0x01000000 : \ 85 sizeof(x) == sizeof(double) ? ((__DOUBLE_BITS(x)+(1ULL<<52)) & -1ULL>>1) >= 1ULL<<53 : \ 86 __fpclassifyl(x) == FP_NORMAL) 87 88#define isfinite(x) ( \ 89 sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x) & 0x7fffffff) < 0x7f800000 : \ 90 sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL>>1) < 0x7ffULL<<52 : \ 91 __fpclassifyl(x) > FP_INFINITE) 92 93int __signbit(double); 94int __signbitf(float); 95int __signbitl(long double); 96 97#define signbit(x) ( \ 98 sizeof(x) == sizeof(float) ? (int)(__FLOAT_BITS(x)>>31) : \ 99 sizeof(x) == sizeof(double) ? (int)(__DOUBLE_BITS(x)>>63) : \ 100 __signbitl(x) ) 101 102#define isunordered(x,y) (isnan((x)) ? ((void)(y),1) : isnan((y))) 103 104#define __ISREL_DEF(rel, op, type) \ 105static __inline int __is##rel(type __x, type __y) \ 106{ return !isunordered(__x,__y) && __x op __y; } 107 108__ISREL_DEF(lessf, <, float_t) 109__ISREL_DEF(less, <, double_t) 110__ISREL_DEF(lessl, <, long double) 111__ISREL_DEF(lessequalf, <=, float_t) 112__ISREL_DEF(lessequal, <=, double_t) 113__ISREL_DEF(lessequall, <=, long double) 114__ISREL_DEF(lessgreaterf, !=, float_t) 115__ISREL_DEF(lessgreater, !=, double_t) 116__ISREL_DEF(lessgreaterl, !=, long double) 117__ISREL_DEF(greaterf, >, float_t) 118__ISREL_DEF(greater, >, double_t) 119__ISREL_DEF(greaterl, >, long double) 120__ISREL_DEF(greaterequalf, >=, float_t) 121__ISREL_DEF(greaterequal, >=, double_t) 122__ISREL_DEF(greaterequall, >=, long double) 123 124#define __tg_pred_2(x, y, p) ( \ 125 sizeof((x)+(y)) == sizeof(float) ? p##f(x, y) : \ 126 sizeof((x)+(y)) == sizeof(double) ? p(x, y) : \ 127 p##l(x, y) ) 128 129#define isless(x, y) __tg_pred_2(x, y, __isless) 130#define islessequal(x, y) __tg_pred_2(x, y, __islessequal) 131#define islessgreater(x, y) __tg_pred_2(x, y, __islessgreater) 132#define isgreater(x, y) __tg_pred_2(x, y, __isgreater) 133#define isgreaterequal(x, y) __tg_pred_2(x, y, __isgreaterequal) 134 135double acos(double); 136float acosf(float); 137long double acosl(long double); 138 139double acosh(double); 140float acoshf(float); 141long double acoshl(long double); 142 143double asin(double); 144float asinf(float); 145long double asinl(long double); 146 147double asinh(double); 148float asinhf(float); 149long double asinhl(long double); 150 151double atan(double); 152float atanf(float); 153long double atanl(long double); 154 155double atan2(double, double); 156float atan2f(float, float); 157long double atan2l(long double, long double); 158 159double atanh(double); 160float atanhf(float); 161long double atanhl(long double); 162 163double cbrt(double); 164float cbrtf(float); 165long double cbrtl(long double); 166 167double ceil(double); 168float ceilf(float); 169long double ceill(long double); 170 171double copysign(double, double); 172float copysignf(float, float); 173long double copysignl(long double, long double); 174 175double cos(double); 176float cosf(float); 177long double cosl(long double); 178 179double cosh(double); 180float coshf(float); 181long double coshl(long double); 182 183double erf(double); 184float erff(float); 185long double erfl(long double); 186 187double erfc(double); 188float erfcf(float); 189long double erfcl(long double); 190 191double exp(double); 192float expf(float); 193long double expl(long double); 194 195double exp2(double); 196float exp2f(float); 197long double exp2l(long double); 198 199double expm1(double); 200float expm1f(float); 201long double expm1l(long double); 202 203double fabs(double); 204float fabsf(float); 205long double fabsl(long double); 206 207double fdim(double, double); 208float fdimf(float, float); 209long double fdiml(long double, long double); 210 211double floor(double); 212float floorf(float); 213long double floorl(long double); 214 215double fma(double, double, double); 216float fmaf(float, float, float); 217long double fmal(long double, long double, long double); 218 219double fmax(double, double); 220float fmaxf(float, float); 221long double fmaxl(long double, long double); 222 223double fmin(double, double); 224float fminf(float, float); 225long double fminl(long double, long double); 226 227double fmod(double, double); 228float fmodf(float, float); 229long double fmodl(long double, long double); 230 231double frexp(double, int *); 232float frexpf(float, int *); 233long double frexpl(long double, int *); 234 235double hypot(double, double); 236float hypotf(float, float); 237long double hypotl(long double, long double); 238 239int ilogb(double); 240int ilogbf(float); 241int ilogbl(long double); 242 243double ldexp(double, int); 244float ldexpf(float, int); 245long double ldexpl(long double, int); 246 247double lgamma(double); 248float lgammaf(float); 249long double lgammal(long double); 250 251long long llrint(double); 252long long llrintf(float); 253long long llrintl(long double); 254 255long long llround(double); 256long long llroundf(float); 257long long llroundl(long double); 258 259double log(double); 260float logf(float); 261long double logl(long double); 262 263double log10(double); 264float log10f(float); 265long double log10l(long double); 266 267double log1p(double); 268float log1pf(float); 269long double log1pl(long double); 270 271double log2(double); 272float log2f(float); 273long double log2l(long double); 274 275double logb(double); 276float logbf(float); 277long double logbl(long double); 278 279long lrint(double); 280long lrintf(float); 281long lrintl(long double); 282 283long lround(double); 284long lroundf(float); 285long lroundl(long double); 286 287double modf(double, double *); 288float modff(float, float *); 289long double modfl(long double, long double *); 290 291double nan(const char *); 292float nanf(const char *); 293long double nanl(const char *); 294 295double nearbyint(double); 296float nearbyintf(float); 297long double nearbyintl(long double); 298 299double nextafter(double, double); 300float nextafterf(float, float); 301long double nextafterl(long double, long double); 302 303double nexttoward(double, long double); 304float nexttowardf(float, long double); 305long double nexttowardl(long double, long double); 306 307double pow(double, double); 308float powf(float, float); 309long double powl(long double, long double); 310 311double remainder(double, double); 312float remainderf(float, float); 313long double remainderl(long double, long double); 314 315double remquo(double, double, int *); 316float remquof(float, float, int *); 317long double remquol(long double, long double, int *); 318 319double rint(double); 320float rintf(float); 321long double rintl(long double); 322 323double round(double); 324float roundf(float); 325long double roundl(long double); 326 327double scalbln(double, long); 328float scalblnf(float, long); 329long double scalblnl(long double, long); 330 331double scalbn(double, int); 332float scalbnf(float, int); 333long double scalbnl(long double, int); 334 335double sin(double); 336float sinf(float); 337long double sinl(long double); 338 339double sinh(double); 340float sinhf(float); 341long double sinhl(long double); 342 343double sqrt(double); 344float sqrtf(float); 345long double sqrtl(long double); 346 347double tan(double); 348float tanf(float); 349long double tanl(long double); 350 351double tanh(double); 352float tanhf(float); 353long double tanhl(long double); 354 355double tgamma(double); 356float tgammaf(float); 357long double tgammal(long double); 358 359double trunc(double); 360float truncf(float); 361long double truncl(long double); 362 363 364#if defined(_XOPEN_SOURCE) || defined(_BSD_SOURCE) 365#undef MAXFLOAT 366#define MAXFLOAT 3.40282346638528859812e+38F 367#endif 368 369#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) 370#define M_E 2.7182818284590452354 /* e */ 371#define M_LOG2E 1.4426950408889634074 /* log_2 e */ 372#define M_LOG10E 0.43429448190325182765 /* log_10 e */ 373#define M_LN2 0.69314718055994530942 /* log_e 2 */ 374#define M_LN10 2.30258509299404568402 /* log_e 10 */ 375#define M_PI 3.14159265358979323846 /* pi */ 376#define M_PI_2 1.57079632679489661923 /* pi/2 */ 377#define M_PI_4 0.78539816339744830962 /* pi/4 */ 378#define M_1_PI 0.31830988618379067154 /* 1/pi */ 379#define M_2_PI 0.63661977236758134308 /* 2/pi */ 380#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */ 381#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ 382#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ 383 384extern int signgam; 385 386double j0(double); 387double j1(double); 388double jn(int, double); 389 390double y0(double); 391double y1(double); 392double yn(int, double); 393#endif 394 395#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) 396#define HUGE 3.40282346638528859812e+38F 397 398double drem(double, double); 399float dremf(float, float); 400 401int finite(double); 402int finitef(float); 403 404double scalb(double, double); 405float scalbf(float, float); 406 407double significand(double); 408float significandf(float); 409 410double lgamma_r(double, int*); 411float lgammaf_r(float, int*); 412 413float j0f(float); 414float j1f(float); 415float jnf(int, float); 416 417float y0f(float); 418float y1f(float); 419float ynf(int, float); 420#endif 421 422#ifdef _GNU_SOURCE 423long double lgammal_r(long double, int*); 424 425void sincos(double, double*, double*); 426void sincosf(float, float*, float*); 427void sincosl(long double, long double*, long double*); 428 429double exp10(double); 430float exp10f(float); 431long double exp10l(long double); 432 433double pow10(double); 434float pow10f(float); 435long double pow10l(long double); 436#endif 437 438#ifdef __cplusplus 439} 440#endif 441 442#endif 443