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