2012-02-13 3 views
6

Я пытаюсь реализовать функции косинуса и синуса в плавающей запятой (но у меня нет оборудования с плавающей запятой).Косинус в плавающей запятой

Поскольку у моего процессора нет оборудования с плавающей запятой или инструкций, я уже реализовал алгоритмы для умножения с плавающей запятой, деления, сложения, вычитания и квадратного корня. Итак, те инструменты, которые у меня есть для меня, реализуют косинус и синус.

Я рассматривал возможность использования метода CORDIC, at this site Однако я использовал деление и квадратный корень с использованием метода Ньютона, поэтому я надеялся использовать наиболее эффективный метод.

Пожалуйста, не говорите мне, чтобы я просто заглянул в книгу или что «бумага существует», не шутите, что они существуют. Я ищу имена известных алгоритмов, которые, как известно, бывают быстрыми и эффективными.

+1

Не можете ли вы найти и адаптировать существующую математическую библиотеку? Потому что математика ниже их довольно сложная! Написание конкурсной математической библиотеки может стоить вам PhD (и потребуются годы усилий). –

+0

Я на самом деле не наркоман кода, мне бы просто понравился алгоритм, и я могу сделать реализацию сам. Я должен сам переписать код в сборке, а также запланировать его. (Это для пользовательского процессора). – Veridian

+0

Я считаю, что на эту тему есть много книг и документов. Вы заходили в университетскую библиотеку? –

ответ

4

Прежде всего, в зависимости от ваших требований к точности, это может быть значительно более суровым, чем ваши предыдущие вопросы.

Теперь, когда вы были предупреждены: сначала вы хотите уменьшить аргумент modulo pi/2 (или 2pi, или pi или pi/4), чтобы получить ввод в управляемый диапазон. Это тонкая часть. Для приятного обсуждения затронутых вопросов загрузите копию K.C. Ng's УМЕНЬШЕНИЕ АРГУМЕНТОВ ДЛЯ ОГРОМНЫХ АРГУМЕНТОВ: Хорошо для последнего бита. (простой поиск в Google по заголовку даст вам pdf-файл). Это очень читаемо и прекрасно описывает, почему это сложно.

После этого вам нужно всего лишь приблизиться к функциям на небольшом диапазоне вокруг нуля, что легко сделать с помощью полиномиального приближения. Серия Тейлора будет работать, хотя она неэффективна. Усеченную серию чебышева легко вычислить и разумно эффективно; вычисление минимаксного приближения еще лучше. Это легкая часть.

Я реализовал синус и косинус точно так же, как описано, целиком в целочисленном, в прошлом (извините, нет общедоступных источников). Используя сборку вручную, результаты в окрестности 100 циклов вполне разумны для «типичных» процессоров. Я не знаю, с каким оборудованием вы сталкиваетесь (производительность будет в основном зависеть от того, насколько быстро ваше оборудование может произвести большую часть целочисленного умножения).

+0

@starbox: минимаксное приближение - это черное искусство. вы действительно знаете об этом, если вам нужно его использовать. Вы можете начать с поиска «алгоритма обмена Remez», который является стандартным подходом. Усеченную серию Чебышева намного проще вычислять и почти так же хорошо. Ряду Тейлора потребуются еще несколько терминов для обеспечения той же точности, но (очевидно) очень просто. –

+0

@starbox: Я также должен отметить, что вы, вероятно, * не захотите использовать существующие подпрограммы добавления и умножения FP (это слишком дорого). Во всяком случае, сохранение большинства вычислений в целых числах будет проще. Процессор, на котором я написал целочисленную реализацию, фактически имел FPU, но я смог быстрее получить результат, не используя его. –

+1

@starbox: причина избежать использования полных операций FP заключается в том, что вам не нужно округлять каждый шаг вычисления. Вы можете нести небольшую дополнительную точность и задерживать любую логику округления до самого конца. –

-1

Поскольку у вас есть основные арифметические операции, вы можете также реализовать синус и косинус, используя их расширения серии taylor.

+0

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

+0

Что относительно минимаксного приближения? – Veridian

+0

Извините, я не знаком с минимаксными алгоритмами – ardnew

1

Для различных уровней точности, вы можете найти некоторые хорошие приближения здесь:

http://www.ganssle.com/approx.htm

С дополнительным преимуществом, что они являются детерминированными во время выполнения в отличие от различных вариантов «сходящихся рядов», которые могут отличаться друг от друга в зависимости на входном значении. Это важно, если вы делаете что-либо в режиме реального времени (игры, управление движением и т. Д.)

Смежные вопросы