Математические операции C — это группа функций в стандартной библиотеке языка программирования C, реализующая основные математические функции. [1] [2] Все функции используют числа с плавающей точкой тем или иным образом. Различные стандарты C предоставляют различные, хотя и обратно совместимые, наборы функций. Большинство этих функций также доступны в стандартной библиотеке C++ , хотя и в других заголовках (заголовки C также включены, но только как устаревшая функция совместимости).
Большинство математических функций определены в <math.h>
( <cmath>
заголовке в C++). Функции, которые работают с целыми числами, такими как abs
, labs
, div
, и ldiv
, вместо этого определены в <stdlib.h>
заголовке ( <cstdlib>
заголовке в C++).
Любые функции, работающие с углами, используют радианы в качестве единицы измерения угла. [1]
Не все эти функции доступны в версии стандарта C89double
. Для тех, которые доступны, функции принимают только тип для аргументов с плавающей точкой, что приводит к дорогостоящим преобразованиям типов в коде, который в противном случае использовал бы float
значения одинарной точности. В C99 этот недостаток был исправлен путем введения новых наборов функций, которые работают с аргументами float
и long double
. Эти функции идентифицируются суффиксами f
и l
соответственно. [3]
C99 добавляет несколько функций и типов для точного управления средой с плавающей точкой. [3] Эти функции могут использоваться для управления различными настройками, которые влияют на вычисления с плавающей точкой, например, режим округления, при каких условиях возникают исключения, когда числа сбрасываются до нуля и т. д. Функции и типы среды с плавающей точкой определены в <fenv.h>
заголовке ( <cfenv>
в C++ ).
C99 добавляет новое _Complex
ключевое слово (и complex
макрос удобства; доступен только при <complex.h>
включенном заголовке), которое обеспечивает поддержку комплексных чисел. Любой тип с плавающей точкой может быть изменен с помощью complex
, а затем определяется как пара чисел с плавающей точкой. Обратите внимание, что C99 и C++ не реализуют комплексные числа совместимым с кодом способом — последний вместо этого предоставляет класс .std::complex
Все операции над комплексными числами определены в <complex.h>
заголовке. Как и в случае с функциями с действительными значениями, суффикс f
or l
обозначает вариант float complex
or long double complex
функции.
Несколько более сложных функций «зарезервированы для будущего использования в C99». [5] Реализации предоставляются проектами с открытым исходным кодом, которые не являются частью стандартной библиотеки.
Заголовок <tgmath.h>
определяет макрос type-generic для каждой математической функции, определенной в <math.h>
и <complex.h>
. Это добавляет ограниченную поддержку перегрузки функций математических функций: одно и то же имя функции может использоваться с различными типами параметров; фактическая функция будет выбрана во время компиляции в соответствии с типами параметров.
Каждый макрос type-generic, который соответствует функции, определенной как для действительных, так и для комплексных чисел, инкапсулирует в общей сложности 6 различных функций: float
, double
и long double
, и их complex
варианты. Макросы type-generic, которые соответствуют функции, определенной только для действительных чисел, инкапсулируют в общей сложности 3 различных функции: float
, double
и long double
варианты функции.
Язык C++ включает встроенную поддержку перегрузки функций и, таким образом, не предоставляет <tgmath.h>
заголовок даже в качестве функции совместимости.
Заголовок <stdlib.h>
( <cstdlib>
в C++) определяет несколько функций, которые можно использовать для статистически случайной генерации чисел. [6]
Семейство arc4random
функций случайных чисел не определено в стандарте POSIX, но встречается в некоторых распространенных libc
реализациях. Оно использовалось для обозначения генератора потока ключей утекшей версии шифра RC4 (отсюда « поддельный RC4 »), но с тех пор были реализованы другие алгоритмы, обычно из других шифров, таких как ChaCha20 , с использованием того же имени .
Качество случайности от rand
обычно слишком слабое, чтобы его можно было даже считать статистически случайным, и оно требует явного затравки. Обычно рекомендуется использовать arc4random
вместо , rand
когда это возможно. Некоторые библиотеки C реализуют rand
использование arc4random_uniform
внутренне.
В системах POSIX , таких как Linux и BSD , математические функции (как объявлено в <math.h>
) объединены отдельно в математической библиотеке . Поэтому, если какая-либо из этих функций используется, компоновщику должна быть дана директива . Существуют различные реализации, включая:libm
-lm
libm
libms
и других проектах, таких как ArmРеализации не обязательно под названием libm
включают:
constexpr
(вычисления во время компиляции)