Funkcje matematyczne niezależne od typu

W przypadku standardu ISO C Standard 11 (C11) i nowszych nagłówek oprócz elementów <math.h> i <complex.h>udostępnia makra, <tgmath.h> które wywołują odpowiednią funkcję matematyczną na podstawie typów parametrów.

Funkcje matematyczne biblioteki środowiska uruchomieniowego języka C są dostępne w rzeczywistych i złożonych wariantach. Każdy wariant ma trzy warianty, w zależności od typu argumentu: float, doublei long double. Ponieważ język C nie obsługuje przeciążenia, takiego jak C++, każdy wariant ma inną nazwę. Aby na przykład uzyskać wartość bezwzględną rzeczywistej wartości zmiennoprzecinkowej, należy wywołać fabsfmetodę , fabslub fabsl w zależności od tego, czy przekazujesz floatodpowiednio wartość , doublelub long double . Aby uzyskać złożoną wartość bezwzględną, należy wywołać jedną z cabsfwartości , cabslub cabsl w zależności od tego, czy przekazujesz odpowiednio wartość zespolonej float, doublei long double . Jeśli argumenty nie pasują do żadnego z wymienionych powyżej typów, funkcja jest wybierana tak, jakby argumenty były podwójne.

<tgmath.h> zawiera makra, które upraszczają wybór odpowiedniej funkcji matematycznej do wywołania. Makra sprawdzają typ, który są przekazywane, a następnie wywołają właściwą funkcję. Na przykład sqrt makro wiąże się z sqrtf()sqrt(9.9f) elementem , ale wiąże się z elementem sqrt(9.9)sqrt(). Jeśli co najmniej jeden argument makra dla parametru ogólnego jest złożony, makro wiąże się z funkcją złożoną; w przeciwnym razie wywołuje rzeczywistą funkcję.

Makra ogólne typu w programie <tgmath.h> umożliwiają pisanie bardziej przenośnego kodu, ponieważ nie trzeba zarządzać rzutowaniem ani wybierać różnych nazw funkcji w zależności od typu argumentu.

Te makra znajdują się we własnym nagłówku, dzięki czemu programy napisane przy użyciu nagłówka <math.h> nie zostaną przerwane. Zachowuje double x = sin(42); się tak, jak zawsze, gdy uwzględniasz <math.h>. Mimo to większość istniejących programów języka C powinna nie mieć wpływu, gdy <tgmath.h> nagłówek zostanie dołączony zamiast <math.h> lub <complex.h>.

W poniższej tabeli wymieniono makra, które są dostępne w <tgmath.h> programie i do których się rozszerzają. modf nie znajduje się w tej tabeli, ponieważ nie ma odpowiedniego makra ogólnego typu, ponieważ nie jest jasne, jak zapewnić bezpieczeństwo bez komplikowania rozpoznawania typów.

Macro Prawdziwe
float
Prawdziwe
double
Prawdziwe
long double
Złożonych
float
Złożonych
double
Złożonych
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

Wymagania

Skompiluj za pomocą polecenia /std:c11.

Windows SDK 10.0.20348.0 (wersja 2104) lub nowsza. Zobacz Zestaw Windows SDK , aby pobrać najnowszy zestaw SDK. Aby uzyskać instrukcje dotyczące instalowania i używania zestawu SDK dla programowania C11 i C17, zobacz Instalowanie obsługi C11 i C17 w programie Visual Studio.

Zobacz też

Dokumentacja biblioteki czasu wykonywania języka C