Jump to content

Математические функции C

(Перенаправлено с Tgmath.h )

Математические операции 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 )
conjвычисляет комплексно-сопряженное число ( 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]

См. также

[ редактировать ]
  1. ^ Перейти обратно: а б Спецификация ISO/IEC 9899:1999 (PDF) . п. 212, § 7.12.
  2. ^ Прата, Стивен (2004). C праймер плюс . Издательство Самс. Приложение B, раздел V: Стандартная библиотека ANSI C с дополнениями C99. ISBN  0-672-32696-5 .
  3. ^ Перейти обратно: а б Прата, Стивен (2004). C праймер плюс . Издательство Самс. Приложение B, раздел VIII: Улучшения численных вычислений C99. ISBN  0-672-32696-5 .
  4. ^ В условном смысле может показаться удобным использовать pow( x ,2) или pow( x ,3) для вычисления квадратов или кубов. Однако это не рекомендуется в коде, критичном ко времени. Если реализация не уделяет особого внимания этим случаям во время компиляции, x * x или x * x * x будут выполняться намного быстрее. Кроме того, sqrt( x ) и cbrt( x ) должны быть предпочтительнее pow( x ,.5) или pow( x ,1./3).
  5. ^ man cerf(3), man cerfc(3), см., например, https://linux.die.net/man/3/cerf .
  6. ^ «Библиотека GNU C — случайный ISO» . Проверено 18 июля 2018 г.
  7. ^ «Математические функции — библиотека C LLVM» . libc.llvm.org .
  8. ^ «RLibm: правильно округленная Libm Лаборатории архитектуры и языков программирования Рутгерса» . люди.cs.rutgers.edu .
  9. ^ Кордес, Питер. "intel, где находится встроенная функция Clang '_mm256_pow_ps'?" . Переполнение стека .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d775af4483148efda4161685fca3c284__1719594780
URL1:https://arc.ask3.ru/arc/aa/d7/84/d775af4483148efda4161685fca3c284.html
Заголовок, (Title) документа по адресу, URL1:
C mathematical functions - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)