Я хочу сделать математику с фиксированной точкой в 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
версия. Я хотел бы добавить более-менее правильные результаты к этой скорости.
Задача ещё не решена.
Других решений пока нет …