Sdílet prostřednictvím


Typově obecné matematické funkce

V případě standardu ISO C 11 (C11) a novější hlavička <tgmath.h> kromě zahrnutí <math.h> a <complex.h>poskytuje makra, která vyvolávají odpovídající matematickou funkci na základě typů parametrů.

Matematické funkce knihovny modulu runtime jazyka C mají reálné a složité varianty. Každá varianta se dodává ve třech příchutích v závislosti na typu argumentu: float, doublea long double. Vzhledem k tomu, že jazyk C nepodporuje přetížení, jako je C++, má každá varianta jiný název. Pokud chcete například získat absolutní hodnotu skutečné hodnoty s plovoucí desetinou čárkou, volali fabsfbyste buď hodnotu , fabsnebo fabsl v závislosti na tom, jestli předáváte floathodnotu , doublenebo long double hodnotu. Pokud chcete získat komplexní absolutní hodnotu, volali byste jednu z cabsfhodnot , cabsnebo cabsl v závislosti na tom, jestli předáváte floathodnotu , doublea long double složitou hodnotu. Pokud argumenty neodpovídají žádnému z výše uvedených typů, funkce se vybere, jako by argumenty byly dvojité.

<tgmath.h> obsahuje makra, která zjednodušují výběr správné matematické funkce pro volání. Makra zkontrolují typ, který jsou předány, a potom volají správnou funkci. Makro je například sqrt svázané sqrtf()sqrt(9.9f) s , ale je vázáno sqrt(9.9) na sqrt(). Pokud je alespoň jeden argument makra pro obecný parametr složitý, pak makro vytvoří vazbu na komplexní funkci; jinak vyvolá skutečnou funkci.

Makra obecného <tgmath.h> typu umožňují psát přenosnější kód, protože v závislosti na typu argumentu nemusíte spravovat přetypování ani vybírat různé názvy funkcí.

Tato makra jsou v jejich vlastní hlavičce, aby se programy napsané pomocí <math.h> hlavičky nezalomily. Chová se tak double x = sin(42); , jak má vždy, když zahrnete <math.h>. I tak se očekává, že většina stávajících programů jazyka C nebude ovlivněna, pokud je hlavička <tgmath.h> zahrnuta místo <math.h> nebo <complex.h>.

V následující tabulce jsou uvedena makra, která <tgmath.h> jsou k dispozici a na co se rozbalí. modf tato tabulka není součástí této tabulky, protože neobsahuje odpovídající typově obecné makro, protože není jasné, jak ho zabezpečit bez komplikování rozlišení typu.

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

Požadavky

Zkompilovat pomocí /std:c11.

Windows SDK 10.0.20348.0 (verze 2104) nebo novější Nejnovější sadu SDK si můžete stáhnout ze sady Windows SDK . Pokyny k instalaci a použití sady SDK pro vývoj pro C11 a C17 najdete v tématu Instalace podpory C11 a C17 v sadě Visual Studio.

Viz také

Referenční dokumentace knihovny runtime jazyka C