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

Библиотека С++ для целочисленной тригонометрии, оптимизированная по скорости с дополнительными приближениями?

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

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

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);
}

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

4b9b3361

Ответ 1

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

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

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

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

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