二进制浮点数规范化

竭诚为您提供优质文档/双击可除

二进制浮点数规范化

篇一:浮点数的二进制表示 浮点数的二进制表示 1.

前几天,我在读一本c语言教材,有一道例题: #include voidmain(void) {

intnum=9;/*num是整型变量,设为9*/

float*pFloat=/*pFloat表示num的内存地址,但是设为浮点数*/printf(\的值为:%d\\n\显示num的整型值*/

printf(\的值为:%f\\n\显示num的浮点值*/

*pFloat=9.0;/*将num的值改为浮点数*/

printf(\的值为:%d\\n\显示num的整型值*/

printf(\的值为:%f\\n\显示num

第 1 页 共 19 页

的浮点值*/ }

运行结果如下: num的值为:9

*pFloat的值为:0.000000 num的值为:1091567616 *pFloat的值为:9.000000

我很惊讶,num和*pFloat在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?

要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。我读了一些资料,下面就是我的笔记。 2.

在讨论浮点数之前,先看一下整数在计算机内部是怎样表示的。 intnum=9;

上面这条命令,声明了一个整数变量,类型为int,值为9(二进制写法为1001)。普通的32位计算机,用4个字节表示int变量,所以9就被保存为

00000000000000000000000000001001,写成16进制就是0x00000009。

那么,我们的问题就简化成:为什么0x00000009还原成浮点数,就成了0.000000?3.

第 2 页 共 19 页

根据国际标准ieee754,任意一个二进制浮点数V可以表示成下面的形式: V=(-1)^s×m×2^e

(1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。

(2)m表示有效数字,大于等于1,小于2。 (3)2^e表示指数位。

举例来说,十进制的5.0,写成二进制是101.0,相当于1.01×2^2。那么,按照上面V的格式,可以得出s=0,m=1.01,e=2。

十进制的-5.0,写成二进制是-101.0,相当于-1.01×2^2。那么,s=1,m=1.01,e=2。

ieee754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数e,剩下的23位为有效数字m。 对于64位的浮点数,最高的1位是符号位s,接着的11位是指数e,剩下的52位为有效数字m。5.

ieee754对有效数字m和指数e,还有一些特别规定。 前面说过,1≤m 至于指数e,情况就比较复杂。 首先,e为一个无符号整数(unsignedint)。这意味着,如果e为8位,它的取值范围为0~255;如果e为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的e是可以出现负数的,所以ieee754规定,e的真实值必须再

第 3 页 共 19 页

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4