本帖最后由 airwill 于 2014-11-17 18:17 编辑
IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80比特实做)。
IEEE 754将存储浮点数的比特序列分为三个部分:符号位S,指数位E和尾数位M。根据规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M;对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。与浮点数对应数学值计算方法为:v=(-1)^s*M*2^E.
为了便于比较两个浮点数的大小,指数部分采用无符号整数来存储,但是为了解决指数为负数的情况,IEEE 754规定,指数域的存储值为实际值和指数偏移量之和,指数偏移量的计算方法为2^(e-1) - 1,其中的e为存储指数的比特的长度。例如,如果指数域的长度为8,其存储值为129,那么该指数域对应的实际指数为129-(2^7-1)=2,此时,指数域的存储值范围为0~255,实际指数范围为-127~128.
数字是怎样在浮点数中存储的哪?下面我们一步一步来演示一下:
首先,将数字采用二进制格式的科学计数法进行表示,如123.625,转换为二进制科学计数法: 123.625(10进制)==》1111011.101(2进制)==》1.111011101*2^6。然后,将指数6与指数偏移量127相加,并填充指数域 6+127==>10000101。将1.111011101去除首部的1(任何二进制转换为科学计数法后,其整数部分必为1(尾数域范围为【1-2)),因此可以在尾数域中忽略该位,以便存储更多的数据,1.111011101===》111011101===》11101110100000000000000(填充0),将11101110100000000000000赋值到尾数域,那么此时,数值123.625的浮点数表示为: 01000010111101110100000000000000。
按照相反的过程,我们可以推倒出 0 10000101 1110111010000000..===》0 134 1110111010000000... ==> 0 6 1.111011101==>1.111011101*2^6==>123.625
如果浮点数的指数部分的编码值是0,尾数为非零,那么这个浮点数将被称为非规约形式的浮点数。IEEE 754标准规定:非规约形式的浮点数的指数偏移值比规约形式的浮点数的指数偏移值大1. 例如,最小的规约形式的单精度浮点数的指数部分编码值为1,指数的实际值为-126;而非规约的单精度浮点数的指数域编码值为0,对应的指数实际值也是-126而不是-127。非规约浮点数,在将其转换为数字时,是无需在尾数域的首部添加1的,即其尾数域取值范围为0~1,因此所有的非规约浮点数比规约浮点数更接近0。其转换过程如下: 0 00000000 11101110100000..===》0 -126 11101110100000... ==> 0 -126 0.111011101==>0.111011101*2^-126
在将数字转换为浮点数时,往往不能完全匹配,例如,将0.1转换为二进制格式时其对应的比特位数远远超个了23位。有多种方法可以用来运行舍入作业,实际上IEEE标准列出4种不同的方法:
舍入到最接近:舍入到最接近,在一样接近的情况下偶数优先(Ties To Even)(这是默认的舍入方式):会将结果舍入为最接近且可以表示的值,但是当存在两个数一样接近的时候,则取其中的偶数(在二进制中式以0结尾的)。
朝+∞方向舍入:会将结果朝正无限大的方向舍入。
朝-∞方向舍入: 会将结果朝负无限大的方向舍入。
朝0方向舍入: 会将结果朝0的方向舍入。
除此之外,浮点数还可以表示无穷大和非数值(Nan),以单精度浮点数为例,总结如下:
|