libfixmath的atan2似乎产生了无效的结果 - 任何想法,建议或替代方案?

时间:2014-02-04 12:38:43

标签: c++ trigonometry fixed-point

我想在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;
}

以下是绘制结果: enter image description here

使用<{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倍。我想在这个速度上添加更多或更少的正确结果。

0 个答案:

没有答案