Математические функции C
Стандартная библиотека C (libc) |
---|
Общие темы |
Разные заголовки |
|
Математические операции 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 | разлагает число на мантиссу и степень 2 |
ldexp | умножает число на 2, возведенное в степень | |
modf | разлагает число на целую и дробную части | |
scalbn scalbln | умножает число на FLT_RADIX, возведенное в степень | |
nextafter nexttoward | возвращает следующее представимое значение с плавающей запятой в направлении заданного значения | |
copysign | копирует знак значения с плавающей запятой | |
Классификация | fpclassify | классифицирует данное значение с плавающей запятой |
isfinite | проверяет, имеет ли аргумент конечное значение | |
isinf | проверяет, бесконечен ли аргумент | |
isnan | проверяет, является ли аргумент NaN | |
isnormal | проверяет, является ли аргумент нормальным | |
signbit | проверяет, является ли знак аргумента отрицательным |
Среда с плавающей запятой
[ редактировать ]В C99 добавлено несколько функций и типов для детального управления средой с плавающей запятой. [3] Эти функции можно использовать для управления различными настройками, которые влияют на вычисления с плавающей запятой, например, режим округления, условия возникновения исключений, когда числа сбрасываются до нуля и т. д. Определены функции и типы среды с плавающей запятой. в <fenv.h>
заголовок ( <cfenv>
на С++ ).
Функция | Описание |
---|---|
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.h>
заголовок включен), который обеспечивает поддержку комплексных чисел. Любой тип с плавающей запятой можно изменить с помощью 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 | инициализирует генератор псевдослучайных чисел . |
The arc4random
Семейство функций случайных чисел не определено в стандарте POSIX, но встречается в некоторых общих libc
реализации. Раньше оно относилось к генератору потока ключей утекшей версии шифра RC4 (отсюда и « RC4 законный » другие алгоритмы, обычно из других шифров, таких как ChaCha20 ), но с тех пор были реализованы , с использованием того же имени.
Качество случайности от rand
обычно слишком слабы, чтобы их можно было даже считать статистически случайными, и для этого требуется явное начальное значение. Обычно рекомендуется использовать arc4random
вместо rand
когда это возможно. Некоторые библиотеки C реализуют rand
с использованием arc4random_uniform
внутренне.
Реализации
[ редактировать ]В POSIX системах , таких как Linux и BSD , математические функции (как объявлено в <math.h>
) включены отдельно в математическую библиотеку libm
. Следовательно, если используется какая-либо из этих функций, компоновщику должна быть присвоена директива -lm
. Существуют различные libm
реализации, в том числе:
- libc libm GNU
- AMD Библиотека . , github , используется Windows практически в исходном виде
- компилятора Intel C++ Библиотека
- Red Hat Библиотека ( Newlib)
- Sun от FDLIBM , которая использовалась в качестве основы для FreeBSD для msun и OpenBSD для libm , которые, в свою очередь, легли в основу Julia . для OpenLibm
- musl от libm , основанный на BSD
libms
и другие проекты, такие как Arm - libm LLVM , который правильно округлен (т.е. ошибки математически правильного результата меньше 0,5 единицы в последнем месте ) [7]
- (правильно округленная libm) проекта Arénaire CRlibm и ее преемник MetaLibm , который использует алгоритм Remez для автоматического создания формально доказанных приближений.
- RLIBM Рутгера, который обеспечивает правильно округленные функции с одинарной точностью. [8]
Реализации не обязательно под именем libm
включать:
- Arm Оптимизированные математические процедуры
- GCE-Math — это версия математических функций C/C++, написанная для C++.
constexpr
(расчет во время компиляции) - CORE-MATH , правильно округленный для одинарной и двойной точности.
- SIMD (векторизованные) математические библиотеки включают SLEEF , Yeppp! и VCL Agner Fog , а также несколько программ с закрытым исходным кодом, таких как SVML и DirectXMath. [9]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б Спецификация ISO/IEC 9899:1999 (PDF) . п. 212, § 7.12.
- ^ Прата, Стивен (2004). C праймер плюс . Издательство Самс. Приложение B, раздел V: Стандартная библиотека ANSI C с дополнениями C99. ISBN 0-672-32696-5 .
- ^ Jump up to: а б Прата, Стивен (2004). C праймер плюс . Издательство Самс. Приложение 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» . Проверено 18 июля 2018 г.
- ^ «Математические функции — библиотека C LLVM» . libc.llvm.org .
- ^ «RLibm: правильно округленная Libm Лаборатории архитектуры и языков программирования Рутгерса» . люди.cs.rutgers.edu .
- ^ Кордес, Питер. "intel, где находится встроенная функция Clang '_mm256_pow_ps'?" . Переполнение стека .
Внешние ссылки
[ редактировать ]- Единая спецификация UNIX , версия 4 от The Open Group : математические объявления — Справочник по базовым определениям,
- Справочник C по математическим функциям