PS:真是学的不如忘的快,今天用到了,竟然都忘光了,所以就整理了一下
单精度浮点数有32位,双精度浮点数有64位,扩展浮点数有80位。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
在单精度浮点数中,主要有符号位(S)、指数(E)8位、尾数或者小数部分包含后面的23位。
共计32位,折合4字节
由最高到最低位分别是第31、30、29、……、0位
31位是符号位,1表示该数为负,0反之。
30-23位,一共8位是指数位。
22-0位,一共23位是尾数位。
现在让我们按照IEEE浮点数表示法,一步步的将float型浮点数<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />12345.0f转换为二进制代码。在处理这种不带小数的浮点数时,直接将整数部转化为二进制表示:1 11100010 01000000然后将小数点向左移,一直移到离最高位只有1位,就是最高位的1:1.11100010010000000一共移动了16位,在布尔运算中小数点每向左移一位就等于在以2为底的科学计算法表示中指数 1,所以原数就等于这样:1.11100010010000000 * ( 2 ^ 16 )好了,现在我们要的尾数和指数都出来了。最高位的1一般就直接省去了
这样尾数的二进制就变成了:11100010010000000最后在尾数的后面补0,一直到补够23位:11100010010000000000000
再回来看指数,一共8位,可以表示范围是0 - 255的无符号整数,也可以表示-128 - 127的有符号整数。但因为指数是可以为负的,所以为了统一把十进制的整数化为二进制时,都先加上127,在这里,我们的16加上127后就变成了143,二进制表示为:10001111
12345.0f这个数是正的,所以符号位是0,那么我们按照前面讲的格式把它拼起来:
S E F
0 10001111 11100010010000000000000
例子2:把浮点数转化为十进制数
S E F
1 10010001 10001110001000000000000
符号位是1 偏移指数 10010001=145 最后的指数实际为145-127=18
最后的结果就为(-1)(1.10001110001)(2^18)
因为指数在-126和+128之间的任意数,所以极大的和极小的都可以表示出来。
浮点数的这两种格式有两种例外:数0.0由全0来表示,而无穷大数的指数则由全1来表示,尾数用全0来表示。
IEEE754三种浮点数的格式参考
数符(s) 阶码(E) 尾数(M) 总位数 十六进制 十进制
短实数 1 8 23 32 7FH 127 1~254
长实数 1 11 52 64 3FFH 1023 1~2046
临时实数 1 15 64 80 3FFFH 16383 1~32766
参考文献:http://it.icxo.com/htmlnews/2004/09/01/314496.htm
http://www.lwlm.com/show.aspx?id=26385&cid=25
用户36438 2007-10-24 20:03
这样的帖子得 顶