CRT header compatibility update.
[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(_X86_) && !defined(__x86_64))
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__)
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 #ifndef __cplusplus
146 __CRT_INLINE long double __cdecl fabsl (long double x)
147 {
148 long double res;
149 __asm__ ("fabs;" : "=t" (res) : "0" (x));
150 return res;
151 }
152 #define _hypotl(x,y) ((long double)_hypot((double)(x),(double)(y)))
153 #define _matherrl _matherr
154 __CRT_INLINE long double _chgsignl(long double _Number) { return _chgsign((double)(_Number)); }
155 __CRT_INLINE long double _copysignl(long double _Number,long double _Sign) { return _copysign((double)(_Number),(double)(_Sign)); }
156 __CRT_INLINE float frexpf(float _X,int *_Y) { return ((float)frexp((double)_X,_Y)); }
157
158 #if !defined (__ia64__)
159 __CRT_INLINE float __cdecl fabsf (float x)
160 {
161 float res;
162 __asm__ ("fabs;" : "=t" (res) : "0" (x));
163 return res;
164 }
165
166 __CRT_INLINE float __cdecl ldexpf (float x, int expn) { return (float) ldexp (x, expn); }
167 #endif
168 #else
169 // cplusplus
170 __CRT_INLINE long double __cdecl fabsl (long double x)
171 {
172 long double res;
173 __asm__ ("fabs;" : "=t" (res) : "0" (x));
174 return res;
175 }
176 __CRT_INLINE long double modfl(long double _X,long double *_Y) {
177 double _Di,_Df = modf((double)_X,&_Di);
178 *_Y = (long double)_Di;
179 return (_Df);
180 }
181 __CRT_INLINE long double _chgsignl(long double _Number) { return _chgsign(static_cast<double>(_Number)); }
182 __CRT_INLINE long double _copysignl(long double _Number,long double _Sign) { return _copysign(static_cast<double>(_Number),static_cast<double>(_Sign)); }
183 __CRT_INLINE float frexpf(float _X,int *_Y) { return ((float)frexp((double)_X,_Y)); }
184 #ifndef __ia64__
185 __CRT_INLINE float __cdecl fabsf (float x)
186 {
187 float res;
188 __asm__ ("fabs;" : "=t" (res) : "0" (x));
189 return res;
190 }
191 __CRT_INLINE float __cdecl ldexpf (float x, int expn) { return (float) ldexp (x, expn); }
192 #ifndef __x86_64
193 __CRT_INLINE float acosf(float _X) { return ((float)acos((double)_X)); }
194 __CRT_INLINE float asinf(float _X) { return ((float)asin((double)_X)); }
195 __CRT_INLINE float atanf(float _X) { return ((float)atan((double)_X)); }
196 __CRT_INLINE float atan2f(float _X,float _Y) { return ((float)atan2((double)_X,(double)_Y)); }
197 __CRT_INLINE float ceilf(float _X) { return ((float)ceil((double)_X)); }
198 __CRT_INLINE float cosf(float _X) { return ((float)cos((double)_X)); }
199 __CRT_INLINE float coshf(float _X) { return ((float)cosh((double)_X)); }
200 __CRT_INLINE float expf(float _X) { return ((float)exp((double)_X)); }
201 __CRT_INLINE float floorf(float _X) { return ((float)floor((double)_X)); }
202 __CRT_INLINE float fmodf(float _X,float _Y) { return ((float)fmod((double)_X,(double)_Y)); }
203 __CRT_INLINE float logf(float _X) { return ((float)log((double)_X)); }
204 __CRT_INLINE float log10f(float _X) { return ((float)log10((double)_X)); }
205 __CRT_INLINE float modff(float _X,float *_Y) {
206 double _Di,_Df = modf((double)_X,&_Di);
207 *_Y = (float)_Di;
208 return ((float)_Df);
209 }
210 __CRT_INLINE float powf(float _X,float _Y) { return ((float)pow((double)_X,(double)_Y)); }
211 __CRT_INLINE float sinf(float _X) { return ((float)sin((double)_X)); }
212 __CRT_INLINE float sinhf(float _X) { return ((float)sinh((double)_X)); }
213 __CRT_INLINE float sqrtf(float _X) { return ((float)sqrt((double)_X)); }
214 __CRT_INLINE float tanf(float _X) { return ((float)tan((double)_X)); }
215 __CRT_INLINE float tanhf(float _X) { return ((float)tanh((double)_X)); }
216 #endif
217 #endif
218 #endif
219
220 #ifndef NO_OLDNAMES
221 #define DOMAIN _DOMAIN
222 #define SING _SING
223 #define OVERFLOW _OVERFLOW
224 #define UNDERFLOW _UNDERFLOW
225 #define TLOSS _TLOSS
226 #define PLOSS _PLOSS
227 #define matherr _matherr
228
229 #define HUGE _HUGE
230 /* double __cdecl cabs(struct _complex _X); */
231 double __cdecl hypot(double _X,double _Y);
232 _CRTIMP double __cdecl j0(double _X);
233 _CRTIMP double __cdecl j1(double _X);
234 _CRTIMP double __cdecl jn(int _X,double _Y);
235 _CRTIMP double __cdecl y0(double _X);
236 _CRTIMP double __cdecl y1(double _X);
237 _CRTIMP double __cdecl yn(int _X,double _Y);
238 #endif
239
240 #ifndef __NO_ISOCEXT
241 #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \
242 || !defined __STRICT_ANSI__ || defined __GLIBCPP__
243
244 #define NAN (0.0F/0.0F)
245 #define HUGE_VALF (1.0F/0.0F)
246 #define HUGE_VALL (1.0L/0.0L)
247 #define INFINITY (1.0F/0.0F)
248
249
250 #define FP_NAN 0x0100
251 #define FP_NORMAL 0x0400
252 #define FP_INFINITE (FP_NAN | FP_NORMAL)
253 #define FP_ZERO 0x4000
254 #define FP_SUBNORMAL (FP_NORMAL | FP_ZERO)
255 /* 0x0200 is signbit mask */
256
257
258 /*
259 We can't __CRT_INLINE float or double, because we want to ensure truncation
260 to semantic type before classification.
261 (A normal long double value might become subnormal when
262 converted to double, and zero when converted to float.)
263 */
264
265 extern int __cdecl __fpclassifyf (float);
266 extern int __cdecl __fpclassify (double);
267
268 __CRT_INLINE int __cdecl __fpclassifyl (long double x){
269 unsigned short sw;
270 __asm__ ("fxam; fstsw %%ax;" : "=a" (sw): "t" (x));
271 return sw & (FP_NAN | FP_NORMAL | FP_ZERO );
272 }
273
274 #define fpclassify(x) (sizeof (x) == sizeof (float) ? __fpclassifyf (x) \
275 : sizeof (x) == sizeof (double) ? __fpclassify (x) \
276 : __fpclassifyl (x))
277
278 /* 7.12.3.2 */
279 #define isfinite(x) ((fpclassify(x) & FP_NAN) == 0)
280
281 /* 7.12.3.3 */
282 #define isinf(x) (fpclassify(x) == FP_INFINITE)
283
284 /* 7.12.3.4 */
285 /* We don't need to worry about trucation here:
286 A NaN stays a NaN. */
287
288 __CRT_INLINE int __cdecl __isnan (double _x)
289 {
290 unsigned short sw;
291 __asm__ ("fxam;"
292 "fstsw %%ax": "=a" (sw) : "t" (_x));
293 return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))
294 == FP_NAN;
295 }
296
297 __CRT_INLINE int __cdecl __isnanf (float _x)
298 {
299 unsigned short sw;
300 __asm__ ("fxam;"
301 "fstsw %%ax": "=a" (sw) : "t" (_x));
302 return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))
303 == FP_NAN;
304 }
305
306 __CRT_INLINE int __cdecl __isnanl (long double _x)
307 {
308 unsigned short sw;
309 __asm__ ("fxam;"
310 "fstsw %%ax": "=a" (sw) : "t" (_x));
311 return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))
312 == FP_NAN;
313 }
314
315
316 #define isnan(x) (sizeof (x) == sizeof (float) ? __isnanf (x) \
317 : sizeof (x) == sizeof (double) ? __isnan (x) \
318 : __isnanl (x))
319
320 /* 7.12.3.5 */
321 #define isnormal(x) (fpclassify(x) == FP_NORMAL)
322
323 /* 7.12.3.6 The signbit macro */
324 __CRT_INLINE int __cdecl __signbit (double x) {
325 unsigned short stw;
326 __asm__ ( "fxam; fstsw %%ax;": "=a" (stw) : "t" (x));
327 return stw & 0x0200;
328 }
329
330 __CRT_INLINE int __cdecl __signbitf (float x) {
331 unsigned short stw;
332 __asm__ ("fxam; fstsw %%ax;": "=a" (stw) : "t" (x));
333 return stw & 0x0200;
334 }
335
336 __CRT_INLINE int __cdecl __signbitl (long double x) {
337 unsigned short stw;
338 __asm__ ("fxam; fstsw %%ax;": "=a" (stw) : "t" (x));
339 return stw & 0x0200;
340 }
341
342 #define signbit(x) (sizeof (x) == sizeof (float) ? __signbitf (x) \
343 : sizeof (x) == sizeof (double) ? __signbit (x) \
344 : __signbitl (x))
345
346 extern double __cdecl exp2(double);
347 extern float __cdecl exp2f(float);
348 extern long double __cdecl exp2l(long double);
349
350 #define FP_ILOGB0 ((int)0x80000000)
351 #define FP_ILOGBNAN ((int)0x80000000)
352 extern int __cdecl ilogb (double);
353 extern int __cdecl ilogbf (float);
354 extern int __cdecl ilogbl (long double);
355
356 extern double __cdecl log1p(double);
357 extern float __cdecl log1pf(float);
358 extern long double __cdecl log1pl(long double);
359
360 extern double __cdecl log2 (double);
361 extern float __cdecl log2f (float);
362 extern long double __cdecl log2l (long double);
363
364 extern double __cdecl logb (double);
365 extern float __cdecl logbf (float);
366 extern long double __cdecl logbl (long double);
367
368 __CRT_INLINE double __cdecl logb (double x)
369 {
370 double res;
371 __asm__ ("fxtract\n\t"
372 "fstp %%st" : "=t" (res) : "0" (x));
373 return res;
374 }
375
376 __CRT_INLINE float __cdecl logbf (float x)
377 {
378 float res;
379 __asm__ ("fxtract\n\t"
380 "fstp %%st" : "=t" (res) : "0" (x));
381 return res;
382 }
383
384 __CRT_INLINE long double __cdecl logbl (long double x)
385 {
386 long double res;
387 __asm__ ("fxtract\n\t"
388 "fstp %%st" : "=t" (res) : "0" (x));
389 return res;
390 }
391
392 extern long double __cdecl modfl (long double, long double*);
393
394 /* 7.12.6.13 */
395 extern double __cdecl scalbn (double, int);
396 extern float __cdecl scalbnf (float, int);
397 extern long double __cdecl scalbnl (long double, int);
398
399 extern double __cdecl scalbln (double, long);
400 extern float __cdecl scalblnf (float, long);
401 extern long double __cdecl scalblnl (long double, long);
402
403 /* 7.12.7.1 */
404 /* Implementations adapted from Cephes versions */
405 extern double __cdecl cbrt (double);
406 extern float __cdecl cbrtf (float);
407 extern long double __cdecl cbrtl (long double);
408
409 __CRT_INLINE float __cdecl hypotf (float x, float y)
410 { return (float) hypot (x, y);}
411 extern long double __cdecl hypotl (long double, long double);
412
413 extern long double __cdecl powl (long double, long double);
414 extern long double __cdecl expl(long double);
415 extern long double expm1l(long double);
416 extern long double __cdecl coshl(long double);
417 extern long double __cdecl fabsl (long double);
418 extern long double __cdecl acosl(long double);
419 extern long double __cdecl asinl(long double);
420 extern long double __cdecl atanl(long double);
421 extern long double __cdecl atan2l(long double,long double);
422 extern long double __cdecl sinhl(long double);
423 extern long double __cdecl tanhl(long double);
424
425 /* 7.12.8.1 The erf functions */
426 extern double __cdecl erf (double);
427 extern float __cdecl erff (float);
428 /* TODO
429 extern long double __cdecl erfl (long double);
430 */
431
432 /* 7.12.8.2 The erfc functions */
433 extern double __cdecl erfc (double);
434 extern float __cdecl erfcf (float);
435 /* TODO
436 extern long double __cdecl erfcl (long double);
437 */
438
439 /* 7.12.8.3 The lgamma functions */
440 extern double __cdecl lgamma (double);
441 extern float __cdecl lgammaf (float);
442 extern long double __cdecl lgammal (long double);
443
444 /* 7.12.8.4 The tgamma functions */
445 extern double __cdecl tgamma (double);
446 extern float __cdecl tgammaf (float);
447 extern long double __cdecl tgammal (long double);
448
449 extern long double __cdecl ceill (long double);
450 extern long double __cdecl floorl (long double);
451 extern long double __cdecl frexpl(long double,int *);
452 extern long double __cdecl log10l(long double);
453 extern long double __cdecl logl(long double);
454 extern long double __cdecl cosl(long double);
455 extern long double __cdecl sinl(long double);
456 extern long double __cdecl tanl(long double);
457 extern long double sqrtl(long double);
458
459 /* 7.12.9.3 */
460 extern double __cdecl nearbyint ( double);
461 extern float __cdecl nearbyintf (float);
462 extern long double __cdecl nearbyintl (long double);
463
464 /* 7.12.9.4 */
465 /* round, using fpu control word settings */
466 __CRT_INLINE double __cdecl rint (double x)
467 {
468 double retval;
469 __asm__ ("frndint;": "=t" (retval) : "0" (x));
470 return retval;
471 }
472
473 __CRT_INLINE float __cdecl rintf (float x)
474 {
475 float retval;
476 __asm__ ("frndint;" : "=t" (retval) : "0" (x) );
477 return retval;
478 }
479
480 __CRT_INLINE long double __cdecl rintl (long double x)
481 {
482 long double retval;
483 __asm__ ("frndint;" : "=t" (retval) : "0" (x) );
484 return retval;
485 }
486
487 /* 7.12.9.5 */
488 __CRT_INLINE long __cdecl lrint (double x)
489 {
490 long retval;
491 __asm__ __volatile__ \
492 ("fistpl %0" : "=m" (retval) : "t" (x) : "st"); \
493 return retval;
494 }
495
496 __CRT_INLINE long __cdecl lrintf (float x)
497 {
498 long retval;
499 __asm__ __volatile__ \
500 ("fistpl %0" : "=m" (retval) : "t" (x) : "st"); \
501 return retval;
502 }
503
504 __CRT_INLINE long __cdecl lrintl (long double x)
505 {
506 long retval;
507 __asm__ __volatile__ \
508 ("fistpl %0" : "=m" (retval) : "t" (x) : "st"); \
509 return retval;
510 }
511
512 __CRT_INLINE long long __cdecl llrint (double x)
513 {
514 long long retval;
515 __asm__ __volatile__ \
516 ("fistpll %0" : "=m" (retval) : "t" (x) : "st"); \
517 return retval;
518 }
519
520 __CRT_INLINE long long __cdecl llrintf (float x)
521 {
522 long long retval;
523 __asm__ __volatile__ \
524 ("fistpll %0" : "=m" (retval) : "t" (x) : "st"); \
525 return retval;
526 }
527
528 __CRT_INLINE long long __cdecl llrintl (long double x)
529 {
530 long long retval;
531 __asm__ __volatile__ \
532 ("fistpll %0" : "=m" (retval) : "t" (x) : "st"); \
533 return retval;
534 }
535
536 /* 7.12.9.6 */
537 /* round away from zero, regardless of fpu control word settings */
538 extern double __cdecl round (double);
539 extern float __cdecl roundf (float);
540 extern long double __cdecl roundl (long double);
541
542 /* 7.12.9.7 */
543 extern long __cdecl lround (double);
544 extern long __cdecl lroundf (float);
545 extern long __cdecl lroundl (long double);
546
547 extern long long __cdecl llround (double);
548 extern long long __cdecl llroundf (float);
549 extern long long __cdecl llroundl (long double);
550
551 /* 7.12.9.8 */
552 /* round towards zero, regardless of fpu control word settings */
553 extern double __cdecl trunc (double);
554 extern float __cdecl truncf (float);
555 extern long double __cdecl truncl (long double);
556
557 extern long double __cdecl fmodl (long double, long double);
558
559 /* 7.12.10.2 */
560 extern double __cdecl remainder (double, double);
561 extern float __cdecl remainderf (float, float);
562 extern long double __cdecl remainderl (long double, long double);
563
564 /* 7.12.10.3 */
565 extern double __cdecl remquo(double, double, int *);
566 extern float __cdecl remquof(float, float, int *);
567 extern long double __cdecl remquol(long double, long double, int *);
568
569 /* 7.12.11.1 */
570 extern double __cdecl copysign (double, double); /* in libmoldname.a */
571 extern float __cdecl copysignf (float, float);
572 extern long double __cdecl copysignl (long double, long double);
573
574 /* 7.12.11.2 Return a NaN */
575 extern double __cdecl nan(const char *tagp);
576 extern float __cdecl nanf(const char *tagp);
577 extern long double __cdecl nanl(const char *tagp);
578
579 #ifndef __STRICT_ANSI__
580 #define _nan() nan("")
581 #define _nanf() nanf("")
582 #define _nanl() nanl("")
583 #endif
584
585 /* 7.12.11.3 */
586 extern double __cdecl nextafter (double, double); /* in libmoldname.a */
587 extern float __cdecl nextafterf (float, float);
588 extern long double __cdecl nextafterl (long double, long double);
589
590 /* 7.12.11.4 The nexttoward functions: TODO */
591
592 /* 7.12.12.1 */
593 /* x > y ? (x - y) : 0.0 */
594 extern double __cdecl fdim (double x, double y);
595 extern float __cdecl fdimf (float x, float y);
596 extern long double __cdecl fdiml (long double x, long double y);
597
598 /* fmax and fmin.
599 NaN arguments are treated as missing data: if one argument is a NaN
600 and the other numeric, then these functions choose the numeric
601 value. */
602
603 /* 7.12.12.2 */
604 extern double __cdecl fmax (double, double);
605 extern float __cdecl fmaxf (float, float);
606 extern long double __cdecl fmaxl (long double, long double);
607
608 /* 7.12.12.3 */
609 extern double __cdecl fmin (double, double);
610 extern float __cdecl fminf (float, float);
611 extern long double __cdecl fminl (long double, long double);
612
613 /* 7.12.13.1 */
614 /* return x * y + z as a ternary op */
615 extern double __cdecl fma (double, double, double);
616 extern float __cdecl fmaf (float, float, float);
617 extern long double __cdecl fmal (long double, long double, long double);
618
619
620 /* 7.12.14 */
621 /*
622 * With these functions, comparisons involving quiet NaNs set the FP
623 * condition code to "unordered". The IEEE floating-point spec
624 * dictates that the result of floating-point comparisons should be
625 * false whenever a NaN is involved, with the exception of the != op,
626 * which always returns true: yes, (NaN != NaN) is true).
627 */
628
629 #if __GNUC__ >= 3
630
631 #define isgreater(x, y) __builtin_isgreater(x, y)
632 #define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)
633 #define isless(x, y) __builtin_isless(x, y)
634 #define islessequal(x, y) __builtin_islessequal(x, y)
635 #define islessgreater(x, y) __builtin_islessgreater(x, y)
636 #define isunordered(x, y) __builtin_isunordered(x, y)
637
638 #else
639 /* helper */
640 __CRT_INLINE int __cdecl
641 __fp_unordered_compare (long double x, long double y){
642 unsigned short retval;
643 __asm__ ("fucom %%st(1);"
644 "fnstsw;": "=a" (retval) : "t" (x), "u" (y));
645 return retval;
646 }
647
648 #define isgreater(x, y) ((__fp_unordered_compare(x, y) \
649 & 0x4500) == 0)
650 #define isless(x, y) ((__fp_unordered_compare (y, x) \
651 & 0x4500) == 0)
652 #define isgreaterequal(x, y) ((__fp_unordered_compare (x, y) \
653 & FP_INFINITE) == 0)
654 #define islessequal(x, y) ((__fp_unordered_compare(y, x) \
655 & FP_INFINITE) == 0)
656 #define islessgreater(x, y) ((__fp_unordered_compare(x, y) \
657 & FP_SUBNORMAL) == 0)
658 #define isunordered(x, y) ((__fp_unordered_compare(x, y) \
659 & 0x4500) == 0x4500)
660
661 #endif
662
663
664 #endif /* __STDC_VERSION__ >= 199901L */
665 #endif /* __NO_ISOCEXT */
666
667 #ifdef __cplusplus
668 }
669 extern "C++" {
670 template<class _Ty> inline _Ty _Pow_int(_Ty _X,int _Y) {
671 unsigned int _N;
672 if(_Y >= 0) _N = (unsigned int)_Y;
673 else _N = (unsigned int)(-_Y);
674 for(_Ty _Z = _Ty(1);;_X *= _X) {
675 if((_N & 1)!=0) _Z *= _X;
676 if((_N >>= 1)==0) return (_Y < 0 ? _Ty(1) / _Z : _Z);
677 }
678 }
679 }
680 #endif
681
682 #pragma pack(pop)
683
684 #if !defined(__STRICT_ANSI__) && !defined(_MATH_DEFINES_DEFINED)
685 #define _MATH_DEFINES_DEFINED
686
687 #define M_E 2.71828182845904523536
688 #define M_LOG2E 1.44269504088896340736
689 #define M_LOG10E 0.434294481903251827651
690 #define M_LN2 0.693147180559945309417
691 #define M_LN10 2.30258509299404568402
692 #define M_PI 3.14159265358979323846
693 #define M_PI_2 1.57079632679489661923
694 #define M_PI_4 0.785398163397448309616
695 #define M_1_PI 0.318309886183790671538
696 #define M_2_PI 0.636619772367581343076
697 #define M_2_SQRTPI 1.12837916709551257390
698 #define M_SQRT2 1.41421356237309504880
699 #define M_SQRT1_2 0.707106781186547524401
700 #endif
701
702 #ifndef __MINGW_FPCLASS_DEFINED
703 #define __MINGW_FPCLASS_DEFINED 1
704 #define _FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */
705 #define _FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */
706 #define _FPCLASS_NINF 0x0004 /* Negative Infinity */
707 #define _FPCLASS_NN 0x0008 /* Negative Normal */
708 #define _FPCLASS_ND 0x0010 /* Negative Denormal */
709 #define _FPCLASS_NZ 0x0020 /* Negative Zero */
710 #define _FPCLASS_PZ 0x0040 /* Positive Zero */
711 #define _FPCLASS_PD 0x0080 /* Positive Denormal */
712 #define _FPCLASS_PN 0x0100 /* Positive Normal */
713 #define _FPCLASS_PINF 0x0200 /* Positive Infinity */
714 #endif /* __MINGW_FPCLASS_DEFINED */
715
716 /* 7.12.14 */
717 /*
718 * With these functions, comparisons involving quiet NaNs set the FP
719 * condition code to "unordered". The IEEE floating-point spec
720 * dictates that the result of floating-point comparisons should be
721 * false whenever a NaN is involved, with the exception of the != op,
722 * which always returns true: yes, (NaN != NaN) is true).
723 */
724
725 #if __GNUC__ >= 3
726
727 #define isgreater(x, y) __builtin_isgreater(x, y)
728 #define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)
729 #define isless(x, y) __builtin_isless(x, y)
730 #define islessequal(x, y) __builtin_islessequal(x, y)
731 #define islessgreater(x, y) __builtin_islessgreater(x, y)
732 #define isunordered(x, y) __builtin_isunordered(x, y)
733
734 #else
735 /* helper */
736 __CRT_INLINE int __cdecl
737 __fp_unordered_compare (long double x, long double y){
738 unsigned short retval;
739 __asm__ ("fucom %%st(1);"
740 "fnstsw;": "=a" (retval) : "t" (x), "u" (y));
741 return retval;
742 }
743
744 #define isgreater(x, y) ((__fp_unordered_compare(x, y) \
745 & 0x4500) == 0)
746 #define isless(x, y) ((__fp_unordered_compare (y, x) \
747 & 0x4500) == 0)
748 #define isgreaterequal(x, y) ((__fp_unordered_compare (x, y) \
749 & FP_INFINITE) == 0)
750 #define islessequal(x, y) ((__fp_unordered_compare(y, x) \
751 & FP_INFINITE) == 0)
752 #define islessgreater(x, y) ((__fp_unordered_compare(x, y) \
753 & FP_SUBNORMAL) == 0)
754 #define isunordered(x, y) ((__fp_unordered_compare(x, y) \
755 & 0x4500) == 0x4500)
756
757 #endif
758
759 #endif /* !_INC_MATH */