Подтвердить что ты не робот

Где найти алгоритмы для стандартных математических функций?

Я хочу отправить патч в стандартную библиотеку языка программирования D, которая позволит оценить большую часть std.math во время компиляции, используя средства оценки функции времени компиляции языка. Оценка функции времени компиляции имеет несколько ограничений, наиболее важными из которых являются:

  • Вы не можете использовать язык ассемблера.
  • Вы не можете вызвать код или код C, для которых источник в противном случае недоступен.

Некоторые функции std.math нарушают эти и компиляционные версии должны быть записаны. Где я могу получить информацию о хороших алгоритмах для вычисления таких вещей, как логарифмы, экспоненты, полномочия и функции триггера? Я предпочитаю просто описания алгоритмов высокого уровня для реального кода по двум причинам:

  • Чтобы избежать юридической двусмысленности и необходимости заставить мой код выглядеть "достаточно разным" из источника, чтобы убедиться, что у меня есть авторское право.

  • Я хочу простые, портативные алгоритмы. Я не забочусь о микро-оптимизации, если они хотя бы асимптотически эффективны.

Edit: D модель оценки функции компиляции позволяет вычислять результаты с плавающей запятой, вычисляемые во время компиляции, в любом случае, чтобы они отличались от вычисляемых во время выполнения, поэтому мне все равно, если мои алгоритмы компиляции не дают точно тот же результат, что и версия исполнения, если они не менее точны практически в значительной степени.

4b9b3361

Ответ 1

Джон Харт Компьютерные аппроксимации 1968 года Джоном Вили и сыновьями.

Расчеты в идеале должны точно соответствовать тем, что они сделали бы, если бы они выполнялись во время выполнения. Это может быть сложно. Для многих функций ни один ряд не сходится быстро по всему домену, поэтому алгоритмы объединяют различные методы.

Кроме того, существуют различные форматы с плавающей запятой. Большинство платформ (я думаю) теперь используют IEEE 754. Когда я написал компилятор ca. В 1985 году мне приходилось иметь дело с кроссплатформенными форматами с плавающей запятой. Было очень утомительно, чтобы все было правильно, потому что вам приходилось объединять номера пополам, будучи уверенным, что вы точно получите значение, которое будет рассчитано на целевой машине. Я не знаю, нужно ли вам с этим справляться.

Ответ 2

Жан-Мишель Мюллер - отличная рекомендация, как и Харт.

Действительно ли вам необходимо владеть авторским правом? Как правило, это плохая идея заняться написанием функций математической библиотеки, если вы можете ее избежать (и я говорю это как кто-то, кто делает это профессионально). Я не знаю, может ли D взять BSD-лицензированный код, но есть несколько хороших реализаций с открытым исходным кодом, которые могут оказаться полезными. Например, вы можете посмотреть на Sun FDLIBM. Стивен Мошир Cephes также будет возможностью, хотя его лицензионная ситуация немного странная, но я считаю, что он был готов позволить людям перераспределять его код под другими лицензиями в прошлом.

На стороне примечания, если вы не поддерживаете произвольную точность с плавающей запятой (я не думаю, что это делает D), обычно нет понятия "асимптотическая эффективность" для функций libm.

Ответ 3

Источником, который я рекомендую, являются численные методы для ученых и инженеров Р. У. Хэмминга.

Эта книга опубликована Dover Press и является недорогой в мягкой обложке.

Ответ 4

Как и следовало ожидать, подобные проблемы возникают и на других языках:

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StrictMath.html

Чтобы обеспечить переносимость Java программ, определения некоторых из числовые функции в этом пакете требуют, чтобы они производили одинаковые результаты как определенные опубликованные алгоритмы. Эти алгоритмы доступный из известной сети библиотека netlib как пакет "Свободно Распределяемая математическая библиотека," fdlibm. Эти алгоритмы, которые написаны в языка программирования C, тогда пониматься как выполненный со всеми операции с плавающей запятой, следующие правила Java с плавающей запятой арифметика.

Я не знаю, какие правила D предназначены для вычисления математических вычислений во время выполнения, но вы можете использовать подобный трюк - переосмыслить источник C fdlibm как D. Если D вызывает библиотеки C-библиотеки, специфичные для платформы, то у вас есть проблема, что во время компиляции во время компиляции невозможно предсказать значение времени выполнения.

Я думаю, что лицензия fdlibm очень разрешительна, вам нужно будет убедиться в том, подходит ли она для перераспределения в D. Одна из версий, которую я видел, требует сохранения авторского права и что это.

Ответ 7

несколько источников, в том числе:

Абрамовиц и Стегун, "Справочник по математическим функциям" (доступно онлайн!)

Харт, "Компьютерные аппроксимации" (из печати, но хорошо)

также см. несколько других вопросов о тригонометрии, включая "Как работают тригонометрические функции? и Тригонометрические функции по встроенным системам.

Ответ 8

Смотрите автономный код для численных вычислений для ссылок на код для нескольких специальных функций и для генерации случайных чисел. Весь код является общедоступным. Код реализован в С++ и Python, но его легко перевести на любой другой язык.