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ść x y |
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