langqz

IEEE754数据格式介绍和解析方式(超权威)

0
阅读(1211)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/crjmail/article/details/79723051


一、定义:什么是IEEE754


浮点数在C/C++中对应float和double类型,我们有必要知道浮点数在计算机中实际存储的内容。


IEEE754标准中规定float单精度浮点数在机器中表示用 1 位表示数字的符号,用 8 位来表示指数,用23 位来表示尾数,即小数部分。对于double双精度浮点数,用 1 位表示符号,用 11 位表示指数,52 位表示尾数,其中指数域称为阶码。


IEEE754规定:


单精度浮点数字长32位,尾数长度23,指数长度8,指数偏移量127;双精度浮点数字长64位,尾数长度52,指数长度11,指数偏移量1023;

约定小数点左边隐含有一位,通常这位数是1,所以上述单精度尾数长度实际为24(默认省略小数点左边的1则为23),双精度尾数长度实际为53(默认省略小数点左边的1则问53);

下面讲述使用IEEE754标准表示浮点数:

176.0625表示为单精度浮点数:

解:

1).先将176.0625转换为二进制数


小数点前:176 / 2 = 88 余数为 0

88 / 2=44 余数为 0

44 / 2 =22 余数为 0

22 / 2= 11 余数为 0

11 / 2 =5 余数为 1

5 / 2=2 余数为 1

2/ 2 =1 余数为 0

1/ 2=0 余数为 1 商为0,结束。

小数点前整数转换为二进制:10110000


小数点后:小数部分乘以2,取整数部分,直至乘积小数部分为0

0.0625 * 2 = 0.125 整数为0

0.125 * 2 = 0.25 整数为0

0.25* 2 = 0.50 整数为0

0.5* 2 = 1.0 整数为1,小数部分为0,结束


小数点后的小数位转换为二进制:0001


故176.0625转换为二进制为:10110000.0001


2).IEEE754约定小数点左边隐含有一位,通常这位数是1,所以10110000.0001=1.01100000001 * 2^7(小数点向左偏移7位);


IEEE754约定单精度指数偏移量为127,所以176.0625使用IEEE754标准表示时,指数偏移量为 7+127=134 ,即:10000110


IEEE754约定单精度尾数长度为23,所以176.0625使用IEEE754标准表示时,尾数为:01100000001000000000000


176.0625>0,即为整数,所以符号位为0


3)由上得出:176.0625使用IEEE754规格化后的表示为:0 10000110 01100000001000000000000


二、解析


typedef union

{

float a;

char b[4];

}Packet;

Packet packet;


void IEEE2Float(void)

{

u8 i=0;

u32 Temp32;

float f_Temp;


Temp32=0x435C0000;

for(i=0;i<4;i++)

{

packet.b[i] =(u8)(Temp32>>(i*8));

}

f_Temp=packet.a;


}


三、链接


IEEE754解析方法https://wenku.baidu.com/view/92c7808ccf84b9d529ea7aa3.html


————————————————

版权声明:本文为CSDN博主「crjmail」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/crjmail/article/details/79723051


Baidu
map