TI 中 acos()函数 存在 bug

来源:互联网 发布:沈颢事件知乎 编辑:程序博客网 时间:2024/04/28 10:29

编写 DSP 程序时(TMS320F28335),如果直接调用系统自带的 acos 函数,有时会出现莫名其妙的错误 (如同步坐标系中的电流在稳态情况下本来是直流,但可能出现尖峰)。这是因为 acos() 函数存在 Bug 。理论上 acos(1)=π ,但 DSP 的计算结果可能是 0.

由于只有这一个点有错误,所以可以很容易将该 Bug 排除。

示意图
图 1:不同角度下的正弦和余弦值

图 1 给出了不同角度下的正弦和余弦值。显然,发生 Bug 的区域位于图中蓝色区域内。如果计算正确的话,下列几个式子无法同时成立。

ar<0.95

br<0.05

|θ|<0.3or|θ2π|<0.3

其中, a, b 分别为横坐标和纵坐标,他们均可正可负; θ 是对应的角度值。

上述三个式子中的前两个条件将角度限制在了图 1 中的蓝色区域内,而第三个条件又表示角度在 0 附近。因此,如果这几个条件同时满足,说明进入到了 Bug 中,这时候只需要将得到的数值强制变为 π 就好了。

因此,如果横坐标为 a 及纵坐标 b 已知,计算对应的角度值的程序如下:

r = sqrt(a*a + b*b);theta = acos(a/r);// acos:0-PIif (b < 0) //PI-2*PI{    theta = 2*PI - theta;}if (  (a/r<0.95) &&     (  (b/r<0.05) && (b/r>-0.05)  ) &&    (  (theta<0.3) || ((2*PI - theta)<0.3)  )    )//由于 theta 已限制在0-2pi,所以第三个表达式可简化{    theta = PI;}

经过排除 Bug 后的运行结果正常。

实际上,已经有人在 TI 的论坛上反馈过这个错误了,详情请点击链接。

博客地址

0 0