我想在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;
}
以下是绘制结果:
使用<{p>生成gnuplot
plot "atan2.dat" u 1:2 w l title 'double', "atan2.dat" u 1:3 w l title 'Fix16'
接近零和pi / 2的某些值是合理的,但很多都不是。代码似乎使用this algorithm来计算atan2
,但我无法以上面显示的方式找出失败的位置。
libfixmath
代码中可能存在的错误吗?当然,我可以尝试将缺少的函数添加到其他建议的定点库中,但我没有为定点类型编写代码的经验。
gcc -v:gcc version 4.7.2 20130108 [gcc-4_7-branch revision 195012] (SUSE Linux)
我需要定点,因为我想在Cortex-M4(无FPU)上进行这些计算。实际上我的Cortex-M4代码中已经有libfixmath
,但它显示的错误与上述错误相同。 OTOH,它的速度是float
版本的10倍。我想在这个速度上添加更多或更少的正确结果。