Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651//// tgmath.h//// Copyright (c) Microsoft Corporation. All rights reserved.//// The type-generic math library.//#pragma once#ifndef _TGMATH#define _TGMATH
#include <corecrt.h>
#if (_CRT_HAS_CXX17 == 1) && !defined(_CRT_USE_C_TGMATH_H)
#include <ctgmath>
#else // ^^^^ /std:c++17 ^^^^ // vvvv _CRT_USE_C_TGMATH_H vvvv
#include <math.h>#include <complex.h>
#if _CRT_HAS_C11 == 0
#ifndef _CRT_SILENCE_NONCONFORMING_TGMATH_H
#pragma message(_CRT_WARNING_MESSAGE("UCRT4000", \ "This header does not conform to the C99 standard. " \ "C99 functionality is available when compiling in C11 mode or higher (/std:c11). " \ "Functionality equivalent to the type-generic functions provided by tgmath.h is available " \ "in <ctgmath> when compiling as C++. " \ "If compiling in C++17 mode or higher (/std:c++17), this header will automatically include <ctgmath> instead. " \ "You can define _CRT_SILENCE_NONCONFORMING_TGMATH_H to acknowledge that you have received this warning."))
#endif // _CRT_SILENCE_NONCONFORMING_TGMATH_H
#else // ^^^^ Default C Support ^^^^ // vvvv C11 Support vvvv
#pragma warning(push)#pragma warning(disable: _UCRT_DISABLED_WARNINGS)_UCRT_DISABLE_CLANG_WARNINGS_CRT_BEGIN_C_HEADER
#define __tgmath_resolve_real_binary_op(X, Y) _Generic((X), \ long double: 0.0l, \ \ default: _Generic((Y), \ long double: 0.0l, \ default: 0.0 \ ), \ \ float: _Generic((Y), \ long double: 0.0l, \ default: 0.0, \ float: 0.0f \ ) \ )
#define fabs(X) _Generic((X), \ _Lcomplex: cabsl, \ _Fcomplex: cabsf, \ _Dcomplex: cabs, \ long double: fabsl, \ float: fabsf, \ default: fabs \)(X)
#define exp(X) _Generic((X), \ _Lcomplex: cexpl, \ _Fcomplex: cexpf, \ _Dcomplex: cexp, \ long double: expl, \ float: expf, \ default: exp \)(X)
#define log(X) _Generic((X), \ _Lcomplex: clogl, \ _Fcomplex: clogf, \ _Dcomplex: clog, \ long double: logl, \ float: logf, \ default: log \)(X)
// C99 Complex types currently not supported. Complex types do not cast/promote implicitly - need inline helper functions.
inline _Lcomplex __cpowl_lc_dc(_Lcomplex const __lc, _Dcomplex const __dc){ return cpowl(__lc, _LCbuild(__dc._Val[0], __dc._Val[1]));}
inline _Lcomplex __cpowl_dc_lc(_Dcomplex const __dc, _Lcomplex const __lc){ return cpowl(_LCbuild(__dc._Val[0], __dc._Val[1]), __lc);}
inline _Lcomplex __cpowl_lc_fc(_Lcomplex const __lc, _Fcomplex const __fc){ return cpowl(__lc, _LCbuild(__fc._Val[0], __fc._Val[1]));}
inline _Lcomplex __cpowl_fc_lc(_Fcomplex const __fc, _Lcomplex const __lc){ return cpowl(_LCbuild(__fc._Val[0], __fc._Val[1]), __lc);}
inline _Lcomplex __cpowl_lc_l(_Lcomplex const __lc, long double const __l){ return cpowl(__lc, _LCbuild(__l, 0.0));}
inline _Lcomplex __cpowl_l_lc(long double const __l, _Lcomplex const __lc){ return cpowl(_LCbuild(__l, 0.0), __lc);}
inline _Lcomplex __cpowl_lc_d(_Lcomplex const __lc, double const __d){ return cpowl(__lc, _LCbuild(__d, 0.0));}
inline _Lcomplex __cpowl_d_lc(double const __d, _Lcomplex const __lc){ return cpowl(_LCbuild(__d, 0.0), __lc);}
inline _Lcomplex __cpowl_lc_f(_Lcomplex const __lc, float const __f){ return cpowl(__lc, _LCbuild(__f, 0.0));}
inline _Lcomplex __cpowl_f_lc(float const __f, _Lcomplex const __lc){ return cpowl(_LCbuild(__f, 0.0), __lc);}
inline _Lcomplex __cpowl_dc_l(_Dcomplex const __dc, long double const __l){ return cpowl(_LCbuild(__dc._Val[0], __dc._Val[1]), _LCbuild(__l, 0.0));}
inline _Lcomplex __cpowl_l_dc(long double const __l, _Dcomplex const __dc){ return cpowl(_LCbuild(__l, 0.0), _LCbuild(__dc._Val[0], __dc._Val[1]));}
inline _Lcomplex __cpowl_fc_l(_Fcomplex const __fc, long double const __l){ return cpowl(_LCbuild(__fc._Val[0], __fc._Val[1]), _LCbuild(__l, 0.0));}
inline _Lcomplex __cpowl_l_fc(long double const __l, _Fcomplex const __fc){ return cpowl(_LCbuild(__l, 0.0), _LCbuild(__fc._Val[0], __fc._Val[1]));}
inline _Dcomplex __cpow_dc_fc(_Dcomplex const __dc, _Fcomplex const __fc){ return cpow(__dc, _Cbuild(__fc._Val[0], __fc._Val[1]));}
inline _Dcomplex __cpow_fc_dc(_Fcomplex const __fc, _Dcomplex const __dc){ return cpow(_Cbuild(__fc._Val[0], __fc._Val[1]), __dc);}
inline _Dcomplex __cpow_dc_d(_Dcomplex const __dc, double const __d){ return cpow(__dc, _Cbuild(__d, 0.0));}
inline _Dcomplex __cpow_d_dc(double const __d, _Dcomplex const __dc){ return cpow(_Cbuild(__d, 0.0), __dc);}
inline _Dcomplex __cpow_dc_f(_Dcomplex const __dc, float const __f){ return cpow(__dc, _Cbuild(__f, 0.0));}
inline _Dcomplex __cpow_f_dc(float const __f, _Dcomplex const __dc){ return cpow(_Cbuild(__f, 0.0), __dc);}
inline _Dcomplex __cpow_fc_d(_Fcomplex const __fc, double const __d){ return cpow(_Cbuild(__fc._Val[0], __fc._Val[1]), _Cbuild(__d, 0.0));}
inline _Dcomplex __cpow_d_fc(double const __d, _Fcomplex const __fc){ return cpow(_Cbuild(__d, 0.0), _Cbuild(__fc._Val[0], __fc._Val[1]));}
inline _Fcomplex __cpowf_fc_f(_Fcomplex const __fc, float const __f){ return cpowf(__fc, _FCbuild(__f, 0.0f));}
inline _Fcomplex __cpowf_f_fc(float const __f, _Fcomplex const __fc){ return cpowf(_FCbuild(__f, 0.0f), __fc);}
#define pow(X, Y) _Generic((X), \ _Lcomplex: _Generic((Y), \ _Lcomplex: cpowl, \ _Fcomplex: __cpowl_lc_fc, \ _Dcomplex: __cpowl_lc_dc, \ long double: __cpowl_lc_l, \ default: __cpowl_lc_d, \ float: __cpowl_lc_f \ ), \ \ _Fcomplex: _Generic((Y), \ _Lcomplex: __cpowl_fc_lc, \ _Fcomplex: cpowf, \ _Dcomplex: __cpow_fc_dc, \ long double: __cpowl_fc_l, \ default: __cpow_fc_d, \ float: __cpowf_fc_f \ ), \ \ _Dcomplex: _Generic((Y), \ _Lcomplex: __cpowl_dc_lc, \ _Fcomplex: __cpow_dc_fc, \ _Dcomplex: cpow, \ long double: __cpowl_dc_l, \ default: __cpow_dc_d, \ float: __cpow_dc_f \ ), \ \ long double: _Generic((Y), \ _Lcomplex: __cpowl_l_lc, \ _Fcomplex: __cpowl_l_fc, \ _Dcomplex: __cpowl_l_dc, \ default: powl \ ), \ \ float: _Generic((Y), \ _Lcomplex: __cpowl_f_lc, \ _Fcomplex: __cpowf_f_fc, \ _Dcomplex: __cpow_f_dc, \ long double: powl, \ default: pow, \ float: powf \ ), \ \ default: _Generic((Y), \ _Lcomplex: __cpowl_d_lc, \ _Fcomplex: __cpow_d_fc, \ _Dcomplex: __cpow_d_dc, \ long double: powl, \ default: pow \ ) \)(X, Y)
#define sqrt(X) _Generic((X), \ _Lcomplex: csqrtl, \ _Fcomplex: csqrtf, \ _Dcomplex: csqrt, \ long double: sqrtl, \ float: sqrtf, \ default: sqrt \)(X)
#define sin(X) _Generic((X), \ _Lcomplex: csinl, \ _Fcomplex: csinf, \ _Dcomplex: csin, \ long double: sinl, \ float: sinf, \ default: sin \)(X)
#define cos(X) _Generic((X), \ _Lcomplex: ccosl, \ _Fcomplex: ccosf, \ _Dcomplex: ccos, \ long double: cosl, \ float: cosf, \ default: cos \)(X)
#define tan(X) _Generic((X), \ _Lcomplex: ctanl, \ _Fcomplex: ctanf, \ _Dcomplex: ctan, \ long double: tanl, \ float: tanf, \ default: tan \)(X)
#define asin(X) _Generic((X), \ _Lcomplex: casinl, \ _Fcomplex: casinf, \ _Dcomplex: casin, \ long double: asinl, \ float: asinf, \ default: asin \)(X)
#define acos(X) _Generic((X), \ _Lcomplex: cacosl, \ _Fcomplex: cacosf, \ _Dcomplex: cacos, \ long double: acosl, \ float: acosf, \ default: acos \)(X)
#define atan(X) _Generic((X), \ _Lcomplex: catanl, \ _Fcomplex: catanf, \ _Dcomplex: catan, \ long double: atanl, \ float: atanf, \ default: atan \)(X)
#define asinh(X) _Generic((X), \ _Lcomplex: casinhl, \ _Fcomplex: casinhf, \ _Dcomplex: casinh, \ long double: asinhl, \ float: asinhf, \ default: asinh \)(X)
#define acosh(X) _Generic((X), \ _Lcomplex: cacoshl, \ _Fcomplex: cacoshf, \ _Dcomplex: cacosh, \ long double: acoshl, \ float: acoshf, \ default: acosh \)(X)
#define atanh(X) _Generic((X), \ _Lcomplex: catanhl, \ _Fcomplex: catanhf, \ _Dcomplex: catanh, \ long double: atanhl, \ float: atanhf, \ default: atanh \)(X)
#define atan2(X, Y) _Generic(__tgmath_resolve_real_binary_op((X), (Y)), \ long double: atan2l, \ float: atan2f, \ default: atan2 \)(X, Y)
#define cbrt(X) _Generic((X), \ long double: cbrtl, \ float: cbrtf, \ default: cbrt \)(X)
#define ceil(X) _Generic((X), \ long double: ceill, \ float: ceilf, \ default: ceil \)(X)
#define copysign(X, Y) _Generic(__tgmath_resolve_real_binary_op((X), (Y)), \ long double: copysignl, \ float: copysignf, \ default: copysign \)(X, Y)
#define erf(X) _Generic((X), \ long double: erfl, \ float: erff, \ default: erf \)(X)
#define erfc(X) _Generic((X), \ long double: erfcl, \ float: erfcf, \ default: erfc \)(X)
#define exp2(X) _Generic((X), \ long double: exp2l, \ float: exp2f, \ default: exp2 \)(X)
#define expm1(X) _Generic((X), \ long double: expm1l, \ float: expm1f, \ default: expm1 \)(X)
#define fdim(X, Y) _Generic(__tgmath_resolve_real_binary_op((X), (Y)), \ long double: fdiml, \ float: fdimf, \ default: fdim \)(X, Y)
#define floor(X) _Generic((X), \ long double: floorl, \ float: floorf, \ default: floor \)(X)
#define fma(X, Y, Z) _Generic(__tgmath_resolve_real_binary_op((X), __tgmath_resolve_real_binary_op((Y), (Z))), \ long double: fmal, \ float: fmaf, \ default: fma \)(X, Y, Z)
#define fmax(X, Y) _Generic(__tgmath_resolve_real_binary_op((X), (Y)), \ long double: fmaxl, \ float: fmaxf, \ default: fmax \)(X, Y)
#define fmin(X, Y) _Generic(__tgmath_resolve_real_binary_op((X), (Y)), \ long double: fminl, \ float: fminf, \ default: fmin \)(X, Y)
#define fmod(X, Y) _Generic(__tgmath_resolve_real_binary_op((X), (Y)), \ long double: fmodl, \ float: fmodf, \ default: fmod \)(X, Y)
#define frexp(X, INT_PTR) _Generic((X), \ long double: frexpl, \ float: frexpf, \ default: frexp \)(X, INT_PTR)
#define hypot(X, Y) _Generic(__tgmath_resolve_real_binary_op((X), (Y)), \ long double: hypotl, \ float: hypotf, \ default: hypot \)(X, Y)
#define ilogb(X) _Generic((X), \ long double: ilogbl, \ float: ilogbf, \ default: ilogb \)(X)
#define ldexp(X, INT) _Generic((X), \ long double: ldexpl, \ float: ldexpf, \ default: ldexp \)(X, INT)
#define lgamma(X) _Generic((X), \ long double: lgammal, \ float: lgammaf, \ default: lgamma \)(X)
#define llrint(X) _Generic((X), \ long double: llrintl, \ float: llrintf, \ default: llrint \)(X)
#define llround(X) _Generic((X), \ long double: llroundl, \ float: llroundf, \ default: llround \)(X)
#define log10(X) _Generic((X), \ long double: log10l, \ float: log10f, \ default: log10 \)(X)
#define log1p(X) _Generic((X), \ long double: log1pl, \ float: log1pf, \ default: log1p \)(X)
#define log2(X) _Generic((X), \ long double: log2l, \ float: log2f, \ default: log2 \)(X)
#define logb(X) _Generic((X), \ long double: logbl, \ float: logbf, \ default: logb \)(X)
#define lrint(X) _Generic((X), \ long double: lrintl, \ float: lrintf, \ default: lrint \)(X)
#define lround(X) _Generic((X), \ long double: lroundl, \ float: lroundf, \ default: lround \)(X)
#define nearbyint(X) _Generic((X), \ long double: nearbyintl, \ float: nearbyintf, \ default: nearbyint \)(X)
#define nextafter(X, Y) _Generic(__tgmath_resolve_real_binary_op((X), (Y)), \ long double: nextafterl, \ float: nextafterf, \ default: nextafter \)(X, Y)
#define nexttoward(X, LONG_DOUBLE) _Generic((X), \ long double: nexttowardl, \ float: nexttowardf, \ default: nexttoward \)(X, LONG_DOUBLE)
#define remainder(X, Y) _Generic(__tgmath_resolve_real_binary_op((X), (Y)), \ long double: remainderl, \ float: remainderf, \ default: remainder \)(X, Y)
#define remquo(X, Y, INT_PTR) _Generic(__tgmath_resolve_real_binary_op((X), (Y)), \ long double: remquol, \ float: remquof, \ default: remquo \)(X, Y, INT_PTR)
#define rint(X) _Generic((X), \ long double: rintl, \ float: rintf, \ default: rint \)(X)
#define round(X) _Generic((X), \ long double: roundl, \ float: roundf, \ default: round \)(X)
#define scalbln(X, LONG) _Generic((X), \ long double: scalblnl, \ float: scalblnf, \ default: scalbln \)(X, LONG)
#define scalbn(X, INT) _Generic((X), \ long double: scalbnl, \ float: scalbnf, \ default: scalbn \)(X, INT)
#define tgamma(X) _Generic((X), \ long double: tgammal, \ float: tgammaf, \ default: tgamma \)(X)
#define trunc(X) _Generic((X), \ long double: truncl, \ float: truncf, \ default: trunc \)(X)
inline double __carg_d(double const __d){ return carg(_Cbuild(__d, 0.0));}
#define carg(X) _Generic((X), \ _Lcomplex: cargl, \ _Fcomplex: cargf, \ _Dcomplex: carg, \ default: __carg_d \)(X)
inline _Dcomplex __conj_d(double const __d){ return conj(_Cbuild(__d, 0.0));}
#define conj(X) _Generic((X), \ _Lcomplex: conjl, \ _Fcomplex: conjf, \ _Dcomplex: conj, \ default: __conj_d \)(X)
inline double __creal_d(double const __d){ // The real part of a double casted to a double complex is just the double value. return __d;}
#define creal(X) _Generic((X), \ _Lcomplex: creall, \ _Fcomplex: crealf, \ _Dcomplex: creal, \ default: __creal_d \)(X)
inline double __cimag_d(double const __d){ // The imaginary part of a double casted to a double complex is 0. (void) __d; return 0.0;}
#define cimag(X) _Generic((X), \ _Lcomplex: cimagl, \ _Fcomplex: cimagf, \ _Dcomplex: cimag, \ default: __cimag_d \)(X)
inline _Dcomplex __cproj_d(double const __d){ return cproj(_Cbuild(__d, 0.0));}
#define cproj(X) _Generic((X), \ _Lcomplex: cprojl, \ _Fcomplex: cprojf, \ _Dcomplex: cproj, \ default: __cproj_d \)(X)
_CRT_END_C_HEADER_UCRT_RESTORE_CLANG_WARNINGS#pragma warning(pop) // _UCRT_DISABLED_WARNINGS
#endif // _CRT_HAS_C11 == 0
#endif // (_CRT_HAS_CXX17 == 1) && !defined(_CRT_USE_C_TGMATH_H)
#endif // _TGMATH