Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Математические операции 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]

Среда с плавающей точкой [ править ]

C99 добавляет несколько функций и типов для детального управления средой с плавающей запятой. [3] Эти функции могут использоваться для управления различными настройками, которые влияют на вычисления с плавающей запятой, например, режимом округления, при каких условиях возникают исключения, когда числа сбрасываются до нуля и т. Д. Функции среды с плавающей запятой и типы определены в <fenv.h>заголовке ( <cfenv>в C ++ ).

Комплексные числа [ править ]

В C99 добавлено новое _Complexключевое слово (и complexудобный макрос), обеспечивающее поддержку комплексных чисел. Любой тип с плавающей запятой может быть изменен с помощью complex, а затем определяется как пара чисел с плавающей запятой. Обратите внимание, что C99 и C ++ не реализуют комплексные числа совместимым с кодом способом - последний вместо этого предоставляет класс .std::complex

Все операции с комплексными числами определены в <complex.h>заголовке. Как и в случае вещественных функций, fили lсуффикс обозначает float complexили long double complexвариант функции.

Еще несколько сложных функций «зарезервированы для будущего использования в C99». [5] Реализации предоставляются проектами с открытым исходным кодом, которые не являются частью стандартной библиотеки.

Типовые функции [ править ]

Заголовок <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]

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 с плавающей запятой

Ссылки [ править ]

  1. ^ a b Спецификация ISO / IEC 9899: 1999 (PDF) . п. 212, § 7.12.
  2. ^ Прата, Стивен (2004). Праймер С плюс . Самс Паблишинг. Приложение B, раздел V: Стандартная библиотека ANSI C с дополнениями C99. ISBN 0-672-32696-5.
  3. ^ a b Прата, Стивен (2004). Праймер С плюс . Самс Паблишинг. Приложение 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 Random» . Проверено 18 июля 2018 .
  7. ^ Кордес, Питер. "Интеллект - Где внутреннее" _mm256_pow_ps "Кланга?" . Переполнение стека .

Внешние ссылки [ править ]

  • math.h: математические объявления - Справочник по базовым определениям, Единая спецификация UNIX , выпуск 7 от The Open Group
  • Справочник C по математическим функциям