2013-07-27
这个不应该在这问那,应该直接在网上搜浮点数的说明文档。
计算机里,浮点数有4种,我们常用的是单精度浮点数:32位,与多精度浮点数64位2种。
浮点数的标准:IEEE754。
以32位的单精度浮点数来说明:我们知道,不管是整数,还是小数,计算机只能以2进制来表达。由此,整数部分,我们从右向左数,第n位1个bit位代表该位上2的n次方(从0数),加起来就是10进制的该数。小数部分也相同,从小数点后面第1位开始,第n位代表的值是1/(2的n次方),所有位加起来就是小数部分的值。但这样表示的结果就是有一些小数,用2进制表达是无限多个2进制位,而计算机的位数是有限制的,所以这类数,就只能是近似值。
举例:0.6
n 1/2^n 减去该位值后结果 该位2进制值
1 0.5 < 0.6 0.6-0.5=0.1 1
2 0.25 > 0.1 无操作 0.1 0
3 0.125 > 0.1 无操作 0.1 0
4 0.0625 < 0.1 0.1-0.0625=0.0375 1
5. 0.03125 < 0.0375 ............ 0.006 1
6. 0.015625 > 0.006 0.006 0
7. 0.0078125 >0.006 0.006 0
.... 1 (第8位应该是1)
这样,一直算下去,不知道多少位之后,才能除尽,也可能永远也除不尽,比如1/3这样的数。
0.6 的2进制,我们取到8位的话,就是0.10011001
-------------------------------------------------------------------------
以上部分是解说2进制表达小数(整数部分就不说了,我认为你既然已经研究到浮点数,整数部分的换算应该很清楚了)
IEEE754中,定义了32位的浮点数的表达方式:
(1) 最高位是符号位 0 正,1负
(2) 最高位之后的8位(23-31位),代表指数,规则是:以127为基准即(0111111),加上(指数为正)或减去(指数为负)指数的数值,这个稍后详细说。
(3)剩余的23位(0-22位)表示浮点数的小数部分(特别说明:2进制的小数部分),小数点左侧的1,默认存在,不保存。
重要的部分就是以上3点,然后,我着重讲第2点。
举个例子:10进制的 52.75,化为2进制数就是110100.11(正好除尽,好理解。)
然后,我们把小数点左移5位,变成1.1010011,那么指数的数值,就是+5
先说第(3)条里的最后一句话:小数点的左侧的1,是肯定存在的,因为浮点数的定义规则就是,1.xxxx,(之所以是1.xxx,因为这是2进制,我刚开始看书的时候,就对这个不理解,总是用10进制的数去想这句话,后来才发现,作者忘了加个注释:2进制),另外,还有一个特殊的数: 0,左侧为1这个规则对0这个数无效,
比如:前面的例子0.6=0.10011001 = 1.0011001 x (2的-1次方),指数就是-1。所以总能把小数点左侧变成1,肯只保留1位。IEEE为了节省保存这个1的空间,就故意约定,不保存它了。
理解这个之后,明白几点:
数据要转换为2进制数
数据要转换为1.xxxx 乘以(2的n次方)的形式。
只使用小数点右侧的2进制数
然后,再看第(2)条:
最高位,由于是正数,所以是0
指数部分,127 + 5 = 132,化为2进制数:10000100
小数部分,10100110 00000000 0000000
把1,2,3合起来,就是0 10000100 10100110 00000000 0000000
这就是浮点数表示的52.75
篇幅关系,就不解释其它几种类型,原则都是一样的,按照IEEE标准就看就可以了。