Поделиться через


Математические символы универсального типа

Для iso C Standard 11 (C11) и более поздних <tgmath.h> версий заголовок, помимо включения <math.h> и <complex.h>, предоставляет макросы, вызывающие соответствующую математические функции на основе типов параметров.

Математические функции библиотеки среды выполнения C доступны в реальных и сложных вариантах. Каждый вариант имеет три варианта в зависимости от типа аргумента: float, doubleи long double. Так как C не поддерживает перегрузку, например C++, каждый вариант имеет другое имя. Например, чтобы получить абсолютное значение реального значения с плавающей запятой, вызовите либо fabsffabs, либо fabsl в зависимости от того, передаете floatdoubleли вы значение или long double значение соответственно. Чтобы получить комплексное абсолютное значение, необходимо вызвать один из cabsf, cabsили cabsl в зависимости от того, передаете floatли вы значение double, и long double сложное значение соответственно. Если аргументы не соответствуют ни одному из указанных выше типов, функция выбирается так, как если бы аргументы были двойными.

<tgmath.h> содержит макросы, упрощающие выбор правильной математической функции для вызова. Макросы проверяют тип, который они передаются, а затем вызывают правильную функцию. Например, sqrt макрос привязывается к sqrtf(), но привязывается sqrt(9.9f) sqrt(9.9) к sqrt(). Если хотя бы один аргумент макроса для универсального параметра является сложным, макрос привязывается к сложной функции; в противном случае он вызывает реальную функцию.

Макросы <tgmath.h> универсального типа позволяют создавать более переносимый код, так как вам не нужно управлять приведением или выбирать разные имена функций в зависимости от типа аргумента.

Эти макросы находятся в собственном заголовке, чтобы программы, написанные с помощью заголовка <math.h> , не прерывались. Так что double x = sin(42); ведет себя так, как всегда есть, когда вы включаете <math.h>. Несмотря на это, большинство существующих программ C, как ожидается, не затрагиваются при включении заголовка <tgmath.h> вместо <math.h> него или <complex.h>.

В следующей таблице перечислены макросы, доступные <tgmath.h> и развернутые в них. modf Не включен в эту таблицу, так как он не имеет соответствующего макроса типа универсального типа, так как он не ясно, как сделать его безопасным без усложнения разрешения типов.

Макрос Реальный
float
Реальный
double
Реальный
long double
Сложный
float
Сложный
double
Сложный
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

Требования

Выполните сборку с помощью /std:c11.

Пакет Windows SDK 10.0.20348.0 (версия 2104) или выше. Скачать последнюю версию Windows SDK можно здесь. Инструкции по установке и использованию пакета SDK для разработки C11 и C17 см. в статье Включение поддержки C11 и C17 в Visual Studio.

См. также

Справочник по библиотеке времени выполнения C