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, , acosfacosl Oblicza cosinus łuku
acosh, , acoshfacoshl Oblicza cosinus hiperboliczny łuk
asin, , asinfasinl Oblicza sinus łuku
asinh, , asinhfasinhl Oblicza sinus hiperboliczny łuk
atan, , atanf, atanl, atan2, , atan2fatan2l Oblicza tangens łuku
atanh, , atanhfatanhl 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, , cbrtfcbrtl Oblicza katalog główny modułu
ceil, , ceilfceill 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, , cosfcosl Oblicza sinus
cosh, , coshfcoshl Oblicza sinus hiperboliczny
div, , ldivlldiv 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, , erfferfl Oblicza funkcję błędu
erfc, , erfcferfcl Oblicza uzupełniającą funkcję błędu
exp, , expfexpl Oblicza wykładniczo ex
exp2, , exp2fexp2l Oblicza wykładniczą wartość 2x
expm1, , expm1fexpm1l Obliczenia ex-1
fabs, , fabsffabsl Oblicza wartość bezwzględną typu zmiennoprzecinkowego
_fcvt, fcvt Konwertuje liczbę zmiennoprzecinkową na ciąg
_fcvt_s Bezpieczna wersja programu _fcvt
fdim, , fdimffdiml 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, , floorffloorl Oblicza podłogę
fma, , fmaffmal Oblicza bezpieczną sumę mnożenia
fmax, , fmaxffmaxl Oblicza maksymalną liczbę argumentów
fmin, , fminffminl Oblicza minimum argumentów
fmod, , fmodffmodl 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, , frexpffrexpl 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, , ilogbfilogbl 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, , islessgreaterisunordered 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, , ldexpfldexpl Obliczenia x*2n
lgamma, , lgammaflgammal Oblicza logarytm naturalny wartości bezwzględnej funkcji gamma
llrint, , llrintfllrintl Zaokrągla wartość zmiennoprzecinkową do najbliższej long long wartości
llround, , llroundfllroundl Zaokrągla wartość zmiennoprzecinkową do najbliższej long long wartości
log, , logf, logl, log10, , log10flog10l Oblicza logarytm naturalny lub base-10
log1p, , log1pflog1pl Oblicza logarytm naturalny 1+x
log2, , log2flog2l Oblicza logarytm base-2
logb, , logbf, logbl, , _logb_logbf Zwraca wykładnik wartości zmiennoprzecinkowej
lrint, , lrintflrintl Zaokrągla wartość zmiennoprzecinkową do najbliższej long wartości
_lrotl, _lrotr Obraca wartość całkowitą w lewo lub w prawo
lround, , lroundflroundl 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, , modffmodfl Dzieli wartość zmiennoprzecinkową na części ułamkowe i całkowite
nan, , nanfnanl Zwraca cichą wartość NaN
nearbyint, , nearbyintfnearbyintl Zwraca zaokrąglona wartość
nextafter, , nextafterf, nextafterl, , _nextafter_nextafterf Zwraca następną reprezentującą wartość zmiennoprzecinkową
nexttoward, , nexttowardfnexttowardl Zwraca następną reprezentującą wartość zmiennoprzecinkową
pow, , powfpowl Zwraca wartość xy
remainder, , remainderfremainderl Oblicza pozostałą część ilorazu dwóch wartości zmiennoprzecinkowych
remquo, , remquofremquol Oblicza pozostałą część dwóch wartości całkowitych
rint, , rintfrintl Zaokrągla wartość zmiennoprzecinkową
_rotl, , _rotl64, , _rotr_rotr64 Obraca bity w typach liczb całkowitych
round, , roundfroundl Zaokrągla wartość zmiennoprzecinkową
_scalb, _scalbf Skaluje argument o mocy 2
scalbn, , scalbnf, scalbnl, scalbln, , scalblnfscalblnl 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, , sinfsinl Oblicza sinus
sinh, , sinhfsinhl Oblicza sinus hiperboliczny
sqrt, , sqrtfsqrtl 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, , tanftanl Oblicza tangens
tanh, , tanhftanhl Oblicza tangens hiperboliczny
tgamma, , tgammaftgammal Oblicza funkcję gamma
trunc, , truncftruncl 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