您好!
我的目的是测试28335的IQN的存储精度和三角函数精度,因为我们工业控制需要精确到小数点后第8~9位。
测试程序为:C:\ti\controlSUITE\libs\math\IQmath\v160\examples\C\projects 中的28335_IQsampleC。
(3)测试程序位:C:\ti\controlSUITE\libs\math\IQmath\v160\examples\C\projects 中的28335_IQsampleC。
第一步,在28335_IQsampleC中修改精度:
#define GLOBAL_Q 28
long GlobalQ = GLOBAL_Q;
第二步,定义变量和常量:
#define PI 3.14159265358979
_iq tempX, tempY, tempM;
第三步,main函数中设置检测函数:
tempX=_IQ(PI);
tempY=_IQsin(_IQ(PI)/6);
tempM=_IQsin(tempX/4);
第四步,设置断点,用Q-Value(28)格式进行查看。计算结果如下:
tempX=3.141 592 741(理论精确值应该是tempX=PI=3.141 592 653 589 79,所以误差为 0.000 000 887 9);
tempY=0.500 000 011 2(理论精确值应该是tempY=0.5,所以误差为 0.000 000 0112);
tempM=0.707 106 795 2.(理论精确值应该是tempM=0.707 106 781 186 547,所以误差为 0.000 000 014);
第五步,与IQmath手册中的精度进行比较。
手册中指出,IQ28的取值范围为:-8~8,误差为0.000 000 004。 与计算结果相差很大。
第六步,得出结论:手册值和实际测试值之间误差极大。
问题:
(a)这是怎么回事呢?IQN的精度为什么这么低,与普通的float一样的精度呢?
(b)如何解决呢?
谢谢!
