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: 
      
      
      
      
   
      
      
         
            
            © Andrew Scott 2006 -
            2025, 
            All Rights Reserved