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