《十进制与32位iee754浮点格式相互转化函数》由会员分享,可在线阅读,更多相关《十进制与32位iee754浮点格式相互转化函数(4页珍藏版)》请在金锄头文库上搜索。
1、1 32 位 IEE754 浮点格式对于大小为 32-bit 的浮点数(32-bit 为单精度,64-bit 浮点数为双精度,80-bit 为扩展精度浮点数) ,1、其第 31 bit 为符号位,为 0 则表示正数,反之为复数,其读数值用 s 表示;2、第 3023 bit 为幂数,其读数值用 e 表示;3、第 220 bit 共 23 bit 作为系数,视为二进制纯小数,假定该小数的十进制值为 x;十进制转浮点数的计算方法:则按照规定,十进制的值用浮点数表示为:如果十进制为正,则 s = 0,否则 s = 1;将十进制数表示成二进制,然后将小数点向左移动,直到这个数变为 1.x 的形式即尾数
2、,移动的个数即为指数。为了保证指数为正,将移动的个数都加上 127,由于尾数的整数位始终为 1,故舍去不做记忆。对 3.141592654 来说,1、正数,s = 0;2、 3.141592654 的二进制形式为正数部分计算方法是除以二取整,即得 11,小数部分的计算方法是乘以二取其整数,得 0.0010 0100 0011 1111 0110 1010 1000,那么它的二进制数表示为 11.0010 0100 0011 1111 0110 1010 1;3、将小数点向左移一位,那么它就变为 1.1001 0010 0001 1111 1011 0101 01,所以指数为1+127=128,
3、e = 128 = 1000 0000;4、舍掉尾数的整数部分 1,尾数写成 0.1001 0010 0001 1111 1011 0101 01,x = 921FB65、最后它的浮点是表示为 0 1000 0000 1001 0010 0001 1111 1011 0101 = 40490FDA/-/ 十进制转换为 32 位 IEE754 浮点格式/-void ConvertDexToIEE754(float fpointer,ModRegisterTpyedef *SpModRegister)double integer,decimal;unsigned long bininteger,b
4、indecimal;Uint8 _power,i;decimal = modf(fpointer,if(decimal | integer)bindecimal = decimal * 0x800000; /223while(bindecimal & 0xff800000) 0)bindecimal = 1;if(integer 0)bininteger = integer;for(i=0;i= 0x1;bininteger = integer;bininteger /去掉最高位的 1if(_power = 23) /如果幂指数23 则舍弃小数位部分bininteger = (_power-2
5、3);bindecimal = 127+_power;bininteger |= bindecimal = _power;bininteger |= bindecimal;bindecimal = 127+_power;bininteger |= bindecimal 1)_power+;bindecimal = 9;bininteger = bindecimal;bindecimal = 127-_power;bininteger |= bindecimal RegBytei+ = (bininteger 24) SpModRegister-RegBytei+ = (bininteger 1
6、6) SpModRegister-RegBytei+ = (bininteger 8 ) 浮点数转十进制的计算方法:则按照规定,浮点数的值用十进制表示为: (-1)s * (1 + x) * 2(e 127)对于 49E48E68 来说,1、其第 31 bit 为 0,即 s = 02、第 3023 bit 依次为 100 1001 1,读成十进制就是 147,即 e = 147。3、第 220 bit 依次为 110 0100 1000 1110 0110 1000,也就是二进制的纯小数 0.110 0100 1000 1110 0110 1000,其十进制形式为(0.110 0100 10
7、00 1110 0110 1000 * 223) / (223) = (0x49E48E68 & 0x007FFFFF) / (223) = (0x648E68) / (223) = 0.78559589385986328125,即 x = 0.78559589385986328125。这样,该浮点数的十进制表示=(-1)s * (1 + x) * 2(e 127)=(-1)0 * (1+ 0.78559589385986328125) * 2(147-127)= 1872333*/-/ 32 位 IEE754 浮点格式转换为十进制/-float ConvertIEE754ToDex(ModR
8、egisterTpyedef *SpModRegister)double x,fpointer;unsigned long bininteger,bintmp;Uint8 _power,i=0,s;/*该浮点数的十进制表示=(-1)s * (1 + x) * 2(e 127)=(-1)0 * (1+ 0.78559589385986328125) * 2(147-127)= 1872333*/bintmp = SpModRegister-RegBytei+ RegBytei+;bininteger = SpModRegister-RegBytei+ RegBytei+;bininteger |= bintmp 23;_power = bintmp bintmp = bininteger s = (bintmp) ? 1 : 0 ;bintmp = pow(2, abs(_power-127) ;if(_power = 127)fpointer = (1+x) * bintmp ; elsefpointer = (1+x) / bintmp ; bintmp = (fpointer * 10000 + 5)/10;fpointer = (double)bintmp / 1000;if(s) fpointer *= -1;return (fpointer);