您的位置:首页 > 其它

【每日一发】同样4个字节的浮点数和整数为什么表达的范围有很大差异

2015-04-18 11:52 246 查看
如果突然问这个问题,不知道是不是每个人都能思路清晰的应答。下面简单的说一说这个区别

32位的整数,最大值是21亿左右,占用4个字节的浮点数,最大值大约是3.4×10^38.

虽然两者占用的空间一致,但是其组织数据的方式是完全不同的。

先说说比较属性的整形吧,为了简单,只说正数,符号位1位,值为0,后面的全部是111, 0111 1111 1111 1111 1111 1111,16进制的表示为 7F FF FF FF.

浮点数的表示方法为: 符号位 + 阶码 + 尾数,为了简化,这里也只是考虑正数。4字节的浮点数,符号位1,解码有8位,而尾数就有23位。 其中阶码在实际中用移码表示,尾数就是浮点数内部可以存储表达的真实数据部分。

先看一个简单的例子。

30.5如何表示:

正数:符号位为0

30用二进制表示就是 11110

0.5用二进制表示是: 0.1

小数转换为二进制,就是用二成 5 × 2 = 10,那么这里就是0.1了

那么综合起来就是 11110.1,那么这样看起来,该数亦可以向左移动4次(阶码),即 真实的尾数就是1.11101,众所周知,二进制就0,和1,而从尾数的特点可以看出,最原始的尾数一定是 1.xxxx,即第一位恒为1,这样,这个1就可以省略,那么这里的尾数就是 11101。

阶码4位,用移码表示就是 127 + 4 = 131 ,即 1000 0011,至此数据准备好了:

符号位: 0

阶码(经过移码处理的结果): 1000 00111

尾数(总共23位,未满用0补齐) 1110 1[000] [0000] [0000] [0000] [000]

所以最后的结果就是 0 1000 00111 1110 1[000] [0000] [0000] [0000] [000]

那么反推回去:

1) 第一位是符号位,0,代表正数

2) 再取8位作为阶码信息, 1000 0011,结果为0x83,即131,131比127大4,真实的阶码就是4

3)尾数部分就是后面23位,那么就是 11101,由于前面有一个1,最终的情况就是 1.11101,由于阶码是4,向左移动4位,即11110.1,整数部分就是 ox1E,即30,小数部分这里 1 × 2 ^ -1 ,就0.5.

那么最大的浮点数是什么样的呢:

从最终的二进制表示来看,就是

0 【1111 1111】 【1111 1111 1111 1111 111】,现在反推

真实的尾数是 1.【1111 1111 1111 1111 111】

阶码本身有正有负,而8位的有符号数的范围是-128 - 127.因此最大的单精度浮点数为:

1.11111111111111111111111 正向阶码为127,结果为 340282346638528860000000000000000000000.000000


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐