1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25: #ifndef _MATH_H
26: #define _MATH_H 1
27:
28: #include <features.h>
29:
30: __BEGIN_DECLS
31:
32:
33:
34: #include <bits/huge_val.h>
35: #ifdef __USE_ISOC99
36: # include <bits/huge_valf.h>
37: # include <bits/huge_vall.h>
38:
39:
40: # include <bits/inf.h>
41:
42:
43: # include <bits/nan.h>
44: #endif
45:
46:
47: #include <bits/mathdef.h>
48:
49:
50:
51:
52:
53:
54: #define __MATHCALL(function,suffix, args) \
55: __MATHDECL (_Mdouble_,function,suffix, args)
56: #define __MATHDECL(type, function,suffix, args) \
57: __MATHDECL_1(type, function,suffix, args); \
58: __MATHDECL_1(type, __CONCAT(__,function),suffix, args)
59: #define __MATHCALLX(function,suffix, args, attrib) \
60: __MATHDECLX (_Mdouble_,function,suffix, args, attrib)
61: #define __MATHDECLX(type, function,suffix, args, attrib) \
62: __MATHDECL_1(type, function,suffix, args) __attribute__ (attrib); \
63: __MATHDECL_1(type, __CONCAT(__,function),suffix, args) __attribute__ (attrib)
64: #define __MATHDECL_1(type, function,suffix, args) \
65: extern type __MATH_PRECNAME(function,suffix) args __THROW
66:
67: #define _Mdouble_ double
68: #define __MATH_PRECNAME(name,r) __CONCAT(name,r)
69: # define _Mdouble_BEGIN_NAMESPACE __BEGIN_NAMESPACE_STD
70: # define _Mdouble_END_NAMESPACE __END_NAMESPACE_STD
71: #include <bits/mathcalls.h>
72: #undef _Mdouble_
73: #undef _Mdouble_BEGIN_NAMESPACE
74: #undef _Mdouble_END_NAMESPACE
75: #undef __MATH_PRECNAME
76:
77: #if defined __USE_MISC || defined __USE_ISOC99
78:
79:
80:
81:
82:
83: # ifndef _Mfloat_
84: # define _Mfloat_ float
85: # endif
86: # define _Mdouble_ _Mfloat_
87: # ifdef __STDC__
88: # define __MATH_PRECNAME(name,r) name##f##r
89: # else
90: # define __MATH_PRECNAME(name,r) namefr
91: # endif
92: # define _Mdouble_BEGIN_NAMESPACE __BEGIN_NAMESPACE_C99
93: # define _Mdouble_END_NAMESPACE __END_NAMESPACE_C99
94: # include <bits/mathcalls.h>
95: # undef _Mdouble_
96: # undef _Mdouble_BEGIN_NAMESPACE
97: # undef _Mdouble_END_NAMESPACE
98: # undef __MATH_PRECNAME
99:
100: # if (__STDC__ - 0 || __GNUC__ - 0) \
101: && (!defined __NO_LONG_DOUBLE_MATH || defined __LDBL_COMPAT)
102: # ifdef __LDBL_COMPAT
103:
104: # ifdef __USE_ISOC99
105: extern float __nldbl_nexttowardf (float __x, long double __y)
106: __THROW __attribute__ ((__const__));
107: # ifdef __REDIRECT_NTH
108: extern float __REDIRECT_NTH (nexttowardf, (float __x, long double __y),
109: __nldbl_nexttowardf)
110: __attribute__ ((__const__));
111: extern double __REDIRECT_NTH (nexttoward, (double __x, long double __y),
112: nextafter) __attribute__ ((__const__));
113: extern long double __REDIRECT_NTH (nexttowardl,
114: (long double __x, long double __y),
115: nextafter) __attribute__ ((__const__));
116: # endif
117: # endif
118:
119:
120:
121:
122: # undef __MATHDECL_1
123: # define __MATHDECL_2(type, function,suffix, args, alias) \
124: extern type __REDIRECT_NTH(__MATH_PRECNAME(function,suffix), \
125: args, alias)
126: # define __MATHDECL_1(type, function,suffix, args) \
127: __MATHDECL_2(type, function,suffix, args, __CONCAT(function,suffix))
128: # endif
129:
130: # ifndef _Mlong_double_
131: # define _Mlong_double_ long double
132: # endif
133: # define _Mdouble_ _Mlong_double_
134: # ifdef __STDC__
135: # define __MATH_PRECNAME(name,r) name##l##r
136: # else
137: # define __MATH_PRECNAME(name,r) namelr
138: # endif
139: # define _Mdouble_BEGIN_NAMESPACE __BEGIN_NAMESPACE_C99
140: # define _Mdouble_END_NAMESPACE __END_NAMESPACE_C99
141: # include <bits/mathcalls.h>
142: # undef _Mdouble_
143: # undef _Mdouble_BEGIN_NAMESPACE
144: # undef _Mdouble_END_NAMESPACE
145: # undef __MATH_PRECNAME
146:
147: # endif
148:
149: #endif
150: #undef __MATHDECL_1
151: #undef __MATHDECL
152: #undef __MATHCALL
153:
154:
155: #if defined __USE_MISC || defined __USE_XOPEN
156:
157: extern int signgam;
158: #endif
159:
160:
161:
162: #ifdef __USE_ISOC99
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198: enum
199: {
200: FP_NAN,
201: # define FP_NAN FP_NAN
202: FP_INFINITE,
203: # define FP_INFINITE FP_INFINITE
204: FP_ZERO,
205: # define FP_ZERO FP_ZERO
206: FP_SUBNORMAL,
207: # define FP_SUBNORMAL FP_SUBNORMAL
208: FP_NORMAL
209: # define FP_NORMAL FP_NORMAL
210: };
211:
212:
213: # ifdef __NO_LONG_DOUBLE_MATH
214: # define fpclassify(x) \
215: (sizeof (x) == sizeof (float) ? __fpclassifyf (x) : __fpclassify (x))
216: # else
217: # define fpclassify(x) \
218: (sizeof (x) == sizeof (float) \
219: ? __fpclassifyf (x) \
220: : sizeof (x) == sizeof (double) \
221: ? __fpclassify (x) : __fpclassifyl (x))
222: # endif
223:
224:
225: # ifdef __NO_LONG_DOUBLE_MATH
226: # define signbit(x) \
227: (sizeof (x) == sizeof (float) ? __signbitf (x) : __signbit (x))
228: # else
229: # define signbit(x) \
230: (sizeof (x) == sizeof (float) \
231: ? __signbitf (x) \
232: : sizeof (x) == sizeof (double) \
233: ? __signbit (x) : __signbitl (x))
234: # endif
235:
236:
237: # ifdef __NO_LONG_DOUBLE_MATH
238: # define isfinite(x) \
239: (sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x))
240: # else
241: # define isfinite(x) \
242: (sizeof (x) == sizeof (float) \
243: ? __finitef (x) \
244: : sizeof (x) == sizeof (double) \
245: ? __finite (x) : __finitel (x))
246: # endif
247:
248:
249: # define isnormal(x) (fpclassify (x) == FP_NORMAL)
250:
251:
252:
253: # ifdef __NO_LONG_DOUBLE_MATH
254: # define isnan(x) \
255: (sizeof (x) == sizeof (float) ? __isnanf (x) : __isnan (x))
256: # else
257: # define isnan(x) \
258: (sizeof (x) == sizeof (float) \
259: ? __isnanf (x) \
260: : sizeof (x) == sizeof (double) \
261: ? __isnan (x) : __isnanl (x))
262: # endif
263:
264:
265: # ifdef __NO_LONG_DOUBLE_MATH
266: # define isinf(x) \
267: (sizeof (x) == sizeof (float) ? __isinff (x) : __isinf (x))
268: # else
269: # define isinf(x) \
270: (sizeof (x) == sizeof (float) \
271: ? __isinff (x) \
272: : sizeof (x) == sizeof (double) \
273: ? __isinf (x) : __isinfl (x))
274: # endif
275:
276:
277: # define MATH_ERRNO 1
278: # define MATH_ERREXCEPT 2
279:
280: #endif
281:
282: #ifdef __USE_MISC
283:
284: typedef enum
285: {
286: _IEEE_ = -1,
287: _SVID_,
288: _XOPEN_,
289: _POSIX_,
290: _ISOC_
291: } _LIB_VERSION_TYPE;
292:
293:
294:
295:
296: extern _LIB_VERSION_TYPE _LIB_VERSION;
297: #endif
298:
299:
300: #ifdef __USE_SVID
301:
302:
303:
304:
305:
306: # ifdef __cplusplus
307: struct __exception
308: # else
309: struct exception
310: # endif
311: {
312: int type;
313: char *name;
314: double arg1;
315: double arg2;
316: double retval;
317: };
318:
319: # ifdef __cplusplus
320: extern int matherr (struct __exception *__exc) throw ();
321: # else
322: extern int matherr (struct exception *__exc);
323: # endif
324:
325: # define X_TLOSS 1.41484755040568800000e+16
326:
327:
328: # define DOMAIN 1
329: # define SING 2
330: # define OVERFLOW 3
331: # define UNDERFLOW 4
332: # define TLOSS 5
333: # define PLOSS 6
334:
335:
336: # define HUGE 3.40282347e+38F
337:
338: #else
339:
340: # ifdef __USE_XOPEN
341:
342: # define MAXFLOAT 3.40282347e+38F
343: # endif
344:
345: #endif
346:
347:
348:
349: #if defined __USE_BSD || defined __USE_XOPEN
350: # define M_E 2.7182818284590452354
351: # define M_LOG2E 1.4426950408889634074
352: # define M_LOG10E 0.43429448190325182765
353: # define M_LN2 0.69314718055994530942
354: # define M_LN10 2.30258509299404568402
355: # define M_PI 3.14159265358979323846
356: # define M_PI_2 1.57079632679489661923
357: # define M_PI_4 0.78539816339744830962
358: # define M_1_PI 0.31830988618379067154
359: # define M_2_PI 0.63661977236758134308
360: # define M_2_SQRTPI 1.12837916709551257390
361: # define M_SQRT2 1.41421356237309504880
362: # define M_SQRT1_2 0.70710678118654752440
363: #endif
364:
365:
366:
367:
368: #ifdef __USE_GNU
369: # define M_El 2.7182818284590452353602874713526625L
370: # define M_LOG2El 1.4426950408889634073599246810018921L
371: # define M_LOG10El 0.4342944819032518276511289189166051L
372: # define M_LN2l 0.6931471805599453094172321214581766L
373: # define M_LN10l 2.3025850929940456840179914546843642L
374: # define M_PIl 3.1415926535897932384626433832795029L
375: # define M_PI_2l 1.5707963267948966192313216916397514L
376: # define M_PI_4l 0.7853981633974483096156608458198757L
377: # define M_1_PIl 0.3183098861837906715377675267450287L
378: # define M_2_PIl 0.6366197723675813430755350534900574L
379: # define M_2_SQRTPIl 1.1283791670955125738961589031215452L
380: # define M_SQRT2l 1.4142135623730950488016887242096981L
381: # define M_SQRT1_2l 0.7071067811865475244008443621048490L
382: #endif
383:
384:
385:
386:
387:
388: #if defined __STRICT_ANSI__ && !defined __NO_MATH_INLINES
389: # define __NO_MATH_INLINES 1
390: #endif
391:
392: #if defined __USE_ISOC99 && __GNUC_PREREQ(2,97)
393:
394:
395:
396:
397:
398:
399: # define isgreater(x, y) __builtin_isgreater(x, y)
400: # define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)
401: # define isless(x, y) __builtin_isless(x, y)
402: # define islessequal(x, y) __builtin_islessequal(x, y)
403: # define islessgreater(x, y) __builtin_islessgreater(x, y)
404: # define isunordered(u, v) __builtin_isunordered(u, v)
405: #endif
406:
407:
408: #ifdef __USE_EXTERN_INLINES
409: # include <bits/mathinline.h>
410: #endif
411:
412: #ifdef __USE_ISOC99
413:
414:
415:
416: # ifndef isgreater
417: # define isgreater(x, y) \
418: (__extension__ \
419: ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
420: !isunordered (__x, __y) && __x > __y; }))
421: # endif
422:
423:
424: # ifndef isgreaterequal
425: # define isgreaterequal(x, y) \
426: (__extension__ \
427: ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
428: !isunordered (__x, __y) && __x >= __y; }))
429: # endif
430:
431:
432: # ifndef isless
433: # define isless(x, y) \
434: (__extension__ \
435: ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
436: !isunordered (__x, __y) && __x < __y; }))
437: # endif
438:
439:
440: # ifndef islessequal
441: # define islessequal(x, y) \
442: (__extension__ \
443: ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
444: !isunordered (__x, __y) && __x <= __y; }))
445: # endif
446:
447:
448: # ifndef islessgreater
449: # define islessgreater(x, y) \
450: (__extension__ \
451: ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
452: !isunordered (__x, __y) && (__x < __y || __y < __x); }))
453: # endif
454:
455:
456: # ifndef isunordered
457: # define isunordered(u, v) \
458: (__extension__ \
459: ({ __typeof__(u) __u = (u); __typeof__(v) __v = (v); \
460: fpclassify (__u) == FP_NAN || fpclassify (__v) == FP_NAN; }))
461: # endif
462:
463: #endif
464:
465: __END_DECLS
466:
467:
468: #endif