Udostępnij za pośrednictwem


Obsługa obliczeń matematycznych i zmiennoprzecinkowych

Biblioteka uniwersalnego środowiska uruchomieniowego języka C (UCRT) udostępnia wiele funkcji bibliotek matematycznych całkowitych i zmiennoprzecinkowych, w tym wszystkie funkcje wymagane przez iso C99. Funkcje zmiennoprzecinkowe są implementowane w celu zrównoważenia wydajności z poprawnością. Ponieważ generowanie poprawnie zaokrąglonego wyniku może być zbyt kosztowne, te funkcje są zaprojektowane tak, aby wydajnie uzyskać bliskie przybliżenie prawidłowego zaokrąglonego wyniku. W większości przypadków wygenerowany wynik znajduje się w ciągu +/-1 ULP (jednostka najmniejszej precyzji) poprawnie zaokrąglonego wyniku, choć mogą wystąpić przypadki, w których występuje większa niedokładność.

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. Aby uzyskać szczegółowe informacje, zobacz Typy ogólne matematyczne .

Wiele funkcji biblioteki matematycznej zmiennoprzecinkowych ma różne implementacje dla różnych architektur procesora CPU. Na przykład 32-bitowy X86 CRT może mieć inną implementację niż 64-bitowa X64 CRT. Ponadto niektóre funkcje mogą mieć wiele implementacji dla danej architektury procesora CPU. Najbardziej wydajna implementacja jest wybierana dynamicznie w czasie wykonywania w zależności od zestawów instrukcji obsługiwanych przez procesor. Na przykład w 32-bitowej architekturze X86 CRT niektóre funkcje mają implementację x87 i implementację SSE2. W przypadku uruchamiania na procesorze, który obsługuje SSE2, używana jest szybsza implementacja SSE2. W przypadku uruchamiania na procesorze CPU, który nie obsługuje protokołu SSE2, używana jest wolniejsza implementacja x87. Ponieważ różne implementacje funkcji biblioteki matematycznej mogą używać różnych instrukcji procesora CPU i różnych algorytmów do generowania wyników, funkcje mogą generować różne wyniki w różnych procesorach CPU. W większości przypadków wyniki znajdują się w ciągu +/-1 ULP poprawnie zaokrąglonego wyniku, ale rzeczywiste wyniki mogą się różnić w zależności od procesorów CPU.

Poprzednie 16-bitowe wersje programów Microsoft C/C++ i Microsoft Visual C++ obsługiwały long double typ jako 80-bitowy typ danych zmiennoprzecinkowych o precyzji 80-bitowej. W nowszych wersjach programu Visual C++typ long double danych jest 64-bitowym typem danych zmiennoprzecinkowych o precyzji identycznej z typem double . Kompilator traktuje long double i double jako odrębne typy, ale long double funkcje są identyczne z ich double odpowiednikami. CRT udostępnia long double wersje funkcji matematycznych dla zgodności kodu źródłowego ISO C99, ale należy pamiętać, że reprezentacja binarna może się różnić od innych kompilatorów.

Obsługiwane procedury matematyczne i zmiennoprzecinkowe

Procedura Używanie
abs, labs, llabs, _abs64 Oblicza wartość bezwzględną typu liczby całkowitej
acos, acosf, acosl Oblicza cosinus łuku
acosh, acoshf, acoshl Oblicza cosinus hiperboliczny łuk
asin, asinf, asinl Oblicza sinus łuku
asinh, asinhf, asinhl Oblicza sinus hiperboliczny łuk
atan, atanf, atanl, atan2, atan2f, atan2l Oblicza tangens łuku
atanh, atanhf, atanhl Oblicza tangens łuku hiperbolicznego
_atodbl, _atodbl_l Konwertuje ciąg specyficzny dla ustawień regionalnych na double
atof, _atof_l Konwertuje ciąg na double
_atoflt, _atoflt_l, _atoldbl, _atoldbl_l Konwertuje ciąg specyficzny dla ustawień regionalnych na wartość float lub long double
cbrt, cbrtf, cbrtl Oblicza katalog główny modułu
ceil, ceilf, ceill Oblicza limit
_chgsign, _chgsignf, _chgsignl Oblicza odwrotność dodawania
_clear87, _clearfp Pobiera i czyści rejestr stanu zmiennoprzecinkowego
_control87, _controlfp, __control87_2 Pobiera i ustawia słowo sterujące zmiennoprzecinkowe
_controlfp_s Bezpieczna wersja programu _controlfp
copysign, copysignf, copysignl, _copysign, _copysignf, _copysignl Zwraca wartość o wielkości jednego argumentu i znak innego
cos, cosf, cosl Oblicza sinus
cosh, coshf, coshl Oblicza sinus hiperboliczny
div, ldiv, lldiv Oblicza iloraz i pozostałą część dwóch wartości całkowitych
_ecvt, ecvt Konwertuje element double na ciąg
_ecvt_s Bezpieczna wersja programu _ecvt
erf, erff, erfl Oblicza funkcję błędu
erfc, erfcf, erfcl Oblicza uzupełniającą funkcję błędu
exp, expf, expl Oblicza wykładniczo ex
exp2, exp2f, exp2l Oblicza wykładniczą wartość 2x
expm1, expm1f, expm1l Obliczenia ex-1
fabs, fabsf, fabsl Oblicza wartość bezwzględną typu zmiennoprzecinkowego
_fcvt, fcvt Konwertuje liczbę zmiennoprzecinkową na ciąg
_fcvt_s Bezpieczna wersja programu _fcvt
fdim, fdimf, fdiml Określa dodatnią różnicę między dwiema wartościami
feclearexcept Czyści określone wyjątki zmiennoprzecinkowe
fegetenv Przechowuje bieżące środowisko zmiennoprzecinkowe
fegetexceptflag Pobiera określony stan wyjątku zmiennoprzecinkowego
fegetround Pobiera tryb zaokrąglania zmiennoprzecinkowego
feholdexcept Ustawia tryb wyjątku zmiennoprzecinkowego bez zatrzymywania
feraiseexcept Zgłasza określone wyjątki zmiennoprzecinkowe
fesetenv Ustawia bieżące środowisko zmiennoprzecinkowe
fesetexceptflag Ustawia określone flagi stanu zmiennoprzecinkowe
fesetround Ustawia określony tryb zaokrąglania zmiennoprzecinkowego
fetestexcept Określa, które flagi stanu wyjątków zmiennoprzecinkowych są ustawione
feupdateenv Przywraca środowisko zmiennoprzecinkowe, a następnie zgłasza poprzednie wyjątki
floor, floorf, floorl Oblicza podłogę
fma, fmaf, fmal Oblicza bezpieczną sumę mnożenia
fmax, fmaxf, fmaxl Oblicza maksymalną liczbę argumentów
fmin, fminf, fminl Oblicza minimum argumentów
fmod, fmodf, fmodl Oblicza pozostałą część zmiennoprzecinkową
_fpclass, _fpclassf Zwraca klasyfikację wartości zmiennoprzecinkowej
fpclassify Zwraca klasyfikację wartości zmiennoprzecinkowej
_fpieee_flt Ustawia procedurę obsługi dla wyjątków zmiennoprzecinkowych
_fpreset Resetuje środowisko zmiennoprzecinkowe
frexp, frexpf, frexpl Pobiera mantissa i wykładnik liczby zmiennoprzecinkowych
_gcvt, gcvt Konwertuje liczbę zmiennoprzecinkową na ciąg
_gcvt_s Bezpieczna wersja programu _gcvt
_get_FMA3_enable, _set_FMA3_enable Pobiera lub ustawia flagę do użycia instrukcji FMA3 na x64
hypot, hypotf, hypotl, _hypot, _hypotf, _hypotl Oblicza podcięcie
ilogb, ilogbf, ilogbl Oblicza wykładnik liczby całkowitej base-2
imaxabs Oblicza wartość bezwzględną typu liczby całkowitej
imaxdiv Oblicza iloraz i pozostałą część dwóch wartości całkowitych
isfinite, _finite, _finitef Określa, czy wartość jest skończona
isgreater, isgreaterequal, isless, islessequal, islessgreater, isunordered Porównanie kolejności dwóch wartości zmiennoprzecinkowych
isinf Określa, czy wartość zmiennoprzecinkowa jest nieskończona
isnan, _isnan, _isnanf Testuje wartość zmiennoprzecinkowa dla sieci NaN
isnormal Sprawdza, czy wartość zmiennoprzecinkowa jest skończona, a nie podnormalna
_j0, _j1, _jn Oblicza funkcję Bessel
ldexp, ldexpf, ldexpl Obliczenia x*2n
lgamma, lgammaf, lgammal Oblicza logarytm naturalny wartości bezwzględnej funkcji gamma
llrint, llrintf, llrintl Zaokrągla wartość zmiennoprzecinkową do najbliższej long long wartości
llround, llroundf, llroundl Zaokrągla wartość zmiennoprzecinkową do najbliższej long long wartości
log, logf, logl, log10, log10f, log10l Oblicza logarytm naturalny lub base-10
log1p, log1pf, log1pl Oblicza logarytm naturalny 1+x
log2, log2f, log2l Oblicza logarytm base-2
logb, logbf, logbl, _logb, _logbf Zwraca wykładnik wartości zmiennoprzecinkowej
lrint, lrintf, lrintl Zaokrągla wartość zmiennoprzecinkową do najbliższej long wartości
_lrotl, _lrotr Obraca wartość całkowitą w lewo lub w prawo
lround, lroundf, lroundl Zaokrągla wartość zmiennoprzecinkową do najbliższej long wartości
_matherr Domyślna procedura obsługi błędów matematycznych
__max Makro zwracające większą z dwóch wartości
__min Makro zwracające mniejsze z dwóch wartości
modf, modff, modfl Dzieli wartość zmiennoprzecinkową na części ułamkowe i całkowite
nan, nanf, nanl Zwraca cichą wartość NaN
nearbyint, nearbyintf, nearbyintl Zwraca zaokrąglona wartość
nextafter, nextafterf, nextafterl, _nextafter, _nextafterf Zwraca następną reprezentującą wartość zmiennoprzecinkową
nexttoward, nexttowardf, nexttowardl Zwraca następną reprezentującą wartość zmiennoprzecinkową
pow, powf, powl Zwraca wartość xy
remainder, remainderf, remainderl Oblicza pozostałą część ilorazu dwóch wartości zmiennoprzecinkowych
remquo, remquof, remquol Oblicza pozostałą część dwóch wartości całkowitych
rint, rintf, rintl Zaokrągla wartość zmiennoprzecinkową
_rotl, _rotl64, _rotr, _rotr64 Obraca bity w typach liczb całkowitych
round, roundf, roundl Zaokrągla wartość zmiennoprzecinkową
_scalb, _scalbf Skaluje argument o mocy 2
scalbn, scalbnf, scalbnl, scalbln, scalblnf, scalblnl Mnoży liczbę zmiennoprzecinkową przez całkowitą moc FLT_RADIX
_set_controlfp Ustawia słowo sterujące zmiennoprzecinkowe
_set_SSE2_enable Włącza lub wyłącza instrukcje SSE2
signbit Testuje bit znaku wartości zmiennoprzecinkowej
sin, sinf, sinl Oblicza sinus
sinh, sinhf, sinhl Oblicza sinus hiperboliczny
sqrt, sqrtf, sqrtl Oblicza pierwiastek kwadratowy
_status87, _statusfp, _statusfp2 Pobiera słowo o stanie zmiennoprzecinkowe
strtof, _strtof_l Konwertuje ciąg na float
strtold, _strtold_l Konwertuje ciąg na long double
tan, tanf, tanl Oblicza tangens
tanh, tanhf, tanhl Oblicza tangens hiperboliczny
tgamma, tgammaf, tgammal Oblicza funkcję gamma
trunc, truncf, truncl Obcina część ułamkową
_wtof, _wtof_l Konwertuje szeroki ciąg na double
_y0, _y1, _yn Oblicza funkcję Bessel

Zobacz też

Procedury czasu wykonywania języka Universal C według kategorii
Zmiennoprzecinkowe typy pierwotne