DM642下浮点转定点操作

来源:互联网 发布:mysql 统计字符串长度 编辑:程序博客网 时间:2024/05/01 22:59

http://blog.csdn.net/henhen2002/article/details/4640542

        float x = 0.23;
        float y = 0.14;
       
        float z;
        int Qx;
        int Qy;
        int Qz;
         //数据转化部分
        Qx = (int)(x*1048576);    //转化成Q20格式,DM642支持Q31
        Qy = (int)(y*1048576);
                      //数据处理部分
        Qz = ((long)Qx*Qy)>>20;
                     //数据转回部分
        z = (float)Qz/1048576;
        printf("%f/n", z);

输出:0.032199                  实际结果:0.0322   精度损失还是比较小的
单独处理一个这样的数,Q格式的优势是没有得到体现的,但往往处理过程复杂很多,有大量的循环等,这样就达到了节省运算量的目的。

 

这里再用加法进行样例说明:

浮点定点Xq=X*2^q
定点浮点X=Xq/2^q

设x=0.5 y=3.1 则浮点运算的结果为z=x+y=0.5+3.1=3.6
Qx=15//为什么x=0.5要定标为Q15呢?因为Q15能表示的范围为-1<=X<=1-1/32768,精度为1/32768,目的是为了提高精度
Qy=13//原因同上
Qz=13//原因同上
x=0.5*2^15=16384//Q15定标
y=3.1*2^13≈25395//Q13定标

temp=25395<<2=101580//为什么要左移两位呢?把y扩大到相同的标尺上进行运行,说白了就是统一单位进行运算。呵呵
temp=x+temp=16384+101580=117964
z=(int)(117964L>>2)=29491//结果用Q13表示

因为z的Q为13,所以定点值z=29491即为z=29491/2^13≈3.59998≈3.6//精度高

同样是上面的运算,我用Q4定标计算
Qx=4 //Q4表示的范围-2048<=X<=2048-1/16,精度为1/16
Qy=4
Qz=4

x=0.5*2^4=8
y=3.1*16≈50
temp=8+50=58
z=58/16=3.625≈3.6//精度度低

0 0
原创粉丝点击