[转载]浮点数与IEEE-754标准格式互换方法
(2015-06-15 13:31:51)
标签:
转载 |
分类: qt |
浮点数在存储时,是存储连续的字节中的,
只要设法找到存储位置,就可以得到这些数了。
可以定义一个void的指针,将此指针指向需要存储
的浮点数,然后将此指针强制转化为char型,
利用指针就可以得到组成该浮点数的各个字节的值了。
#define uchar unsigned char
#define uint unsigned int
void FtoC(void)
{ float a;
uchar i,*px
uchar x[4]; //定义字符数组,准备存储浮点数的四个字节
void *pf;
px=x; //px指针指向数组x
pf=&a; //void 型指针指向浮点数首地址
a=34.526;
for(i=0;i<4;i++)
{ *(px+i)=*((char *)pf+i); //强制void 型指针转成char型,因为
}
}
如果已将数存入EEPROM,要将其取出合并,方法也是一样,
#define uchar unsigned char
#define uint unsigned int
void CtoF(void)
{ float a;
uchar i,*px
uchar x[4]={56,180,150,73};
void *pf;
px=x;
pf=&a;
for(i=0;i<4;i++)
{
*((char *)pf+i)=*(px+i);
}
}
//34.526存为(160,26,10,66)
附
IEEE-754标准的格式:
一个浮点数用两个部分表示,尾数和2的幂,尾数代表浮点上的实际二进制数,2的幂代表指
数,指数的保存形式是一个0到255的8位值,指数的实际值是保存值(0到255)减去127,一个
范围在-127到+128之间的值,尾数是一个24位值(代表大约7个十进制数),最高位MSB通常
是1,因此省略不保存,一个符号位表示浮点数是正或负。
地址
内容
S (第31位)代表符号(数符)位1是负,0是正;
E 偏移127的幂,二进制阶码=(EEEEEEEE)-127;
. 小数点;
M 24位的尾数保存在23位中,只存储23位,隐含最高位1。此方法用最较少的位数实现了较
高的有效位数,提高了精度。
零是一个特定值,幂是0 尾数也是0。
IEEE754标准的一个规格化 32位浮点数x的真值可表示为
x=(-1)^S*(1.M)*2^(E-127) e=E-127
31
|S
|
[例1]若浮点数x的754标准存储格式为(41360000)16,求其浮点数的十进制数值。
解:将16进制展开后,可得二进制数格式为
0
S
指数e=100,0001,0-01111111=00000011=(3)10
包含隐藏位1的尾数1.M=1.011,0110,0000,0000,0000,0000
于是有 x=(-1)^0*(1.M)*2^(E-127)
[例2]将数(20.59375)10转化为754标准的32位浮点数的二进制存储格式。
解:首先分别将整数部分和小数部分转换成二进制
(20.59375)10=+(10100.10011)2
然后移动小数点使其在1,2位之间
10100.10011=1.010010011*2^4 e=4
于是得到:S=0,E=e+127=131,M=010010011
最后得到32位浮点数的二进制存储格式为
0 100,0001,1 010,0100,1100,0000,0000,0000
=(41A4C000)16