您的位置:首页 > 其它

关于浮点数和IEEE754的理解

2013-04-29 20:21 260 查看
㈠关于浮点数和IEEE754的理解

⑴在此之前先了解二/八/十六进制与十进制的转换方法和数值数据在计算机内的表示方式和编码

⑵二/八/十六进制与十进制数的转换方法和相互之间的转换(整数部分取余和小数部分取整)

⑶定点数(定点整数和定点小数)和浮点数

⑷信息的存储方式和码制(原码,反码,补码,移码)

㈡浮点数的表示和IEEE754标准

⑴浮点数

一般二进制实数在计算机内的表示:N=2^E * F

|阶符|阶码|数符|尾数|

⑵规格化

阶码通常为带符号的纯整数,尾数为带符号的纯小数,

很明显,通过小数点的移位可以用多种浮点形式表示同一个数,

阶码决定范围,尾数决定精度,为了充分利用尾数来表示更多的有效数字,就需要规格化.

规格化就是将尾数的绝对值限定在区间[0.5,1),即尾数的最高位为1,即0.1xxx...x

⑶当尾数用补码表示的时候:

若尾数M>=0,则其规格化的尾数形式为: M=0.1xxx...x,区间[0.5,1)

若尾数M< 0,则其规格化的尾数形式为: M=1.0xxx...x,区间[-1,-0.5)

(*:其中小数点左边的一位数为符号位,补码的补码为其原码)

㈢IEEE754标准

详见wiki百科: https://zh.wikipedia.org/wiki/IEEE_754
在这里特此强调在其标准中:

⑴浮点数被重新分成了三个部分:|数符S|指数E|尾数F(按上面的来说,就是尾数的小数部分)|.

float和double对应的位数分别为:1,8,23和1,11,52

⑵为了指数E的大小比较和对阶方便,同时可以省去阶符,加上偏移值2^E-1 - 1.(32/64位精度浮点的偏移值分别为:127/1023)

由于8位和11位指数域对应的无符号数的值的范围分别是[0,255]和[0,2047],而除去特殊值的全0和全1指数,则真正的指数取值范围分别是[-126,127]和[-1022,1023]

⑶规格形式的浮点数:

①通常一个浮点数规格化之后的尾数为0.1xxx...x,

②这里为了进一步提高精度,将小数点再向右移一位,将其变成1.xxx...x,并将"1"隐含,所以实际中32位浮点的有效位数为23+1=24位,

(*:这里指数部分的编码值在 0< exponent< 2^E - 1,即除去特殊值的全0和全1指数)

⑷非规格形式的浮点数:

这里必须理解 突然式下溢出(abrupt underflow) 和 渐进式下溢出(gradual underflow) (wiki上有详细说明)

然后就会明白为什么会有特殊值及以下几点:

①指数域全0的时候,其实际指数值为-126,而不是-127,更重要的是尾数再次变成了0.111...11~0.000...01,而不是1.xxx...x

②[0,2^-126] 和 [2^-126,2^-125] 两个区间的浮点数密集程度是一样的(区间范围相同且浮点个数均为2^23个),精度为:2^-126 * 2^-23 = 2^-149,

==============================================================

以下链接供参考用:

/article/7150941.html

/article/6913182.html(这个4.1节里是错的,)

/article/7777493.html

http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html

附上:

单精度浮点数各种极值情况:

类别正负号实际指数有偏移指数指数域尾数域数值
0-12700000 0000000 0000 0000 0000 0000 00000.0
负零1-12700000 0000000 0000 0000 0000 0000 0000−0.0
1001270111 1111000 0000 0000 0000 0000 00001.0
-1101270111 1111000 0000 0000 0000 0000 0000−1.0
最小的非规约数*-12600000 0000000 0000 0000 0000 0000 0001±2−23 × 2−126 = ±2−149 ≈ ±1.4×10-45
中间大小的非规约数*-12600000 0000100 0000 0000 0000 0000 0000±2−1 × 2−126 = ±2−127 ≈ ±5.88×10-39
最大的非规约数*-12600000 0000111 1111 1111 1111 1111 1111±(1−2−23) × 2−126 ≈ ±1.18×10-38
最小的规约数*-12610000 0001000 0000 0000 0000 0000 0000±2−126 ≈ ±1.18×10-38
最大的规约数*1272541111 1110111 1111 1111 1111 1111 1111±(2−2−23) × 2127 ≈ ±3.4×1038
正无穷01282551111 1111000 0000 0000 0000 0000 0000+∞
负无穷11282551111 1111000 0000 0000 0000 0000 0000−∞
NaN*1282551111 1111non zeroNaN
* 符号位可以为0或1 .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: