Стандартная библиотека C |
---|
Общие темы |
Разные заголовки |
Математические операции C - это группа функций в стандартной библиотеке языка программирования C, реализующая основные математические функции. [1] [2] Все функции так или иначе используют числа с плавающей запятой . Различные стандарты C предоставляют разные, хотя и обратно совместимые, наборы функций. Большинство этих функций также доступны в стандартной библиотеке C ++ , хотя и в других заголовках (заголовки C также включены, но только как устаревшая функция совместимости).
Обзор функций [ править ]
Большинство математических функций определены в <math.h>
( <cmath>
заголовок в C ++). Функции , которые действуют на целые числа, такие , как abs
, labs
, div
, и ldiv
, вместо этого определены в <stdlib.h>
заголовке ( <cstdlib>
заголовок в C ++).
Любые функции, которые работают с углами, используют радианы в качестве единицы угла. [1]
Не все эти функции доступны в версии стандарта C89 . Для тех, которые есть, функции принимают только тип double
для аргументов с плавающей запятой, что приводит к дорогостоящим преобразованиям типов в коде, который в противном случае использовал значения с одинарной точностью float
. В C99 этот недостаток был исправлен путем введения новых наборов функций float
и long double
аргументов. Эти функции были определены f
и l
суффиксы соответственно. [3]
Функция | Описание | |
---|---|---|
abs labs llabs | вычисляет абсолютное значение целочисленного значения | |
fabs | вычисляет абсолютное значение значения с плавающей запятой | |
div ldiv lldiv | вычисляет частное и остаток от целочисленного деления | |
fmod | остаток от операции деления с плавающей запятой | |
remainder | подписанный остаток от операции деления | |
remquo | остаток со знаком, а также три последних бита операции деления | |
fma | объединенная операция умножения-сложения | |
fmax | большее из двух значений с плавающей запятой | |
fmin | меньшее из двух значений с плавающей запятой | |
fdim | положительная разница двух значений с плавающей запятой | |
nan nanf nanl | возвращает не-число (NaN) | |
Экспоненциальные функции | exp | возвращает e в заданной степени |
exp2 | возвращает 2 в заданной степени | |
expm1 | возвращает e в заданной степени минус один | |
log | вычисляет натуральный логарифм (по основанию e) | |
log2 | вычисляет двоичный логарифм (с основанием 2) | |
log10 | вычисляет десятичный логарифм (с основанием 10) | |
log1p | вычисляет натуральный логарифм (по основанию e) 1 плюс заданное число | |
ilogb | извлекает экспоненту числа | |
logb | извлекает экспоненту числа | |
Силовые функции | sqrt | вычисляет квадратный корень |
cbrt | вычисляет кубический корень | |
hypot | вычисляет квадратный корень из суммы квадратов двух заданных чисел | |
pow | возводит число в указанную степень [4] | |
Тригонометрические функции | sin | вычисляет синус |
cos | вычисляет косинус | |
tan | вычисляет касательную | |
asin | вычисляет арксинус | |
acos | вычисляет арккосинус | |
atan | вычисляет арктангенс | |
atan2 | вычисляет арктангенс, используя знаки для определения квадрантов | |
Гиперболические функции | sinh | вычисляет гиперболический синус |
cosh | вычисляет гиперболический косинус | |
tanh | вычисляет гиперболический тангенс | |
asinh | вычисляет гиперболический арксинус | |
acosh | вычисляет гиперболический арккосинус | |
atanh | вычисляет гиперболический арктангенс | |
Ошибка и гамма- функции | erf | вычисляет функцию ошибок |
erfc | вычисляет дополнительную функцию ошибок | |
lgamma | вычисляет натуральный логарифм абсолютного значения гамма-функции | |
tgamma | вычисляет гамма-функцию | |
Ближайшие целочисленные операции с плавающей запятой | ceil | возвращает ближайшее целое число не меньше заданного значения |
floor | возвращает ближайшее целое число, не превышающее заданное значение | |
trunc | возвращает ближайшее целое число, не превышающее по величине заданное значение | |
round lround llround | возвращает ближайшее целое число, округляя от нуля в промежуточных случаях | |
nearbyint | возвращает ближайшее целое число, используя текущий режим округления | |
rint lrint llrint | возвращает ближайшее целое число, используя текущий режим округления, за исключением случаев, когда результат отличается | |
Функции управления числами с плавающей запятой | frexp | разлагает число на значение и степень двойки |
ldexp | умножает число на 2 в степени | |
modf | разлагает число на целые и дробные части | |
scalbn scalbln | умножает число на FLT_RADIX в степени | |
nextafter nexttoward | возвращает следующее представимое значение с плавающей запятой по направлению к заданному значению | |
copysign | копирует знак значения с плавающей запятой | |
Классификация | fpclassify | классифицирует данное значение с плавающей запятой |
isfinite | проверяет, имеет ли данное число конечное значение | |
isinf | проверяет, бесконечно ли заданное число | |
isnan | проверяет, является ли данное число NaN | |
isnormal | проверяет, является ли данный номер нормальным | |
signbit | проверяет, является ли данное число отрицательным |
Среда с плавающей точкой [ править ]
C99 добавляет несколько функций и типов для детального управления средой с плавающей запятой. [3] Эти функции могут использоваться для управления различными настройками, которые влияют на вычисления с плавающей запятой, например, режимом округления, при каких условиях возникают исключения, когда числа сбрасываются до нуля и т. Д. Функции среды с плавающей запятой и типы определены в <fenv.h>
заголовке ( <cfenv>
в C ++ ).
Функция | Описание |
---|---|
feclearexcept | очищает исключения ( C99 ) |
fegetenv | хранит текущую среду с плавающей запятой ( C99 ) |
fegetexceptflag | хранит флаги текущего состояния ( C99 ) |
fegetround | извлекает текущее направление округления ( C99 ) |
feholdexcept | сохраняет текущую среду с плавающей запятой и очищает все исключения ( C99 ) |
feraiseexcept | вызывает исключение с плавающей запятой ( C99 ) |
fesetenv | устанавливает текущую среду с плавающей запятой ( C99 ) |
fesetexceptflag | устанавливает флаги текущего состояния ( C99 ) |
fesetround | устанавливает текущее направление округления ( C99 ) |
fetestexcept | проверяет, были ли вызваны определенные исключения ( C99 ) |
feupdateenv | восстанавливает среду с плавающей запятой, но сохраняет текущие исключения ( C99 ) |
Комплексные числа [ править ]
В C99 добавлено новое _Complex
ключевое слово (и complex
удобный макрос), обеспечивающее поддержку комплексных чисел. Любой тип с плавающей запятой может быть изменен с помощью complex
, а затем определяется как пара чисел с плавающей запятой. Обратите внимание, что C99 и C ++ не реализуют комплексные числа совместимым с кодом способом - последний вместо этого предоставляет класс .std::complex
Все операции с комплексными числами определены в <complex.h>
заголовке. Как и в случае вещественных функций, f
или l
суффикс обозначает float complex
или long double complex
вариант функции.
Функция | Описание | |
---|---|---|
Основные операции | cabs | вычисляет абсолютное значение ( C99 ) |
carg | вычисляет аргумент комплексного числа ( C99 ) | |
cimag | вычисляет мнимую часть комплексного числа ( C99 ) | |
creal | вычисляет действительную часть комплексного числа ( C99 ) | |
вычисляет комплексное сопряжение ( C99 ) | ||
cproj | вычисляет комплексную проекцию на сферу Римана ( C99 ) | |
Операции возведения в степень | cexp | вычисляет комплексную экспоненту ( C99 ) |
clog | вычисляет комплексный логарифм ( C99 ) | |
csqrt | вычисляет комплексный квадратный корень ( C99 ) | |
cpow | вычисляет комплексную мощность ( C99 ) | |
Тригонометрические операции | csin | вычисляет комплексный синус ( C99 ) |
ccos | вычисляет комплексный косинус ( C99 ) | |
ctan | вычисляет комплексный тангенс ( C99 ) | |
casin | вычисляет комплексный арксинус ( C99 ) | |
cacos | вычисляет комплексный арккосинус ( C99 ) | |
catan | вычисляет комплексный арктангенс ( C99 ) | |
Гиперболические операции | csinh | вычисляет комплексный гиперболический синус ( C99 ) |
ccosh | вычисляет комплексный гиперболический косинус ( C99 ) | |
ctanh | вычисляет комплексный гиперболический тангенс ( C99 ) | |
casinh | вычисляет комплексный гиперболический арксинус ( C99 ) | |
cacosh | вычисляет комплексный гиперболический арккосинус ( C99 ) | |
catanh | вычисляет комплексный гиперболический арктангенс ( C99 ) |
Еще несколько сложных функций «зарезервированы для будущего использования в C99». [5] Реализации предоставляются проектами с открытым исходным кодом, которые не являются частью стандартной библиотеки.
Функция | Описание | |
---|---|---|
Функции ошибок | cerf | вычисляет сложную функцию ошибок ( C99 ) |
cerfc | вычисляет комплексную дополнительную функцию ошибок ( C99 ) |
Типовые функции [ править ]
Заголовок <tgmath.h>
определяет универсальный макрос для каждой математической функции, определенной в <math.h>
и <complex.h>
. Это добавляет ограниченную поддержку функции перегрузки математических функций: одно и то же имя функции может использоваться с разными типами параметров; фактическая функция будет выбрана во время компиляции в соответствии с типами параметров.
Каждый типа унифицированной макрос , который соответствует функции , которая определяется как для действительных и комплексных чисел инкапсулирует в общей сложности 6 различных функций: float
, double
и long double
, и их complex
вариантов. В типовые общие макросы , которые соответствуют функции , которая определяется только для действительных чисел инкапсулирует в общей сложности 3 различных функций: float
, double
и long double
варианты этой функции.
Язык C ++ включает встроенную поддержку перегрузки функций и, таким образом, не предоставляет <tgmath.h>
заголовок даже в качестве функции совместимости.
Генерация случайных чисел [ править ]
Заголовок <stdlib.h>
( <cstdlib>
в C ++) определяет несколько функций, которые можно использовать для генерации статистически случайных чисел. [6]
Функция | Описание |
---|---|
rand | генерирует псевдослучайное число от 0 до RAND_MAX включительно. |
srand | инициализирует генератор псевдослучайных чисел |
arc4random | генерирует псевдослучайное число от 0 до UINT32_MAX , обычно используя лучший алгоритм, чемrand |
arc4random_uniform | генерирует псевдослучайное число от 0 до максимального значения. |
arc4random_buf | заполнить буфер псевдослучайным битовым потоком. |
arc4random_stir | инициализирует генератор псевдослучайных чисел . |
arc4random
Семейство случайных функций числа не определены в стандарте POSIX, но встречается в некоторых распространенных libc
реализациях. Он используется для обозначения ключевого потока генератора просочились версии RC4 шифра (отсюда « lleged RC4 »), но различные алгоритмы, как правило , из других шифров , как ChaCha20 , были реализованы , так как с тем же именем.
Качество случайности от rand
обычно слишком низкое, чтобы даже считаться статистически случайным, и для этого требуется явное заполнение. Обычно рекомендуется использовать arc4random
вместо него, rand
когда это возможно. Некоторые библиотеки C реализуют внутреннее rand
использование arc4random_uniform
.
Реализации [ править ]
В системах POSIX , таких как Linux и BSD , математические функции (как заявлено в <math.h>
) объединяются отдельно в математической библиотеке libm
. Следовательно, если какая-либо из этих функций используется, компоновщику должна быть предоставлена директива -lm
. Существуют различные libm
реализации, в том числе:
- GNU Libc «s libm
- AMD «s libm
- Red Hat «s libm
- Sun «S FDLIBM , который был использован в качестве основы для FreeBSD » s msun и OpenBSD «s libm , оба из которых , в свою очередь , были основой Джулии » s OpenLibm
- MUSL «сек libm , на основе BSD libms и других проектов , таких как ARM
- Arénaire проекта CRlibm ( правильно округлый libm), и его преемник MetaLibm . Использует алгоритм Ремеза для автоматической генерации приближений, которые формально доказаны.
Реализации не обязательно под именем libm
включают:
- ARM «s оптимизированные математические процедуры
- GCE-Math - это версия математических функций C / C ++, написанных для C ++
constexpr
(расчет во время компиляции) - Математические библиотеки SIMD (векторизованные) включают SLEEF , Yeppp! и VCL Агнера Фога , а также несколько программ с закрытым исходным кодом, таких как SVML и DirectXMath. [7]
См. Также [ править ]
- Поддержка C99 с плавающей запятой
Ссылки [ править ]
- ^ a b Спецификация ISO / IEC 9899: 1999 (PDF) . п. 212, § 7.12.
- ^ Прата, Стивен (2004). Праймер С плюс . Самс Паблишинг. Приложение B, раздел V: Стандартная библиотека ANSI C с дополнениями C99. ISBN 0-672-32696-5.
- ^ a b Прата, Стивен (2004). Праймер С плюс . Самс Паблишинг. Приложение B, Раздел VIII: Усовершенствования числовых вычислений C99. ISBN 0-672-32696-5.
- ^ В обозначениях может показаться удобным использовать pow ( x , 2) или pow ( x , 3) для вычисления квадратов или кубов. Однако это не рекомендуется в критичном ко времени коде. Если реализация не позаботится об этих случаях во время компиляции, x * x или x * x * x будут выполняться намного быстрее. Кроме того, sqrt ( x ) и cbrt ( x ) следует предпочесть pow ( x , .5) или pow ( x , 1. / 3).
- ^ man cerf (3), man cerfc (3), см., например, https://linux.die.net/man/3/cerf .
- ^ «Библиотека GNU C - ISO Random» . Проверено 18 июля 2018 .
- ^ Кордес, Питер. "Интеллект - Где внутреннее" _mm256_pow_ps "Кланга?" . Переполнение стека .
Внешние ссылки [ править ]
В Викиуке по программированию на C есть страница по теме: Программирование на C / Справочник по C |
- : математические объявления - Справочник по базовым определениям, Единая спецификация UNIX , выпуск 7 от The Open Group
- Справочник C по математическим функциям