stringtranslate.com

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

Математические операции 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>заголовке. Как и в случае с функциями с действительными значениями, суффикс for lобозначает вариант float complexor 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-lmlibm

Реализации не обязательно под названием libmвключают:

Смотрите также

Ссылки

  1. ^ ab ISO/IEC 9899:1999 спецификация (PDF) . стр. 212, § 7.12.
  2. ^ Прата, Стивен (2004). C primer plus . Sams Publishing. Приложение B, Раздел V: Стандартная библиотека ANSI C с дополнениями C99. ISBN 0-672-32696-5.
  3. ^ ab Prata, Stephen (2004). C primer plus . Sams Publishing. Приложение 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. ^ «Математические функции — библиотека LLVM C». libc.llvm.org .
  8. ^ "RLibm: Правильно округленная библиотека библиотеки архитектуры и языков программирования Ратгерского университета". people.cs.rutgers.edu .
  9. ^ Кордес, Питер. "intel - Где находится встроенная функция Clang '_mm256_pow_ps'?". Stack Overflow .

Внешние ссылки