tgmath.h
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024: #ifndef _TGMATH_H
025: #define _TGMATH_H 1
026:
027:
028: #include <math.h>
029: #include <complex.h>
030:
031:
032:
033:
034:
035:
036:
037:
038: #if __GNUC_PREREQ (2, 7)
039:
040: # ifdef __NO_LONG_DOUBLE_MATH
041: # define __tgml(fct) fct
042: # else
043: # define __tgml(fct) fct ## l
044: # endif
045:
046:
047:
048:
049:
050:
051: # if __GNUC_PREREQ (3, 1)
052: # define __floating_type(type) \
053: (__builtin_classify_type ((type) 0) == 8 \
054: || (__builtin_classify_type ((type) 0) == 9 \
055: && __builtin_classify_type (__real__ ((type) 0)) == 8))
056: # else
057: # define __floating_type(type) (((type) 0.25) && ((type) 0.25 - 1))
058: # endif
059:
060:
061:
062: # define __tgmath_real_type_sub(T, E) \
063: __typeof__ (*(0 ? (__typeof__ (0 ? (double *) 0 : (void *) (E))) 0 \
064: : (__typeof__ (0 ? (T *) 0 : (void *) (!(E)))) 0))
065:
066:
067: # define __tgmath_real_type(expr) \
068: __tgmath_real_type_sub (__typeof__ ((__typeof__ (expr)) 0), \
069: __floating_type (__typeof__ (expr)))
070:
071:
072:
073:
074:
075: # define __TGMATH_UNARY_REAL_ONLY(Val, Fct) \
076: (__extension__ ((sizeof (Val) == sizeof (double) \
077: || __builtin_classify_type (Val) != 8) \
078: ? (__tgmath_real_type (Val)) Fct (Val) \
079: : (sizeof (Val) == sizeof (float)) \
080: ? (__tgmath_real_type (Val)) Fct##f (Val) \
081: : (__tgmath_real_type (Val)) __tgml(Fct) (Val)))
082:
083: # define __TGMATH_UNARY_REAL_RET_ONLY(Val, RetType, Fct) \
084: (__extension__ ((sizeof (Val) == sizeof (double) \
085: || __builtin_classify_type (Val) != 8) \
086: ? (RetType) Fct (Val) \
087: : (sizeof (Val) == sizeof (float)) \
088: ? (RetType) Fct##f (Val) \
089: : (RetType) __tgml(Fct) (Val)))
090:
091: # define __TGMATH_BINARY_FIRST_REAL_ONLY(Val1, Val2, Fct) \
092: (__extension__ ((sizeof (Val1) == sizeof (double) \
093: || __builtin_classify_type (Val1) != 8) \
094: ? (__tgmath_real_type (Val1)) Fct (Val1, Val2) \
095: : (sizeof (Val1) == sizeof (float)) \
096: ? (__tgmath_real_type (Val1)) Fct##f (Val1, Val2) \
097: : (__tgmath_real_type (Val1)) __tgml(Fct) (Val1, Val2)))
098:
099: # define __TGMATH_BINARY_REAL_ONLY(Val1, Val2, Fct) \
100: (__extension__ (((sizeof (Val1) > sizeof (double) \
101: || sizeof (Val2) > sizeof (double)) \
102: && __builtin_classify_type ((Val1) + (Val2)) == 8) \
103: ? (__typeof ((__tgmath_real_type (Val1)) 0 \
104: + (__tgmath_real_type (Val2)) 0)) \
105: __tgml(Fct) (Val1, Val2) \
106: : (sizeof (Val1) == sizeof (double) \
107: || sizeof (Val2) == sizeof (double) \
108: || __builtin_classify_type (Val1) != 8 \
109: || __builtin_classify_type (Val2) != 8) \
110: ? (__typeof ((__tgmath_real_type (Val1)) 0 \
111: + (__tgmath_real_type (Val2)) 0)) \
112: Fct (Val1, Val2) \
113: : (__typeof ((__tgmath_real_type (Val1)) 0 \
114: + (__tgmath_real_type (Val2)) 0)) \
115: Fct##f (Val1, Val2)))
116:
117: # define __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY(Val1, Val2, Val3, Fct) \
118: (__extension__ (((sizeof (Val1) > sizeof (double) \
119: || sizeof (Val2) > sizeof (double)) \
120: && __builtin_classify_type ((Val1) + (Val2)) == 8) \
121: ? (__typeof ((__tgmath_real_type (Val1)) 0 \
122: + (__tgmath_real_type (Val2)) 0)) \
123: __tgml(Fct) (Val1, Val2, Val3) \
124: : (sizeof (Val1) == sizeof (double) \
125: || sizeof (Val2) == sizeof (double) \
126: || __builtin_classify_type (Val1) != 8 \
127: || __builtin_classify_type (Val2) != 8) \
128: ? (__typeof ((__tgmath_real_type (Val1)) 0 \
129: + (__tgmath_real_type (Val2)) 0)) \
130: Fct (Val1, Val2, Val3) \
131: : (__typeof ((__tgmath_real_type (Val1)) 0 \
132: + (__tgmath_real_type (Val2)) 0)) \
133: Fct##f (Val1, Val2, Val3)))
134:
135: # define __TGMATH_TERNARY_REAL_ONLY(Val1, Val2, Val3, Fct) \
136: (__extension__ (((sizeof (Val1) > sizeof (double) \
137: || sizeof (Val2) > sizeof (double) \
138: || sizeof (Val3) > sizeof (double)) \
139: && __builtin_classify_type ((Val1) + (Val2) + (Val3)) \
140: == 8) \
141: ? (__typeof ((__tgmath_real_type (Val1)) 0 \
142: + (__tgmath_real_type (Val2)) 0 \
143: + (__tgmath_real_type (Val3)) 0)) \
144: __tgml(Fct) (Val1, Val2, Val3) \
145: : (sizeof (Val1) == sizeof (double) \
146: || sizeof (Val2) == sizeof (double) \
147: || sizeof (Val3) == sizeof (double) \
148: || __builtin_classify_type (Val1) != 8 \
149: || __builtin_classify_type (Val2) != 8 \
150: || __builtin_classify_type (Val3) != 8) \
151: ? (__typeof ((__tgmath_real_type (Val1)) 0 \
152: + (__tgmath_real_type (Val2)) 0 \
153: + (__tgmath_real_type (Val3)) 0)) \
154: Fct (Val1, Val2, Val3) \
155: : (__typeof ((__tgmath_real_type (Val1)) 0 \
156: + (__tgmath_real_type (Val2)) 0 \
157: + (__tgmath_real_type (Val3)) 0)) \
158: Fct##f (Val1, Val2, Val3)))
159:
160:
161:
162: # define __TGMATH_UNARY_REAL_IMAG(Val, Fct, Cfct) \
163: (__extension__ ((sizeof (__real__ (Val)) == sizeof (double) \
164: || __builtin_classify_type (__real__ (Val)) != 8) \
165: ? ((sizeof (__real__ (Val)) == sizeof (Val)) \
166: ? (__tgmath_real_type (Val)) Fct (Val) \
167: : (__tgmath_real_type (Val)) Cfct (Val)) \
168: : (sizeof (__real__ (Val)) == sizeof (float)) \
169: ? ((sizeof (__real__ (Val)) == sizeof (Val)) \
170: ? (__tgmath_real_type (Val)) Fct##f (Val) \
171: : (__tgmath_real_type (Val)) Cfct##f (Val)) \
172: : ((sizeof (__real__ (Val)) == sizeof (Val)) \
173: ? (__tgmath_real_type (Val)) __tgml(Fct) (Val) \
174: : (__tgmath_real_type (Val)) __tgml(Cfct) (Val))))
175:
176: # define __TGMATH_UNARY_IMAG(Val, Cfct) \
177: (__extension__ ((sizeof (__real__ (Val)) == sizeof (double) \
178: || __builtin_classify_type (__real__ (Val)) != 8) \
179: ? (__typeof__ ((__tgmath_real_type (Val)) 0 \
180: + _Complex_I)) Cfct (Val) \
181: : (sizeof (__real__ (Val)) == sizeof (float)) \
182: ? (__typeof__ ((__tgmath_real_type (Val)) 0 \
183: + _Complex_I)) Cfct##f (Val) \
184: : (__typeof__ ((__tgmath_real_type (Val)) 0 \
185: + _Complex_I)) __tgml(Cfct) (Val)))
186:
187:
188:
189: # define __TGMATH_UNARY_REAL_IMAG_RET_REAL(Val, Fct, Cfct) \
190: (__extension__ ((sizeof (__real__ (Val)) == sizeof (double) \
191: || __builtin_classify_type (__real__ (Val)) != 8) \
192: ? ((sizeof (__real__ (Val)) == sizeof (Val)) \
193: ? (__typeof__ (__real__ (__tgmath_real_type (Val)) 0))\
194: Fct (Val) \
195: : (__typeof__ (__real__ (__tgmath_real_type (Val)) 0))\
196: Cfct (Val)) \
197: : (sizeof (__real__ (Val)) == sizeof (float)) \
198: ? ((sizeof (__real__ (Val)) == sizeof (Val)) \
199: ? (__typeof__ (__real__ (__tgmath_real_type (Val)) 0))\
200: Fct##f (Val) \
201: : (__typeof__ (__real__ (__tgmath_real_type (Val)) 0))\
202: Cfct##f (Val)) \
203: : ((sizeof (__real__ (Val)) == sizeof (Val)) \
204: ? (__typeof__ (__real__ (__tgmath_real_type (Val)) 0))\
205: __tgml(Fct) (Val) \
206: : (__typeof__ (__real__ (__tgmath_real_type (Val)) 0))\
207: __tgml(Cfct) (Val))))
208:
209:
210:
211: # define __TGMATH_BINARY_REAL_IMAG(Val1, Val2, Fct, Cfct) \
212: (__extension__ (((sizeof (__real__ (Val1)) > sizeof (double) \
213: || sizeof (__real__ (Val2)) > sizeof (double)) \
214: && __builtin_classify_type (__real__ (Val1) \
215: + __real__ (Val2)) == 8) \
216: ? ((sizeof (__real__ (Val1)) == sizeof (Val1) \
217: && sizeof (__real__ (Val2)) == sizeof (Val2)) \
218: ? (__typeof ((__tgmath_real_type (Val1)) 0 \
219: + (__tgmath_real_type (Val2)) 0)) \
220: __tgml(Fct) (Val1, Val2) \
221: : (__typeof ((__tgmath_real_type (Val1)) 0 \
222: + (__tgmath_real_type (Val2)) 0)) \
223: __tgml(Cfct) (Val1, Val2)) \
224: : (sizeof (__real__ (Val1)) == sizeof (double) \
225: || sizeof (__real__ (Val2)) == sizeof (double) \
226: || __builtin_classify_type (__real__ (Val1)) != 8 \
227: || __builtin_classify_type (__real__ (Val2)) != 8) \
228: ? ((sizeof (__real__ (Val1)) == sizeof (Val1) \
229: && sizeof (__real__ (Val2)) == sizeof (Val2)) \
230: ? (__typeof ((__tgmath_real_type (Val1)) 0 \
231: + (__tgmath_real_type (Val2)) 0)) \
232: Fct (Val1, Val2) \
233: : (__typeof ((__tgmath_real_type (Val1)) 0 \
234: + (__tgmath_real_type (Val2)) 0)) \
235: Cfct (Val1, Val2)) \
236: : ((sizeof (__real__ (Val1)) == sizeof (Val1) \
237: && sizeof (__real__ (Val2)) == sizeof (Val2)) \
238: ? (__typeof ((__tgmath_real_type (Val1)) 0 \
239: + (__tgmath_real_type (Val2)) 0)) \
240: Fct##f (Val1, Val2) \
241: : (__typeof ((__tgmath_real_type (Val1)) 0 \
242: + (__tgmath_real_type (Val2)) 0)) \
243: Cfct##f (Val1, Val2))))
244: #else
245: # error "Unsupported compiler; you cannot use <tgmath.h>"
246: #endif
247:
248:
249:
250:
251:
252:
253:
254:
255: #define acos(Val) __TGMATH_UNARY_REAL_IMAG (Val, acos, cacos)
256:
257: #define asin(Val) __TGMATH_UNARY_REAL_IMAG (Val, asin, casin)
258:
259: #define atan(Val) __TGMATH_UNARY_REAL_IMAG (Val, atan, catan)
260:
261: #define atan2(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, atan2)
262:
263:
264: #define cos(Val) __TGMATH_UNARY_REAL_IMAG (Val, cos, ccos)
265:
266: #define sin(Val) __TGMATH_UNARY_REAL_IMAG (Val, sin, csin)
267:
268: #define tan(Val) __TGMATH_UNARY_REAL_IMAG (Val, tan, ctan)
269:
270:
271:
272:
273:
274: #define acosh(Val) __TGMATH_UNARY_REAL_IMAG (Val, acosh, cacosh)
275:
276: #define asinh(Val) __TGMATH_UNARY_REAL_IMAG (Val, asinh, casinh)
277:
278: #define atanh(Val) __TGMATH_UNARY_REAL_IMAG (Val, atanh, catanh)
279:
280:
281: #define cosh(Val) __TGMATH_UNARY_REAL_IMAG (Val, cosh, ccosh)
282:
283: #define sinh(Val) __TGMATH_UNARY_REAL_IMAG (Val, sinh, csinh)
284:
285: #define tanh(Val) __TGMATH_UNARY_REAL_IMAG (Val, tanh, ctanh)
286:
287:
288:
289:
290:
291: #define exp(Val) __TGMATH_UNARY_REAL_IMAG (Val, exp, cexp)
292:
293:
294: #define frexp(Val1, Val2) __TGMATH_BINARY_FIRST_REAL_ONLY (Val1, Val2, frexp)
295:
296:
297: #define ldexp(Val1, Val2) __TGMATH_BINARY_FIRST_REAL_ONLY (Val1, Val2, ldexp)
298:
299:
300: #define log(Val) __TGMATH_UNARY_REAL_IMAG (Val, log, clog)
301:
302:
303: #ifdef __USE_GNU
304: # define log10(Val) __TGMATH_UNARY_REAL_IMAG (Val, log10, __clog10)
305: #else
306: # define log10(Val) __TGMATH_UNARY_REAL_ONLY (Val, log10)
307: #endif
308:
309:
310: #define expm1(Val) __TGMATH_UNARY_REAL_ONLY (Val, expm1)
311:
312:
313: #define log1p(Val) __TGMATH_UNARY_REAL_ONLY (Val, log1p)
314:
315:
316: #define logb(Val) __TGMATH_UNARY_REAL_ONLY (Val, logb)
317:
318:
319: #define exp2(Val) __TGMATH_UNARY_REAL_ONLY (Val, exp2)
320:
321:
322: #define log2(Val) __TGMATH_UNARY_REAL_ONLY (Val, log2)
323:
324:
325:
326:
327:
328: #define pow(Val1, Val2) __TGMATH_BINARY_REAL_IMAG (Val1, Val2, pow, cpow)
329:
330:
331: #define sqrt(Val) __TGMATH_UNARY_REAL_IMAG (Val, sqrt, csqrt)
332:
333:
334: #define hypot(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, hypot)
335:
336:
337: #define cbrt(Val) __TGMATH_UNARY_REAL_ONLY (Val, cbrt)
338:
339:
340:
341:
342:
343: #define ceil(Val) __TGMATH_UNARY_REAL_ONLY (Val, ceil)
344:
345:
346: #define fabs(Val) __TGMATH_UNARY_REAL_IMAG_RET_REAL (Val, fabs, cabs)
347:
348:
349: #define floor(Val) __TGMATH_UNARY_REAL_ONLY (Val, floor)
350:
351:
352: #define fmod(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fmod)
353:
354:
355:
356: #define nearbyint(Val) __TGMATH_UNARY_REAL_ONLY (Val, nearbyint)
357:
358:
359:
360: #define round(Val) __TGMATH_UNARY_REAL_ONLY (Val, round)
361:
362:
363:
364: #define trunc(Val) __TGMATH_UNARY_REAL_ONLY (Val, trunc)
365:
366:
367:
368:
369: #define remquo(Val1, Val2, Val3) \
370: __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY (Val1, Val2, Val3, remquo)
371:
372:
373:
374: #define lrint(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, long int, lrint)
375: #define llrint(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, long long int, llrint)
376:
377:
378:
379: #define lround(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, long int, lround)
380: #define llround(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, long long int, llround)
381:
382:
383:
384: #define copysign(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, copysign)
385:
386:
387: #define erf(Val) __TGMATH_UNARY_REAL_ONLY (Val, erf)
388: #define erfc(Val) __TGMATH_UNARY_REAL_ONLY (Val, erfc)
389: #define tgamma(Val) __TGMATH_UNARY_REAL_ONLY (Val, tgamma)
390: #define lgamma(Val) __TGMATH_UNARY_REAL_ONLY (Val, lgamma)
391:
392:
393:
394:
395: #define rint(Val) __TGMATH_UNARY_REAL_ONLY (Val, rint)
396:
397:
398: #define nextafter(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, nextafter)
399: #define nexttoward(Val1, Val2) \
400: __TGMATH_BINARY_FIRST_REAL_ONLY (Val1, Val2, nexttoward)
401:
402:
403: #define remainder(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, remainder)
404:
405:
406: #if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
407: # define scalb(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, scalb)
408: #endif
409:
410:
411: #define scalbn(Val1, Val2) __TGMATH_BINARY_FIRST_REAL_ONLY (Val1, Val2, scalbn)
412:
413:
414: #define scalbln(Val1, Val2) \
415: __TGMATH_BINARY_FIRST_REAL_ONLY (Val1, Val2, scalbln)
416:
417:
418: #define ilogb(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, int, ilogb)
419:
420:
421:
422: #define fdim(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fdim)
423:
424:
425: #define fmax(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fmax)
426:
427:
428: #define fmin(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fmin)
429:
430:
431:
432: #define fma(Val1, Val2, Val3) \
433: __TGMATH_TERNARY_REAL_ONLY (Val1, Val2, Val3, fma)
434:
435:
436:
437:
438:
439: #define carg(Val) __TGMATH_UNARY_REAL_IMAG_RET_REAL (Val, carg, carg)
440:
441:
442: #define conj(Val) __TGMATH_UNARY_IMAG (Val, conj)
443:
444:
445: #define cproj(Val) __TGMATH_UNARY_IMAG (Val, cproj)
446:
447:
448:
449:
450:
451: #define cimag(Val) __TGMATH_UNARY_REAL_IMAG_RET_REAL (Val, cimag, cimag)
452:
453:
454: #define creal(Val) __TGMATH_UNARY_REAL_IMAG_RET_REAL (Val, creal, creal)
455:
456: #endif
457:
for client
18.221.174.248
© Andrew Scott 2006 -
2024,
All Rights Reserved