C ++ библиотека для целочисленной тригонометрии, скорость оптимизирована с дополнительными приближениями? - PullRequest
13 голосов
/ 18 ноября 2011

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

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

static inline int32_t sin_approx(int32_t angle)
//Angle is -32768 to 32767: Return -32768 to 32767
{
    return (angle<<1) - ((angle*abs(angle))>>14);
}

Итак, перед тем, как я без необходимости сверну свои собственные, есть ли действительно быстрые библиотеки с фиксированной запятой для c ++ с шаблонными классами, такими как векторы, где я могу указать ширину используемого целого числа и которая имеет быстрые приближения, такие как приведенная выше, стоит посмотреть?

1 Ответ

4 голосов
/ 22 ноября 2011

Я пошел по этому пути несколько лет назад, когда мне пришлось преобразовать некоторый аудио-код снятия отпечатков пальцев с плавающей запятой на фиксированную. Твердыми частями были DCT (который использовал большой косинусный стол) и высокоточный логарифм. Я обнаружил удивительно мало на пути существующих библиотек. С тех пор я слышал, что оригинальный Sony PlayStation (PS1) не имел поддержки с плавающей запятой, поэтому форумы разработчиков (fori?) Для него, если они еще существуют, могут иметь то, что вы ищете.

Некоторым людям, с которыми я работал, повезло с библиотекой NewMat , хотя она ориентирована на линейную алгебру, а не на тригонометрию, и, кажется, фокусируется на числах с плавающей точкой. Тем не менее, его сайт приводит к этому списку , который, похоже, стоит проверить. Я также нашел spuc , библиотеку обработки сигналов, которая может быть полезна для поддержки фиксированной точки. И много лет назад я видел библиотеку шаблонов обработки сигналов (sptl) от Fraunhofer. Я думаю, что это было частным, но может быть доступно как-то.

Несмотря на это, я думаю, вы довольно близки с тем, что у вас уже есть. Поскольку у вас есть функция синуса, у вас также есть функция косинуса, при условии, что вы соответствующим образом преобразуете ввод (cos(x) == sin(x + pi/2)). Поскольку тангенс является частным от синуса и косинуса (tan(x) = sin(x) / cos(x)), вы в основном там для тригонометрии.

Что касается векторов, разве классы STL vector и valarray, объединенные с алгоритмами STL, тоже не приблизят вас? Если нет, то всегда есть математические библиотеки Boost .

Извините, я не могу указать вам на серебряную пулю, которую вы ищете, но то, что вы пытаетесь сделать, довольно необычно в наши дни. Люди, которым нужна точность, обычно переходят прямо к плавающей точке, которая имеет приличную производительность на современных процессорах и поддерживает множество библиотек. Те, кто хочет получить скорость на оборудовании с ограниченными ресурсами, обычно не нуждаются в точности и не выполняют триггер по вектору, и, вероятно, тоже не делают C ++. Я думаю, что ваш лучший вариант - кататься самостоятельно. Попытайтесь думать об этом как о применении шаблона дизайна колеса в новом контексте, а не об изобретении его. :)

...