欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

定点数与浮点数

程序员文章站 2024-03-25 23:46:40
...

32位系统中,浮点数包括单精度浮点数float(一般情况下双字节,64位系统中4字节)和双精度浮点数double(一般情况下四个字节,64位系统中8字节);

浮点数的最高位是s位(符号位),1表示负号,0表示正号;

符号位后面紧跟着一定长度的(单精度情况下半个字节或一个字节)指数位,指数位的大小指定了小数点的位置;

剩余的位置是尾数位,尾数位中存放小数点移动后的结果。

如浮点数:-11.0 写成二进制之后是1(符号)1011,这样为了将这个结果11011存放到float中,需要先对11011进行预处理:

1】提取最高位中的1,存放进float的符号位;

2】计算规格化1011所需要左移的位数 = 3,然后将计算结果3转成2进制(0011)放进float的指数位中

3】将1011规格化后剩余的011放入尾数位

因此,-11.0存入四节的float中,实际上就是 1 ,0000 0011, 0110 0000 0000 0000 0000 000,取出时候对以上步骤进行逆向操作得到 -11.0。

 

 

定点数的来源有两种,一种来源于整形int的的转换;一种来源于浮点(float & double)的转换。

int型数据转成定点数的时候,可以通过数据左移实现:

例子:int 8,转成Q5定点数

1】8的二进制表示111

2】转成Q5定点数,只需要让111左移5位,111<<5,即0000 0000 0000 0000 0000 0000 1110 0000;

浮点数转成定点数时候不能直接左移,因为浮点数的存储结构不想整形的存储结构那样单一,浮点数的每一部分都有着不同的涵义,移动就打乱了数据原有的存储结构,产生乱码,因此浮点转定点还是需要进行乘法计算:

例子:浮点数0.5表示成Q5定点数

 1】计算 floor(0.5*2^5) = 16

2】转成2进制 0000 0000 0000 0000 0000 0001 0000 

例子:定点数16转浮点数

1】读取二进制数 16

2】逆向计算 16*2^-5 = 0.5

 

 

定点数定标以及表示范围

Q表示      S表示         十进制数表示范围

Q15    S0.15    -1≤x≤0.9999695
Q14    S1.14    -2≤x≤1.9999390
Q13    S2.13    -4≤x≤3.9998779
Q12    S3.12    -8≤x≤7.9997559
Q11    S4.11    -16≤x≤15.9995117
Q10    S5.10    -32≤x≤31.9990234
Q9     S6.9     -64≤x≤63.9980469
Q8     S7.8     -128≤x≤127.9960938
Q7     S8.7     -256≤x≤255.9921875
Q6     S9.6     -512≤x≤511.9804375
Q5     S10.5    -1024≤x≤1023.96875
Q4     S11.4    -2048≤x≤2047.9375
Q3     S12.3    -4096≤x≤4095.875
Q2     S13.2    -8192≤x≤8191.75
Q1     S14.1    -16384≤x≤16383.5
Q0     S15.0    -32768≤x≤32767

 

 

相关标签: C++ DSP