- crt: Use ANSI C types
[reactos.git] / reactos / include / crt / math.h
1 /**
2 * This file has no copyright assigned and is placed in the Public Domain.
3 * This file is part of the w64 mingw-runtime package.
4 * No warranty is given; refer to the file DISCLAIMER within this package.
5 */
6 #ifndef _INC_MATH
7 #define _INC_MATH
8
9 #include <crtdefs.h>
10
11 struct exception;
12
13 #pragma pack(push,_CRT_PACKING)
14
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18
19 #ifndef _EXCEPTION_DEFINED
20 #define _EXCEPTION_DEFINED
21 struct _exception {
22 int type;
23 char *name;
24 double arg1;
25 double arg2;
26 double retval;
27 };
28 #endif
29
30 #ifndef _COMPLEX_DEFINED
31 #define _COMPLEX_DEFINED
32 struct _complex {
33 double x,y;
34 };
35 #endif
36
37 #define _DOMAIN 1
38 #define _SING 2
39 #define _OVERFLOW 3
40 #define _UNDERFLOW 4
41 #define _TLOSS 5
42 #define _PLOSS 6
43
44 #define EDOM 33
45 #define ERANGE 34
46
47 _CRTIMP extern double _HUGE;
48
49 #define HUGE_VAL _HUGE
50
51 #ifndef _CRT_ABS_DEFINED
52 #define _CRT_ABS_DEFINED
53 int __cdecl abs(int _X);
54 long __cdecl labs(long _X);
55 #endif
56 double __cdecl acos(double _X);
57 double __cdecl asin(double _X);
58 double __cdecl atan(double _X);
59 double __cdecl atan2(double _Y,double _X);
60 #ifndef _SIGN_DEFINED
61 #define _SIGN_DEFINED
62 _CRTIMP double __cdecl _copysign (double _Number,double _Sign);
63 _CRTIMP double __cdecl _chgsign (double _X);
64 #endif
65 double __cdecl cos(double _X);
66 double __cdecl cosh(double _X);
67 double __cdecl exp(double _X);
68 double expm1(double _X);
69 double __cdecl fabs(double _X);
70 double __cdecl fmod(double _X,double _Y);
71 double __cdecl log(double _X);
72 double __cdecl log10(double _X);
73 double __cdecl pow(double _X,double _Y);
74 double __cdecl sin(double _X);
75 double __cdecl sinh(double _X);
76 double __cdecl tan(double _X);
77 double __cdecl tanh(double _X);
78 double __cdecl sqrt(double _X);
79 #ifndef _CRT_ATOF_DEFINED
80 #define _CRT_ATOF_DEFINED
81 double __cdecl atof(const char *_String);
82 double __cdecl _atof_l(const char *_String,_locale_t _Locale);
83 #endif
84
85 _CRTIMP double __cdecl _cabs(struct _complex _ComplexA);
86 _CRTIMP double __cdecl ceil(double _X);
87 _CRTIMP double __cdecl floor(double _X);
88 _CRTIMP double __cdecl frexp(double _X,int *_Y);
89 _CRTIMP double __cdecl _hypot(double _X,double _Y);
90 _CRTIMP double __cdecl _j0(double _X);
91 _CRTIMP double __cdecl _j1(double _X);
92 _CRTIMP double __cdecl _jn(int _X,double _Y);
93 _CRTIMP double __cdecl ldexp(double _X,int _Y);
94 #ifndef _CRT_MATHERR_DEFINED
95 #define _CRT_MATHERR_DEFINED
96 int __cdecl _matherr(struct _exception *_Except);
97 #endif
98 _CRTIMP double __cdecl modf(double _X,double *_Y);
99 _CRTIMP double __cdecl _y0(double _X);
100 _CRTIMP double __cdecl _y1(double _X);
101 _CRTIMP double __cdecl _yn(int _X,double _Y);
102
103 #if defined(__i386__) || defined(_M_IX86)
104 _CRTIMP int __cdecl _set_SSE2_enable(int _Flag);
105 /* from libmingwex */
106 float __cdecl _hypotf(float _X,float _Y);
107 #endif
108
109 float frexpf(float _X,int *_Y);
110 float __cdecl ldexpf(float _X,int _Y);
111 long double __cdecl ldexpl(long double _X,int _Y);
112 float __cdecl acosf(float _X);
113 float __cdecl asinf(float _X);
114 float __cdecl atanf(float _X);
115 float __cdecl atan2f(float _X,float _Y);
116 float __cdecl cosf(float _X);
117 float __cdecl sinf(float _X);
118 float __cdecl tanf(float _X);
119 float __cdecl coshf(float _X);
120 float __cdecl sinhf(float _X);
121 float __cdecl tanhf(float _X);
122 float __cdecl expf(float _X);
123 float expm1f(float _X);
124 float __cdecl logf(float _X);
125 float __cdecl log10f(float _X);
126 float __cdecl modff(float _X,float *_Y);
127 float __cdecl powf(float _X,float _Y);
128 float __cdecl sqrtf(float _X);
129 float __cdecl ceilf(float _X);
130 float __cdecl floorf(float _X);
131 float __cdecl fmodf(float _X,float _Y);
132 float __cdecl _hypotf(float _X,float _Y);
133 float __cdecl fabsf(float _X);
134 #if !defined(__ia64__) && !defined(_M_IA64)
135 /* from libmingwex */
136 float __cdecl _copysignf (float _Number,float _Sign);
137 float __cdecl _chgsignf (float _X);
138 float __cdecl _logbf(float _X);
139 float __cdecl _nextafterf(float _X,float _Y);
140 int __cdecl _finitef(float _X);
141 int __cdecl _isnanf(float _X);
142 int __cdecl _fpclassf(float _X);
143 #endif
144
145 #if defined(__GNUC__)
146
147 #define __fabs(x, res) \
148 __asm__ ("fabs;" : "=t" (res) : "0" (x))
149
150 #elif defined(_MSC_VER)
151
152 #define __fabs(x, res) \
153 __asm { fld [(x)] } \
154 __asm { fabs } \
155 __asm { fstp [(res)] }
156
157 #endif
158
159 __CRT_INLINE long double __cdecl fabsl (long double x)
160 {
161 long double res;
162 __fabs(x, res);
163 return res;
164 }
165
166 __CRT_INLINE long double _chgsignl(long double _Number) { return _chgsign((double)(_Number)); }
167 __CRT_INLINE long double _copysignl(long double _Number,long double _Sign) { return _copysign((double)(_Number),(double)(_Sign)); }
168 __CRT_INLINE long double _hypotl(long double _X,long double _Y) { return _hypot((double)(_X),(double)(_Y)); }
169 __CRT_INLINE float frexpf(float _X,int *_Y) { return ((float)frexp((double)_X,_Y)); }
170
171 #if !defined (__ia64__) && !defined (_M_IA64)
172 __CRT_INLINE float __cdecl fabsf (float x)
173 {
174 float res;
175 __fabs(x, res);
176 return res;
177 }
178
179 __CRT_INLINE float __cdecl ldexpf (float x, int expn) { return (float) ldexp (x, expn); }
180 #endif
181
182 #define _matherrl _matherr
183
184 __CRT_INLINE long double modfl(long double _X,long double *_Y) {
185 double _Di,_Df = modf((double)_X,&_Di);
186 *_Y = (long double)_Di;
187 return (_Df);
188 }
189
190 #if !defined(__x86_64) && !defined(_M_AMD64)
191 __CRT_INLINE float acosf(float _X) { return ((float)acos((double)_X)); }
192 __CRT_INLINE float asinf(float _X) { return ((float)asin((double)_X)); }
193 __CRT_INLINE float atanf(float _X) { return ((float)atan((double)_X)); }
194 __CRT_INLINE float atan2f(float _X,float _Y) { return ((float)atan2((double)_X,(double)_Y)); }
195 __CRT_INLINE float ceilf(float _X) { return ((float)ceil((double)_X)); }
196 __CRT_INLINE float cosf(float _X) { return ((float)cos((double)_X)); }
197 __CRT_INLINE float coshf(float _X) { return ((float)cosh((double)_X)); }
198 __CRT_INLINE float expf(float _X) { return ((float)exp((double)_X)); }
199 __CRT_INLINE float floorf(float _X) { return ((float)floor((double)_X)); }
200 __CRT_INLINE float fmodf(float _X,float _Y) { return ((float)fmod((double)_X,(double)_Y)); }
201 __CRT_INLINE float logf(float _X) { return ((float)log((double)_X)); }
202 __CRT_INLINE float log10f(float _X) { return ((float)log10((double)_X)); }
203 __CRT_INLINE float modff(float _X,float *_Y) {
204 double _Di,_Df = modf((double)_X,&_Di);
205 *_Y = (float)_Di;
206 return ((float)_Df);
207 }
208 __CRT_INLINE float powf(float _X,float _Y) { return ((float)pow((double)_X,(double)_Y)); }
209 __CRT_INLINE float sinf(float _X) { return ((float)sin((double)_X)); }
210 __CRT_INLINE float sinhf(float _X) { return ((float)sinh((double)_X)); }
211 __CRT_INLINE float sqrtf(float _X) { return ((float)sqrt((double)_X)); }
212 __CRT_INLINE float tanf(float _X) { return ((float)tan((double)_X)); }
213 __CRT_INLINE float tanhf(float _X) { return ((float)tanh((double)_X)); }
214 #endif
215
216 #ifndef NO_OLDNAMES
217 #define DOMAIN _DOMAIN
218 #define SING _SING
219 #define OVERFLOW _OVERFLOW
220 #define UNDERFLOW _UNDERFLOW
221 #define TLOSS _TLOSS
222 #define PLOSS _PLOSS
223 #define matherr _matherr
224
225 #define HUGE _HUGE
226 /* double __cdecl cabs(struct _complex _X); */
227 double __cdecl hypot(double _X,double _Y);
228 __CRT_INLINE float __cdecl hypotf (float x, float y)
229 { return (float) hypot (x, y);}
230 _CRTIMP double __cdecl j0(double _X);
231 _CRTIMP double __cdecl j1(double _X);
232 _CRTIMP double __cdecl jn(int _X,double _Y);
233 _CRTIMP double __cdecl y0(double _X);
234 _CRTIMP double __cdecl y1(double _X);
235 _CRTIMP double __cdecl yn(int _X,double _Y);
236 #endif
237
238 #ifndef __NO_ISOCEXT
239 #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \
240 || !defined __STRICT_ANSI__ || defined __GLIBCPP__
241
242 #define NAN (0.0F/0.0F)
243 #define HUGE_VALF (1.0F/0.0F)
244 #define HUGE_VALL (1.0L/0.0L)
245 #define INFINITY (1.0F/0.0F)
246
247
248 #define FP_NAN 0x0100
249 #define FP_NORMAL 0x0400
250 #define FP_INFINITE (FP_NAN | FP_NORMAL)
251 #define FP_ZERO 0x4000
252 #define FP_SUBNORMAL (FP_NORMAL | FP_ZERO)
253 /* 0x0200 is signbit mask */
254
255 #if defined(__GNUC__)
256
257 #define __fxam(x, sw) \
258 __asm__ ("fxam; fstsw %%ax;" : "=a" (sw): "t" (x))
259
260 #elif defined(_MSC_VER)
261
262 #define __fxam(x, sw) \
263 __asm { fld [(x)] } \
264 __asm { fxam } \
265 __asm { wait } \
266 __asm { fnstsw [(sw)] } \
267 __asm { fstp st(0) }
268
269 #endif
270
271 /*
272 We can't __CRT_INLINE float or double, because we want to ensure truncation
273 to semantic type before classification.
274 (A normal long double value might become subnormal when
275 converted to double, and zero when converted to float.)
276 */
277
278 extern int __cdecl __fpclassifyf (float);
279 extern int __cdecl __fpclassify (double);
280
281 __CRT_INLINE int __cdecl __fpclassifyl (long double x){
282 unsigned short sw;
283 __fxam(x, sw);
284 return sw & (FP_NAN | FP_NORMAL | FP_ZERO );
285 }
286
287 __CRT_INLINE int __cdecl __fpclassify (double x){
288 return __fpclassifyl((long double)x);
289 }
290
291 #define fpclassify(x) (sizeof (x) == sizeof (float) ? __fpclassifyf (x) \
292 : sizeof (x) == sizeof (double) ? __fpclassify (x) \
293 : __fpclassifyl (x))
294
295 /* 7.12.3.2 */
296 #define isfinite(x) ((fpclassify(x) & FP_NAN) == 0)
297
298 /* 7.12.3.3 */
299 /* #define isinf(x) (fpclassify(x) == FP_INFINITE) */
300
301 /* we don't have fpclassify */
302 __CRT_INLINE int isinf (double d) {
303 int expon = 0;
304 double val = frexp (d, &expon);
305 if (expon == 1025) {
306 if (val == 0.5) {
307 return 1;
308 } else if (val == -0.5) {
309 return -1;
310 } else {
311 return 0;
312 }
313 } else {
314 return 0;
315 }
316 }
317
318 /* 7.12.3.4 */
319 /* We don't need to worry about truncation here:
320 A NaN stays a NaN. */
321
322 __CRT_INLINE int __cdecl __isnan (double _x)
323 {
324 unsigned short sw;
325 __fxam(_x, sw);
326 return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))
327 == FP_NAN;
328 }
329
330 __CRT_INLINE int __cdecl __isnanf (float _x)
331 {
332 unsigned short sw;
333 __fxam(_x, sw);
334 return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))
335 == FP_NAN;
336 }
337
338 __CRT_INLINE int __cdecl __isnanl (long double _x)
339 {
340 unsigned short sw;
341 __fxam(_x, sw);
342 return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))
343 == FP_NAN;
344 }
345
346
347 #define isnan(x) (sizeof (x) == sizeof (float) ? __isnanf (x) \
348 : sizeof (x) == sizeof (double) ? __isnan (x) \
349 : __isnanl (x))
350
351 /* 7.12.3.5 */
352 #define isnormal(x) (fpclassify(x) == FP_NORMAL)
353
354 /* 7.12.3.6 The signbit macro */
355 __CRT_INLINE int __cdecl __signbit (double x) {
356 unsigned short stw;
357 __fxam(x, stw);
358 return stw & 0x0200;
359 }
360
361 __CRT_INLINE int __cdecl __signbitf (float x) {
362 unsigned short stw;
363 __fxam(x, stw);
364 return stw & 0x0200;
365 }
366
367 __CRT_INLINE int __cdecl __signbitl (long double x) {
368 unsigned short stw;
369 __fxam(x, stw);
370 return stw & 0x0200;
371 }
372
373 #define signbit(x) (sizeof (x) == sizeof (float) ? __signbitf (x) \
374 : sizeof (x) == sizeof (double) ? __signbit (x) \
375 : __signbitl (x))
376
377 extern double __cdecl exp2(double);
378 extern float __cdecl exp2f(float);
379 extern long double __cdecl exp2l(long double);
380
381 #define FP_ILOGB0 ((int)0x80000000)
382 #define FP_ILOGBNAN ((int)0x80000000)
383 extern int __cdecl ilogb (double);
384 extern int __cdecl ilogbf (float);
385 extern int __cdecl ilogbl (long double);
386
387 extern double __cdecl log1p(double);
388 extern float __cdecl log1pf(float);
389 extern long double __cdecl log1pl(long double);
390
391 extern double __cdecl log2 (double);
392 extern float __cdecl log2f (float);
393 extern long double __cdecl log2l (long double);
394
395 extern double __cdecl logb (double);
396 extern float __cdecl logbf (float);
397 extern long double __cdecl logbl (long double);
398
399 #if defined(__GNUC__)
400
401 #define __fxtract(x, res) \
402 __asm__ ("fxtract\n\t" \
403 "fstp %%st" : "=t" (res) : "0" (x))
404
405 #elif defined(_MSC_VER)
406
407 #define __fxtract(x, res) \
408 __asm { fld [(x)] } \
409 __asm { fxtract } \
410 __asm { fstp st(0) } \
411 __asm { fstp [(res)] }
412
413 #endif
414
415 __CRT_INLINE double __cdecl logb (double x)
416 {
417 double res;
418 __fxtract(x, res);
419 return res;
420 }
421
422 __CRT_INLINE float __cdecl logbf (float x)
423 {
424 float res;
425 __fxtract(x, res);
426 return res;
427 }
428
429 __CRT_INLINE long double __cdecl logbl (long double x)
430 {
431 long double res;
432 __fxtract(x, res);
433 return res;
434 }
435
436 extern long double __cdecl modfl (long double, long double*);
437
438 /* 7.12.6.13 */
439 extern double __cdecl scalbn (double, int);
440 extern float __cdecl scalbnf (float, int);
441 extern long double __cdecl scalbnl (long double, int);
442
443 extern double __cdecl scalbln (double, long);
444 extern float __cdecl scalblnf (float, long);
445 extern long double __cdecl scalblnl (long double, long);
446
447 /* 7.12.7.1 */
448 /* Implementations adapted from Cephes versions */
449 extern double __cdecl cbrt (double);
450 extern float __cdecl cbrtf (float);
451 extern long double __cdecl cbrtl (long double);
452
453 extern long double __cdecl hypotl (long double, long double);
454
455 extern long double __cdecl powl (long double, long double);
456 extern long double __cdecl expl(long double);
457 extern long double expm1l(long double);
458 extern long double __cdecl coshl(long double);
459 extern long double __cdecl fabsl (long double);
460 extern long double __cdecl acosl(long double);
461 extern long double __cdecl asinl(long double);
462 extern long double __cdecl atanl(long double);
463 extern long double __cdecl atan2l(long double,long double);
464 extern long double __cdecl sinhl(long double);
465 extern long double __cdecl tanhl(long double);
466
467 /* 7.12.8.1 The erf functions */
468 extern double __cdecl erf (double);
469 extern float __cdecl erff (float);
470 /* TODO
471 extern long double __cdecl erfl (long double);
472 */
473
474 /* 7.12.8.2 The erfc functions */
475 extern double __cdecl erfc (double);
476 extern float __cdecl erfcf (float);
477 /* TODO
478 extern long double __cdecl erfcl (long double);
479 */
480
481 /* 7.12.8.3 The lgamma functions */
482 extern double __cdecl lgamma (double);
483 extern float __cdecl lgammaf (float);
484 extern long double __cdecl lgammal (long double);
485
486 /* 7.12.8.4 The tgamma functions */
487 extern double __cdecl tgamma (double);
488 extern float __cdecl tgammaf (float);
489 extern long double __cdecl tgammal (long double);
490
491 extern long double __cdecl ceill (long double);
492 extern long double __cdecl floorl (long double);
493 extern long double __cdecl frexpl(long double,int *);
494 extern long double __cdecl log10l(long double);
495 extern long double __cdecl logl(long double);
496 extern long double __cdecl cosl(long double);
497 extern long double __cdecl sinl(long double);
498 extern long double __cdecl tanl(long double);
499 extern long double sqrtl(long double);
500
501 /* 7.12.9.3 */
502 extern double __cdecl nearbyint ( double);
503 extern float __cdecl nearbyintf (float);
504 extern long double __cdecl nearbyintl (long double);
505
506 /* 7.12.9.4 */
507 /* round, using fpu control word settings */
508 #if defined(__GNUC__)
509
510 #define __frndint(x, res) \
511 __asm__ ("fabs;" : "=t" (res) : "0" (x))
512
513 #elif defined(_MSC_VER)
514
515 #define __frndint(x, res) \
516 __asm { fld [(x)] } \
517 __asm { frndint } \
518 __asm { fstp [(res)] }
519
520 #endif
521
522 __CRT_INLINE double __cdecl rint (double x)
523 {
524 double retval;
525 __frndint(x, retval);
526 return retval;
527 }
528
529 __CRT_INLINE float __cdecl rintf (float x)
530 {
531 float retval;
532 __frndint(x, retval);
533 return retval;
534 }
535
536 __CRT_INLINE long double __cdecl rintl (long double x)
537 {
538 long double retval;
539 __frndint(x, retval);
540 return retval;
541 }
542
543 /* 7.12.9.5 */
544 #if defined(__GNUC__)
545
546 #define __fistpl(x, res) \
547 __asm__ __volatile__("fistpl %0" : "=m" (res) : "t" (x) : "st")
548
549 #define __fistpll(x, res) \
550 __asm__ __volatile__("fistpll %0" : "=m" (res) : "t" (x) : "st")
551
552 #elif defined(_MSC_VER)
553
554 #define __fistpl(x, res) \
555 __asm { fld [(x)] } \
556 __asm { fistp [(res)] }
557
558 #define __fistpll(x, res) \
559 __asm { fld [(x)] } \
560 __asm { fistp [(res)] }
561
562 #endif
563
564 __CRT_INLINE long __cdecl lrint (double x)
565 {
566 long retval;
567 __fistpl(x, retval);
568 return retval;
569 }
570
571 __CRT_INLINE long __cdecl lrintf (float x)
572 {
573 long retval;
574 __fistpl(x, retval);
575 return retval;
576 }
577
578 __CRT_INLINE long __cdecl lrintl (long double x)
579 {
580 long retval;
581 __fistpl(x, retval);
582 return retval;
583 }
584
585 __CRT_INLINE long long __cdecl llrint (double x)
586 {
587 long long retval;
588 __fistpll(x, retval);
589 return retval;
590 }
591
592 __CRT_INLINE long long __cdecl llrintf (float x)
593 {
594 long long retval;
595 __fistpll(x, retval);
596 return retval;
597 }
598
599 __CRT_INLINE long long __cdecl llrintl (long double x)
600 {
601 long long retval;
602 __fistpll(x, retval);
603 return retval;
604 }
605
606 /* 7.12.9.6 */
607 /* round away from zero, regardless of fpu control word settings */
608 extern double __cdecl round (double);
609 extern float __cdecl roundf (float);
610 extern long double __cdecl roundl (long double);
611
612 /* 7.12.9.7 */
613 extern long __cdecl lround (double);
614 extern long __cdecl lroundf (float);
615 extern long __cdecl lroundl (long double);
616
617 extern long long __cdecl llround (double);
618 extern long long __cdecl llroundf (float);
619 extern long long __cdecl llroundl (long double);
620
621 /* 7.12.9.8 */
622 /* round towards zero, regardless of fpu control word settings */
623 extern double __cdecl trunc (double);
624 extern float __cdecl truncf (float);
625 extern long double __cdecl truncl (long double);
626
627 extern long double __cdecl fmodl (long double, long double);
628
629 /* 7.12.10.2 */
630 extern double __cdecl remainder (double, double);
631 extern float __cdecl remainderf (float, float);
632 extern long double __cdecl remainderl (long double, long double);
633
634 /* 7.12.10.3 */
635 extern double __cdecl remquo(double, double, int *);
636 extern float __cdecl remquof(float, float, int *);
637 extern long double __cdecl remquol(long double, long double, int *);
638
639 /* 7.12.11.1 */
640 extern double __cdecl copysign (double, double); /* in libmoldname.a */
641 extern float __cdecl copysignf (float, float);
642 extern long double __cdecl copysignl (long double, long double);
643
644 /* 7.12.11.2 Return a NaN */
645 extern double __cdecl nan(const char *tagp);
646 extern float __cdecl nanf(const char *tagp);
647 extern long double __cdecl nanl(const char *tagp);
648
649 #ifndef __STRICT_ANSI__
650 #define _nan() nan("")
651 #define _nanf() nanf("")
652 #define _nanl() nanl("")
653 #endif
654
655 /* 7.12.11.3 */
656 extern double __cdecl nextafter (double, double); /* in libmoldname.a */
657 extern float __cdecl nextafterf (float, float);
658 extern long double __cdecl nextafterl (long double, long double);
659
660 /* 7.12.11.4 The nexttoward functions: TODO */
661
662 /* 7.12.12.1 */
663 /* x > y ? (x - y) : 0.0 */
664 extern double __cdecl fdim (double x, double y);
665 extern float __cdecl fdimf (float x, float y);
666 extern long double __cdecl fdiml (long double x, long double y);
667
668 /* fmax and fmin.
669 NaN arguments are treated as missing data: if one argument is a NaN
670 and the other numeric, then these functions choose the numeric
671 value. */
672
673 /* 7.12.12.2 */
674 extern double __cdecl fmax (double, double);
675 extern float __cdecl fmaxf (float, float);
676 extern long double __cdecl fmaxl (long double, long double);
677
678 /* 7.12.12.3 */
679 extern double __cdecl fmin (double, double);
680 extern float __cdecl fminf (float, float);
681 extern long double __cdecl fminl (long double, long double);
682
683 /* 7.12.13.1 */
684 /* return x * y + z as a ternary op */
685 extern double __cdecl fma (double, double, double);
686 extern float __cdecl fmaf (float, float, float);
687 extern long double __cdecl fmal (long double, long double, long double);
688
689
690 /* 7.12.14 */
691 /*
692 * With these functions, comparisons involving quiet NaNs set the FP
693 * condition code to "unordered". The IEEE floating-point spec
694 * dictates that the result of floating-point comparisons should be
695 * false whenever a NaN is involved, with the exception of the != op,
696 * which always returns true: yes, (NaN != NaN) is true).
697 */
698
699 #if defined(__GNUC__) && __GNUC__ >= 3
700
701 #define isgreater(x, y) __builtin_isgreater(x, y)
702 #define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)
703 #define isless(x, y) __builtin_isless(x, y)
704 #define islessequal(x, y) __builtin_islessequal(x, y)
705 #define islessgreater(x, y) __builtin_islessgreater(x, y)
706 #define isunordered(x, y) __builtin_isunordered(x, y)
707
708 #else
709 /* helper */
710 __CRT_INLINE int __cdecl
711 __fp_unordered_compare (long double x, long double y){
712 unsigned short retval;
713 #if defined(__GNUC__)
714 __asm__ ("fucom %%st(1);"
715 "fnstsw;": "=a" (retval) : "t" (x), "u" (y));
716 #elif defined(_MSC_VER)
717 __asm {
718 fld [x]
719 fld [y]
720 fxch st(1)
721 fucom st(1)
722 fnstsw [retval]
723 fstp st(0)
724 fstp st(0)
725 }
726 #endif
727 return retval;
728 }
729
730 #define isgreater(x, y) ((__fp_unordered_compare(x, y) \
731 & 0x4500) == 0)
732 #define isless(x, y) ((__fp_unordered_compare (y, x) \
733 & 0x4500) == 0)
734 #define isgreaterequal(x, y) ((__fp_unordered_compare (x, y) \
735 & FP_INFINITE) == 0)
736 #define islessequal(x, y) ((__fp_unordered_compare(y, x) \
737 & FP_INFINITE) == 0)
738 #define islessgreater(x, y) ((__fp_unordered_compare(x, y) \
739 & FP_SUBNORMAL) == 0)
740 #define isunordered(x, y) ((__fp_unordered_compare(x, y) \
741 & 0x4500) == 0x4500)
742
743 #endif
744
745
746 #endif /* __STDC_VERSION__ >= 199901L */
747 #endif /* __NO_ISOCEXT */
748
749 #ifdef __cplusplus
750 }
751 extern "C++" {
752 template<class _Ty> inline _Ty _Pow_int(_Ty _X,int _Y) {
753 unsigned int _N;
754 if(_Y >= 0) _N = (unsigned int)_Y;
755 else _N = (unsigned int)(-_Y);
756 for(_Ty _Z = _Ty(1);;_X *= _X) {
757 if((_N & 1)!=0) _Z *= _X;
758 if((_N >>= 1)==0) return (_Y < 0 ? _Ty(1) / _Z : _Z);
759 }
760 }
761 }
762 #endif
763
764 #pragma pack(pop)
765
766 #if !defined(__STRICT_ANSI__) && !defined(_MATH_DEFINES_DEFINED)
767 #define _MATH_DEFINES_DEFINED
768
769 #define M_E 2.71828182845904523536
770 #define M_LOG2E 1.44269504088896340736
771 #define M_LOG10E 0.434294481903251827651
772 #define M_LN2 0.693147180559945309417
773 #define M_LN10 2.30258509299404568402
774 #define M_PI 3.14159265358979323846
775 #define M_PI_2 1.57079632679489661923
776 #define M_PI_4 0.785398163397448309616
777 #define M_1_PI 0.318309886183790671538
778 #define M_2_PI 0.636619772367581343076
779 #define M_2_SQRTPI 1.12837916709551257390
780 #define M_SQRT2 1.41421356237309504880
781 #define M_SQRT1_2 0.707106781186547524401
782 #endif
783
784 #ifndef __MINGW_FPCLASS_DEFINED
785 #define __MINGW_FPCLASS_DEFINED 1
786 #define _FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */
787 #define _FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */
788 #define _FPCLASS_NINF 0x0004 /* Negative Infinity */
789 #define _FPCLASS_NN 0x0008 /* Negative Normal */
790 #define _FPCLASS_ND 0x0010 /* Negative Denormal */
791 #define _FPCLASS_NZ 0x0020 /* Negative Zero */
792 #define _FPCLASS_PZ 0x0040 /* Positive Zero */
793 #define _FPCLASS_PD 0x0080 /* Positive Denormal */
794 #define _FPCLASS_PN 0x0100 /* Positive Normal */
795 #define _FPCLASS_PINF 0x0200 /* Positive Infinity */
796 #endif /* __MINGW_FPCLASS_DEFINED */
797
798 #endif /* !_INC_MATH */