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


Поддержка математических функций для чисел с плавающей запятой

Универсальная библиотека среды выполнения C (UCRT) предоставляет множество функций математики с плавающей запятой, включая все функции, необходимые ISO C99. Функции с плавающей запятой предназначены для балансировки производительности и правильности. Так как получение правильно округленного результата может оказаться неоправданно дорогим, эти функции позволяют получить значение, максимально приближенное к правильно округленному результату. В большинстве случаев результат производится в пределах +/-1 ULP (единица наименьшей точности) правильно округленного результата, хотя в некоторых случаях может возникнуть больше неточностей.

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

Во многих функциях математической библиотеки с плавающей точкой используются различные реализации разной архитектуры ЦП. Например, в 32-разрядных CRT x86 могут использоваться не такие реализации, как в 64-разрядных CRT x64. Кроме того, некоторые функции могут содержать сразу несколько реализаций заданной архитектуры ЦП. Наиболее эффективная реализация выбирается в среде выполнения динамически в зависимости от того, какие наборы инструкций поддерживает ЦП. Например, в 32-разрядных CRT x86 некоторые функции включают сразу две реализации — x87 и SSE2. При работе на ЦП, который поддерживает SSE2, используется более быстрая реализация SSE2. При запуске на ЦП, который не поддерживает SSE2, используется медленная реализация x87. Так как различные реализации функций математической библиотеки могут использовать для получения результатов различные инструкции ЦП и разнообразные алгоритмы, эти функции могут давать различные результаты на разных ЦП. В большинстве случаев результаты находятся в пределах +/-1 ULP правильно округленного результата, но фактические результаты могут отличаться по ЦП.

Предыдущие 16-разрядные версии Microsoft C/C++ и Microsoft Visual C++ поддерживали тип long double как тип данных с плавающей точкой 80-битной точности. В более поздних версиях Visual C++ тип данных long double представляет собой тип данных с плавающей запятой 64-битной точности, идентичный типу double. Компилятор обрабатывает long double и double как различные типы данных, однако функции long double идентичны своим аналогам, double. Для обеспечения совместимости с исходным кодом ISO C99 в CRT предоставляются long double-версии математических функций, однако следует иметь в виду, что двоичное представление может быть не таким, как в других компиляторах.

Поддерживаемые математические функции для чисел с плавающей запятой

Маршрут Использование
abs, , labsllabs_abs64 Вычисляет абсолютное значение целого числа
acos, , acosfacosl Вычисляет арккосинус
acosh, , acoshfacoshl Вычисляет гиперболический арккосинус
asin, , asinfasinl Вычисляет арксинус
asinh, , asinhfasinhl Вычисляет гиперболический арксинус
atan, , atanfatan2atanlatan2f,atan2l Вычисляет арктангенс
atanh, , atanhfatanhl Вычисляет гиперболический арктангенс
_atodbl, _atodbl_l Преобразует строку для языкового стандарта в строку double
atof, _atof_l Преобразует строку в double
_atoflt, , _atoflt_l_atoldbl_atoldbl_l Преобразует строку для языкового стандарта в или floatlong double
cbrt, , cbrtfcbrtl Вычисляет кубический корень
ceil, , ceilfceill Вычисляет с округлением вверх
_chgsign, , _chgsignf_chgsignl Вычисляет аддитивную инверсию
_clear87, _clearfp Получает и сбрасывает реестр состояния блока операций с плавающей запятой
_control87, , _controlfp__control87_2 Получает и задает управляющее слово блока операций с плавающей запятой
_controlfp_s Безопасная версия _controlfp
copysign, , copysignf_copysigncopysignl_copysignf,_copysignl Возвращает значение, которое имеет абсолютное значение одного аргумента и знак другого
cos, , cosfcosl Вычисляет синус
cosh, , coshfcoshl Вычисляет гиперболический синус
div, , ldivlldiv Вычисляет частное и остаток от деления двух целочисленных значений
_ecvt, ecvt Преобразует объект double в строку
_ecvt_s Безопасная версия _ecvt
erf, , erfferfl Вычисляет функцию ошибок
erfc, , erfcferfcl Вычисляет дополнительную функцию ошибок
exp, , expfexpl Вычисляет экспоненту ex
exp2, , exp2fexp2l Вычисляет экспоненту 2x
expm1, , expm1fexpm1l Вычисляет ex-1
fabs, , fabsffabsl Вычисляет абсолютное значение типа с плавающей запятой
_fcvt, fcvt Преобразует число с плавающей запятой в строку
_fcvt_s Безопасная версия _fcvt
fdim, , fdimffdiml Определяет положительную разность между двумя значениями
feclearexcept Сбрасывает указанные исключения с плавающей запятой
fegetenv Хранит текущую среду с плавающей запятой
fegetexceptflag Получает состояние указанных исключений с плавающей запятой
fegetround Получает режим округления чисел с плавающей запятой
feholdexcept Задает безостановочный режим исключений с плавающей запятой
feraiseexcept Вызывает указанные исключения с плавающей запятой
fesetenv Задает текущую среду с плавающей запятой
fesetexceptflag Задает флаги состояния указанных чисел с плавающей запятой
fesetround Задает режим округления указанных чисел с плавающей запятой
fetestexcept Определяет, какие флаги состояния исключения с плавающей запятой заданы
feupdateenv Восстанавливает среду с плавающей запятой, а затем вызывает предыдущее исключение
floor, , floorffloorl Вычисляет с округлением вниз
fma, , fmaffmal Вычисляет склеенную операцию умножения-сложения
fmax, , fmaxffmaxl Вычисляет максимальное значение аргументов
fmin, , fminffminl Вычисляет минимум аргументов
fmod, , fmodffmodl Вычисляет остаток с плавающей запятой
_fpclass, _fpclassf Возвращает классификацию значения с плавающей запятой
fpclassify Возвращает классификацию значения с плавающей запятой
_fpieee_flt Задает обработчик исключений с плавающей запятой
_fpreset Сбрасывает среду с плавающей запятой
frexp, , frexpffrexpl Получает мантиссу и показатель степени числа с плавающей запятой
_gcvt, gcvt Преобразует число с плавающей запятой в строку
_gcvt_s Безопасная версия _gcvt
_get_FMA3_enable, _set_FMA3_enable Получает или задает флаг для использования инструкций FMA3 в 64-разрядной среде
hypot, , hypotf_hypothypotl_hypotf,_hypotl Вычисляет гипотенузу
ilogb, , ilogbfilogbl Вычисляет показатель степени целого числа по основанию 2
imaxabs Вычисляет абсолютное значение целого числа
imaxdiv Вычисляет частное и остаток от деления двух целочисленных значений
isfinite, , _finite_finitef Определяет, является ли значение конечным
isgreater, , isgreaterequalislessequalislessislessgreater,isunordered Сравнивает порядок двух значений с плавающей запятой
isinf Определяет, является ли значение с плавающей запятой бесконечным
isnan, , _isnan_isnanf Проверяет значение с плавающей запятой для NaN
isnormal Проверяет, является ли значение с плавающей запятой конечным и не субнормальным
_j0, , _j1_jn Вычисляет функцию Бесселя
ldexp, , ldexpfldexpl Вычисляет x*2n
lgamma, , lgammaflgammal Вычисляет натуральный логарифм абсолютного значения гамма-функции
llrint, , llrintfllrintl Округляет значение с плавающей запятой до ближайшего long long значения.
llround, , llroundfllroundl Округляет значение с плавающей запятой до ближайшего long long значения.
log, , logflog10logllog10f,log10l Вычисляет натуральный логарифма или логарифм по основанию 10
log1p, , log1pflog1pl Вычисляет натуральный логарифм числа 1+x
log2, , log2flog2l Вычисляет логарифм по основанию 2
logb, , logbflogbl, _logb_logbf Возвращает показатель степени значения с плавающей запятой
lrint, , lrintflrintl Округляет значение с плавающей запятой до ближайшего long значения.
_lrotl, _lrotr Чередует целочисленное значение влево или вправо
lround, , lroundflroundl Округляет значение с плавающей запятой до ближайшего long значения.
_matherr Обработчик математических ошибок по умолчанию
__max Макрос, который возвращает большее из двух значений
__min Макрос, который возвращает меньшее из двух значений
modf, , modffmodfl Разбивает значение с плавающей запятой на дробную и целую части
nan, , nanfnanl Возвращает несигнальное значение NaN (QNaN)
nearbyint, , nearbyintfnearbyintl Возвращает округленное значение
nextafter, , nextafterfnextafterl, _nextafter_nextafterf Возвращает следующее представимое значение с плавающей запятой
nexttoward, , nexttowardfnexttowardl Возвращает следующее представимое значение с плавающей запятой
pow, , powfpowl Возвращает значение xy
remainder, , remainderfremainderl Вычисляет остаток от частного двух значений с плавающей запятой
remquo, , remquofremquol Вычисляет остаток от деления двух целочисленных значений
rint, , rintfrintl Округляет значение с плавающей запятой
_rotl, , _rotl64_rotr_rotr64 Чередует биты в целочисленных типах
round, , roundfroundl Округляет значение с плавающей запятой
_scalb, _scalbf Масштабирует аргумент по степени числа 2
scalbn, , scalbnfscalblnscalbnlscalblnf,scalblnl Умножает число с плавающей запятой на целочисленную мощность FLT_RADIX
_set_controlfp Задает управляющее слово блока операций с плавающей запятой
_set_SSE2_enable Включает или отключает инструкции SSE2
signbit Проверяет знаковый бит значения с плавающей запятой
sin, , sinfsinl Вычисляет синус
sinh, , sinhfsinhl Вычисляет гиперболический синус
sqrt, , sqrtfsqrtl Вычисляет квадратный корень
_status87, , _statusfp_statusfp2 Получает слово состояния модуля операций с плавающей запятой
strtof, _strtof_l Преобразует строку в float
strtold, _strtold_l Преобразует строку в long double
tan, , tanftanl Вычисляет тангенс
tanh, , tanhftanhl Вычисляет гиперболический тангенс
tgamma, , tgammaftgammal Вычисляет гамма-функцию
trunc, , truncftruncl Усекает дробную часть
_wtof, _wtof_l Преобразует широкую строку в double
_y0, , _y1_yn Вычисляет функцию Бесселя

См. также

Универсальные подпрограммы среды выполнения C по категориям
Примитивы с плавающей запятой