cosmopolitan/libc/isystem/tgmath.h
2024-08-04 12:52:25 -07:00

322 lines
9 KiB
C

#ifndef _TGMATH_H
#define _TGMATH_H
#include "libc/complex.h"
#include "libc/imag.h"
#include "libc/math.h"
#if __STDC_VERSION__ + 0 >= 201112
/* from https://en.cppreference.com/w/c/numeric/tgmath */
#define fabs(x) \
_Generic((x), \
float: fabsf, \
default: fabs, \
long double: fabsl, \
complex float: cabsf, \
complex double: cabs, \
complex long double: cabsl)(x)
#define exp(x) \
_Generic((x), \
float: expf, \
default: exp, \
long double: expl, \
complex float: cexpf, \
complex double: cexp, \
complex long double: cexpl)(x)
#define log(x) \
_Generic((x), \
float: logf, \
default: log, \
long double: logl, \
complex float: clogf, \
complex double: clog, \
complex long double: clogl)(x)
#define pow(x, y) \
_Generic((x), \
float: powf, \
default: pow, \
long double: powl, \
complex float: cpowf, \
complex double: cpow, \
complex long double: cpowl)(x, y)
#define sqrt(x) \
_Generic((x), \
float: sqrtf, \
default: sqrt, \
long double: sqrtl, \
complex float: csqrtf, \
complex double: csqrt, \
complex long double: csqrtl)(x)
#define sin(x) \
_Generic((x), \
float: sinf, \
default: sin, \
long double: sinl, \
complex float: csinf, \
complex double: csin, \
complex long double: csinl)(x)
#define cos(x) \
_Generic((x), \
float: cosf, \
default: cos, \
long double: cosl, \
complex float: ccosf, \
complex double: ccos, \
complex long double: ccosl)(x)
#define tan(x) \
_Generic((x), \
float: tanf, \
default: tan, \
long double: tanl, \
complex float: ctanf, \
complex double: ctan, \
complex long double: ctanl)(x)
#define asin(x) \
_Generic((x), \
float: asinf, \
default: asin, \
long double: asinl, \
complex float: casinf, \
complex double: casin, \
complex long double: casinl)(x)
#define acos(x) \
_Generic((x), \
float: acosf, \
default: acos, \
long double: acosl, \
complex float: cacosf, \
complex double: cacos, \
complex long double: cacosl)(x)
#define atan(x) \
_Generic((x), \
float: atanf, \
default: atan, \
long double: atanl, \
complex float: catanf, \
complex double: catan, \
complex long double: catanl)(x)
#define sinh(x) \
_Generic((x), \
float: sinhf, \
default: sinh, \
long double: sinhl, \
complex float: csinhf, \
complex double: csinh, \
complex long double: csinhl)(x)
#define cosh(x) \
_Generic((x), \
float: coshf, \
default: cosh, \
long double: coshl, \
complex float: ccoshf, \
complex double: ccosh, \
complex long double: ccoshl)(x)
#define tanh(x) \
_Generic((x), \
float: tanhf, \
default: tanh, \
long double: tanhl, \
complex float: ctanhf, \
complex double: ctanh, \
complex long double: ctanhl)(x)
#define asinh(x) \
_Generic((x), \
float: asinhf, \
default: asinh, \
long double: asinhl, \
complex float: casinhf, \
complex double: casinh, \
complex long double: casinhl)(x)
#define acosh(x) \
_Generic((x), \
float: acoshf, \
default: acosh, \
long double: acoshl, \
complex float: cacoshf, \
complex double: cacosh, \
complex long double: cacoshl)(x)
#define atanh(x) \
_Generic((x), \
float: atanhf, \
default: atanh, \
long double: atanhl, \
complex float: catanhf, \
complex double: catanh, \
complex long double: catanhl)(x)
#define atan2(x, y) \
_Generic((x), float: atan2f, default: atan2, long double: atan2l)(x, y)
#define cbrt(x) \
_Generic((x), float: cbrtf, default: cbrt, long double: cbrtl)(x)
#define ceil(x) \
_Generic((x), float: ceilf, default: ceil, long double: ceill)(x)
#define copysign(x, y) \
_Generic((x), float: copysignf, default: copysign, long double: copysignl)( \
x, y)
#define erf(x) _Generic((x), float: erff, default: erf, long double: erfl)(x)
#define erfc(x) \
_Generic((x), float: erfcf, default: erfc, long double: erfcl)(x)
#define exp2(x) \
_Generic((x), float: exp2f, default: exp2, long double: exp2l)(x)
#define expm1(x) \
_Generic((x), float: expm1f, default: expm1, long double: expm1l)(x)
#define fdim(x, y) \
_Generic((x), float: fdimf, default: fdim, long double: fdiml)(x, y)
#define floor(x) \
_Generic((x), float: floorf, default: floor, long double: floorl)(x)
#define fma(x, y, z) \
_Generic((x), float: fmaf, default: fma, long double: fmal)(x, y, z)
#define fmax(x, y) \
_Generic((x), float: fmaxf, default: fmax, long double: fmaxl)(x, y)
#define fmin(x, y) \
_Generic((x), float: fminf, default: fmin, long double: fminl)(x, y)
#define fmod(x, y) \
_Generic((x), float: fmodf, default: fmod, long double: fmodl)(x, y)
#define frexp(x, y) \
_Generic((x), float: frexpf, default: frexp, long double: frexpl)(x, y)
#define hypot(x, y) \
_Generic((x), float: hypotf, default: hypot, long double: hypotl)(x, y)
#define ilogb(x) \
_Generic((x), float: ilogbf, default: ilogb, long double: ilogbl)(x)
#define ldexp(x, y) \
_Generic((x), float: ldexpf, default: ldexp, long double: ldexpl)(x, y)
#define lgamma(x) \
_Generic((x), float: lgammaf, default: lgamma, long double: lgammal)(x)
#define llrint(x) \
_Generic((x), float: llrintf, default: llrint, long double: llrintl)(x)
#define llround(x) \
_Generic((x), float: llroundf, default: llround, long double: llroundl)(x)
#define log10(x) \
_Generic((x), float: log10f, default: log10, long double: log10l)(x)
#define log1p(x) \
_Generic((x), float: log1pf, default: log1p, long double: log1pl)(x)
#define log2(x) \
_Generic((x), float: log2f, default: log2, long double: log2l)(x)
#define logb(x) \
_Generic((x), float: logbf, default: logb, long double: logbl)(x)
#define lrint(x) \
_Generic((x), float: lrintf, default: lrint, long double: lrintl)(x)
#define lround(x) \
_Generic((x), float: lroundf, default: lround, long double: lroundl)(x)
#define nearbyint(x) \
_Generic((x), \
float: nearbyintf, \
default: nearbyint, \
long double: nearbyintl)(x)
#define nextafter(x, y) \
_Generic((x), \
float: nextafterf, \
default: nextafter, \
long double: nextafterl)(x, y)
#define nexttoward(x, y) \
_Generic((x), \
float: nexttowardf, \
default: nexttoward, \
long double: nexttowardl)(x, y)
#define remainder(x, y) \
_Generic((x), \
float: remainderf, \
default: remainder, \
long double: remainderl)(x, y)
#define remquo(x, y, z) \
_Generic((x), float: remquof, default: remquo, long double: remquol)(x, y, z)
#define rint(x) \
_Generic((x), float: rintf, default: rint, long double: rintl)(x)
#define round(x) \
_Generic((x), float: roundf, default: round, long double: roundl)(x)
#define scalbln(x, y) \
_Generic((x), float: scalblnf, default: scalbln, long double: scalblnl)(x, y)
#define scalbn(x, y) \
_Generic((x), float: scalbnf, default: scalbn, long double: scalbnl)(x, y)
#define tgamma(x) \
_Generic((x), float: tgammaf, default: tgamma, long double: tgammal)(x)
#define trunc(x) \
_Generic((x), float: truncf, default: trunc, long double: truncl)(x)
#define carg(x) \
_Generic((x), \
complex float: cargf, \
default: carg, \
complex long double: cargl)(x)
#define conj(x) \
_Generic((x), \
complex float: conjf, \
default: conj, \
complex long double: conjl)(x)
#undef creal
#define creal(x) \
_Generic((x), \
complex float: crealf, \
default: creal, \
complex long double: creall)(x)
#undef cimag
#define cimag(x) \
_Generic((x), \
complex float: cimagf, \
default: cimag, \
complex long double: cimagl)(x)
#define cproj(x) \
_Generic((x), \
complex float: cprojf, \
default: cproj, \
complex long double: cprojl)(x)
#endif /* C11 */
#endif /* _TGMATH_H */