Математические функции 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 по математическим функциям