Математическая библиотека
В информатике математическая библиотека (или математическая библиотека) — это компонент программирования языка стандартной библиотеки , содержащий функции (или подпрограммы ) для наиболее распространенных математических функций , таких как тригонометрия и возведение в степень . Также могут быть включены функции обработки битов и управления, связанные с числами с плавающей запятой (например, в C).
Примеры включают в себя:
- C математические функции стандартной библиотеки , [1]
- математическая библиотека Java [2]
- «Прелюдия.Математика» в Haskell. [3]
В некоторых языках (например, Haskell) части стандартной библиотеки (включая математические вычисления) импортируются по умолчанию. [4]
Более расширенные функции, такие как линейная алгебра, обычно предоставляются в сторонних библиотеках, таких как библиотека линейной алгебры или библиотека векторной математики .
Схема реализации
[ редактировать ]Основные операции
[ редактировать ]В математической библиотеке часто бывает полезно использовать каламбур типов , чтобы интерпретировать число с плавающей запятой как целое число без знака того же размера. Это позволяет быстрее проверять определенные числовые свойства (положительные или нет) и сравнивать числа. В более сложных случаях перестановка битов может использоваться для изменения числа определенным образом.
Для более точной работы дабл-дабл или даже тройной дабл можно использовать формат . В этом случае число высокой точности выражается как сумма двух или трех чисел с плавающей запятой. [5]
Трансцендентные функции
[ редактировать ]Трансцендентные функции, такие как логарифмические, экспоненциальные и триггерные функции, составляют основу любой математической библиотеки. Эти функции обычно реализуются с помощью полиномиальной аппроксимации , обычно полинома Тейлора или полинома Чебышева, полученных с помощью алгоритма Ремеза (имеющего преимущество улучшенной оценки ошибки), но этапы предварительной обработки не менее важны. [5]
Тригнометрия
[ редактировать ]Сокращение диапазона (также сокращение аргументов , разделение домена ) — это первый шаг для любой функции после проверок на необычные значения (бесконечность и NaN выполнения ). Целью здесь является уменьшение области определения аргумента для обработки полинома, используя симметрию и периодичность функции (если таковые имеются), устанавливая флаги, указывающие, например, следует ли в конце инвертировать результат (если необходимо). Стоит отметить, что периодические функции при сокращении требуют более высокой точности, чем входные, причем прототипным методом является алгоритм Пейна – Ханека – Корбетта. [6] После уменьшения диапазона значения, близкие к нулю, могут подвергаться «быстрому пути»: например, крошечный входной сигнал x может быть возвращен непосредственно в sin , а 1 − | х | может использоваться для cos .
Следующим шагом является оценка полинома с использованием традиционного метода Горнера . После этого перед возвратом знак результата может быть изменен в соответствии с информацией из процедуры уменьшения диапазона.
Логарифм и экспонента
[ редактировать ]Логарифмирование по основанию 2 относительно просто, поскольку целая часть k уже находится в показателе с плавающей запятой; соответственно выполняется предварительное уменьшение дальности, что дает k . Мантисса x (где log2( x ) находится между -1/2 и 1/2) затем сравнивается с таблицей и интервалами для дальнейшего уменьшения до z в диапазоне с известным log2 и x/z , а также с полиномиальными коэффициентами. используется для интервала x/z . Тогда результатом будет log( z ) + log( x/z ) + k . [7] Логарифмирование в других системах счисления использует аналогичный подход, с той разницей, что (а) используется другая таблица; (б) k необходимо умножить на log2( new-base ). [7]
Экспонента в базе 2 аналогично «базовому случаю» из-за структуры с плавающей запятой. Процедура представляет собой просто комбинацию уменьшения диапазона (обычно путем поиска) и полинома по оставшейся мантиссе. [7] Натуральный показатель степени может быть реализован с помощью отдельной таблицы для обеспечения точности, тогда как exp10 может быть просто exp( x × log2(10)) когда он находится в диапазоне. [7] Наконец, в общем случае функция экспоненты с произвольной базой pow() построена на основе exp() и log(). [7]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Математическая библиотека C» .
- ^ «Математическая библиотека Java» .
- ^ «Математическая прелюдия Haskell» .
- ^ «Прелюдия Хаскелла» .
- ^ Перейти обратно: а б Дарами-Луара, Катрин; Дефур, Дэвид; Динешен, Флоран де; Галле, Матье; Гаст, Николас; Лаутер, Кристоф; Мюллер, Жан-Мишель (декабрь 2006 г.). CR-LIBM Библиотека правильно округленных элементарных функций двойной точности (Отчет).
- ^ Бризбарр, Н.; Дефур, Д.; Корнеруп, П.; Мюллер, Ж.-М.; Револ, Н. (март 2005 г.). «Новый алгоритм уменьшения дальности» . Транзакции IEEE на компьютерах . 54 (3): 331–339. дои : 10.1109/TC.2005.36 .
- ^ Перейти обратно: а б с д и математический каталог musl v1.2.2 , log1p.c , log2.c , log10.c , exp2.c