atan2 libfixmath, похоже, дает неверные результаты — есть идеи, предложения или альтернативы?

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

#include <cmath>
#include <fstream>
#include <iostream>

#include <fix16.h>
#include <fix16.hpp>

int main()
{
unsigned int n = 1000;
std::ofstream atan2File("atan2.dat");
for(unsigned int i = 0; i <= n; i++)
{
double d = M_PI/2.*i/n;
double s = sin(d);
double c = cos(d);
double a = atan2(s,c);
Fix16 df(d);
Fix16 sf(df.sin());
Fix16 cf(df.cos());
Fix16 af(sf.atan2(cf));
atan2File << d
<< " " << a
<< " " << (double)af
<< std::endl;
}
return 0;
}

Вот результат на графике:
введите описание изображения здесь

Было сгенерировано с gnuplot с помощью

plot "atan2.dat" u 1:2 w l title 'double', "atan2.dat" u 1:3 w l title 'Fix16'

Некоторые значения, близкие к нулю и пи / 2, являются разумными, но многие — нет. Код, похоже, использует этот алгоритм для расчета atan2, но я не мог определить, где он может потерпеть неудачу, как показано выше.

  • Кто-нибудь знает о возможной ошибке в libfixmath код?
  • Есть ли альтернативная библиотека, которая предоставляет тригонометрические функции для значений с фиксированной точкой? Мне нужны синус, косинус, тангенс и их обратное.

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

gcc -v: gcc version 4.7.2 20130108 [gcc-4_7-branch revision 195012] (SUSE Linux)

Мне нужна фиксированная точка, потому что я хочу сделать эти вычисления на Cortex-M4 (без FPU). На самом деле я уже имел libfixmath в моем коде Cortex-M4, но он показал ошибки, подобные описанным выше. ОТО, это было примерно в 10 раз быстрее, чем float версия. Я хотел бы добавить более-менее правильные результаты к этой скорости.

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]