32位系统中,浮点数包括单精度浮点数float(通常状况下双字节,64位系统中4字节)和双精度浮点数double(通常状况下四个字节,64位系统中8字节);code
浮点数的最高位是s位(符号位),1表示负号,0表示正号;class
符号位后面紧跟着必定长度的(单精度状况下半个字节或一个字节)指数位,指数位的大小指定了小数点的位置;乱码
剩余的位置是尾数位,尾数位中存放小数点移动后的结果。二进制
如浮点数:-11.0 写成二进制以后是1(符号)1011,这样为了将这个结果11011存放到float中,须要先对11011进行预处理:float
1】提取最高位中的1,存放进float的符号位;数据
2】计算规格化1011所须要左移的位数 = 3,而后将计算结果3转成2进制(0011)放进float的指数位中移动
3】将1011规格化后剩余的011放入尾数位di
所以,-11.0存入四节的float中,实际上就是 1 ,0000 0011, 0110 0000 0000 0000 0000 000,取出时候对以上步骤进行逆向操做获得 -11.0。co
定点数的来源有两种,一种来源于整形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