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


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

Универсальная библиотека среды выполнения 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, labs, llabs, _abs64 Вычисляет абсолютное значение целого числа
acos, acosf, acosl Вычисляет арккосинус
acosh, acoshf, acoshl Вычисляет гиперболический арккосинус
asin, asinf, asinl Вычисляет арксинус
asinh, asinhf, asinhl Вычисляет гиперболический арксинус
atan, atanf, atanl, atan2, atan2f, atan2l Вычисляет арктангенс
atanh, atanhf, atanhl Вычисляет гиперболический арктангенс
_atodbl, _atodbl_l Преобразует строку для языкового стандарта в строку double
atof, _atof_l Преобразует строку в double
_atoflt, _atoflt_l, _atoldbl, _atoldbl_l Преобразует строку для языкового стандарта в или floatlong double
cbrt, cbrtf, cbrtl Вычисляет кубический корень
ceil, ceilf, ceill Вычисляет с округлением вверх
_chgsign, _chgsignf, _chgsignl Вычисляет аддитивную инверсию
_clear87, _clearfp Получает и сбрасывает реестр состояния блока операций с плавающей запятой
_control87, _controlfp, __control87_2 Получает и задает управляющее слово блока операций с плавающей запятой
_controlfp_s Безопасная версия _controlfp
copysign, copysignf, copysignl, _copysign, _copysignf, _copysignl Возвращает значение, которое имеет абсолютное значение одного аргумента и знак другого
cos, cosf, cosl Вычисляет синус
cosh, coshf, coshl Вычисляет гиперболический синус
div, ldiv, lldiv Вычисляет частное и остаток от деления двух целочисленных значений
_ecvt, ecvt Преобразует объект double в строку
_ecvt_s Безопасная версия _ecvt
erf, erff, erfl Вычисляет функцию ошибок
erfc, erfcf, erfcl Вычисляет дополнительную функцию ошибок
exp, expf, expl Вычисляет экспоненту ex
exp2, exp2f, exp2l Вычисляет экспоненту 2x
expm1, expm1f, expm1l Вычисляет ex-1
fabs, fabsf, fabsl Вычисляет абсолютное значение типа с плавающей запятой
_fcvt, fcvt Преобразует число с плавающей запятой в строку
_fcvt_s Безопасная версия _fcvt
fdim, fdimf, fdiml Определяет положительную разность между двумя значениями
feclearexcept Сбрасывает указанные исключения с плавающей запятой
fegetenv Хранит текущую среду с плавающей запятой
fegetexceptflag Получает состояние указанных исключений с плавающей запятой
fegetround Получает режим округления чисел с плавающей запятой
feholdexcept Задает безостановочный режим исключений с плавающей запятой
feraiseexcept Вызывает указанные исключения с плавающей запятой
fesetenv Задает текущую среду с плавающей запятой
fesetexceptflag Задает флаги состояния указанных чисел с плавающей запятой
fesetround Задает режим округления указанных чисел с плавающей запятой
fetestexcept Определяет, какие флаги состояния исключения с плавающей запятой заданы
feupdateenv Восстанавливает среду с плавающей запятой, а затем вызывает предыдущее исключение
floor, floorf, floorl Вычисляет с округлением вниз
fma, fmaf, fmal Вычисляет склеенную операцию умножения-сложения
fmax, fmaxf, fmaxl Вычисляет максимальное значение аргументов
fmin, fminf, fminl Вычисляет минимум аргументов
fmod, fmodf, fmodl Вычисляет остаток с плавающей запятой
_fpclass, _fpclassf Возвращает классификацию значения с плавающей запятой
fpclassify Возвращает классификацию значения с плавающей запятой
_fpieee_flt Задает обработчик исключений с плавающей запятой
_fpreset Сбрасывает среду с плавающей запятой
frexp, frexpf, frexpl Получает мантиссу и показатель степени числа с плавающей запятой
_gcvt, gcvt Преобразует число с плавающей запятой в строку
_gcvt_s Безопасная версия _gcvt
_get_FMA3_enable, _set_FMA3_enable Получает или задает флаг для использования инструкций FMA3 в 64-разрядной среде
hypot, hypotf, hypotl, _hypot, _hypotf, _hypotl Вычисляет гипотенузу
ilogb, ilogbf, ilogbl Вычисляет показатель степени целого числа по основанию 2
imaxabs Вычисляет абсолютное значение целого числа
imaxdiv Вычисляет частное и остаток от деления двух целочисленных значений
isfinite, _finite, _finitef Определяет, является ли значение конечным
isgreater, isgreaterequal, isless, islessequal, islessgreater, isunordered Сравнивает порядок двух значений с плавающей запятой
isinf Определяет, является ли значение с плавающей запятой бесконечным
isnan, _isnan, _isnanf Проверяет значение с плавающей запятой для NaN
isnormal Проверяет, является ли значение с плавающей запятой конечным и не субнормальным
_j0, _j1, _jn Вычисляет функцию Бесселя
ldexp, ldexpf, ldexpl Вычисляет x*2n
lgamma, lgammaf, lgammal Вычисляет натуральный логарифм абсолютного значения гамма-функции
llrint, llrintf, llrintl Округляет значение с плавающей запятой до ближайшего long long значения.
llround, llroundf, llroundl Округляет значение с плавающей запятой до ближайшего long long значения.
log, logf, logl, log10, log10f, log10l Вычисляет натуральный логарифма или логарифм по основанию 10
log1p, log1pf, log1pl Вычисляет натуральный логарифм числа 1+x
log2, log2f, log2l Вычисляет логарифм по основанию 2
logb, logbf, logbl, _logb, _logbf Возвращает показатель степени значения с плавающей запятой
lrint, lrintf, lrintl Округляет значение с плавающей запятой до ближайшего long значения.
_lrotl, _lrotr Чередует целочисленное значение влево или вправо
lround, lroundf, lroundl Округляет значение с плавающей запятой до ближайшего long значения.
_matherr Обработчик математических ошибок по умолчанию
__max Макрос, который возвращает большее из двух значений
__min Макрос, который возвращает меньшее из двух значений
modf, modff, modfl Разбивает значение с плавающей запятой на дробную и целую части
nan, nanf, nanl Возвращает несигнальное значение NaN (QNaN)
nearbyint, nearbyintf, nearbyintl Возвращает округленное значение
nextafter, nextafterf, nextafterl, _nextafter, _nextafterf Возвращает следующее представимое значение с плавающей запятой
nexttoward, nexttowardf, nexttowardl Возвращает следующее представимое значение с плавающей запятой
pow, powf, powl Возвращает значение xy
remainder, remainderf, remainderl Вычисляет остаток от частного двух значений с плавающей запятой
remquo, remquof, remquol Вычисляет остаток от деления двух целочисленных значений
rint, rintf, rintl Округляет значение с плавающей запятой
_rotl, _rotl64, _rotr, _rotr64 Чередует биты в целочисленных типах
round, roundf, roundl Округляет значение с плавающей запятой
_scalb, _scalbf Масштабирует аргумент по степени числа 2
scalbn, scalbnf, scalbnl, scalbln, scalblnf, scalblnl Умножает число с плавающей запятой на целочисленную мощность FLT_RADIX
_set_controlfp Задает управляющее слово блока операций с плавающей запятой
_set_SSE2_enable Включает или отключает инструкции SSE2
signbit Проверяет знаковый бит значения с плавающей запятой
sin, sinf, sinl Вычисляет синус
sinh, sinhf, sinhl Вычисляет гиперболический синус
sqrt, sqrtf, sqrtl Вычисляет квадратный корень
_status87, _statusfp, _statusfp2 Получает слово состояния модуля операций с плавающей запятой
strtof, _strtof_l Преобразует строку в float
strtold, _strtold_l Преобразует строку в long double
tan, tanf, tanl Вычисляет тангенс
tanh, tanhf, tanhl Вычисляет гиперболический тангенс
tgamma, tgammaf, tgammal Вычисляет гамма-функцию
trunc, truncf, truncl Усекает дробную часть
_wtof, _wtof_l Преобразует широкую строку в double
_y0, _y1, _yn Вычисляет функцию Бесселя

См. также

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