Косинус в плавающей точке - PullRequest
6 голосов
/ 13 февраля 2012

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 13 февраля 2012

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

Теперь, когда вас предупредили: вы сначала захотите уменьшить аргумент по модулю pi / 2 (или 2pi, или pi, или pi / 4), чтобы получить ввод в управляемом диапазоне.Это тонкая часть.Чтобы приятно обсудить возникающие проблемы, загрузите копию СНИЖЕНИЯ АРГУМЕНТА ДЛЯ ОГРОМНЫХ АРГУМЕНТОВ KC Ng: «Хорошо до последней биты» .(простой поиск Google по названию даст вам PDF).Он очень удобен для чтения и прекрасно объясняет, почему это сложно.

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

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

1 голос
/ 14 февраля 2012

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

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

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

0 голосов
/ 13 февраля 2012

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

...