单精度浮点数与机器精度(一)

2014-11-24 02:08:41 · 作者: · 浏览: 0
一、单精度浮点数
先来简单了解一下浮点数在计算机中的存储方式。根据IEEE 754标准,单精度浮点数格式如下(所有位取0):
符号位
指数部分
尾数
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
各部分解释
单精度浮点数有32个二进制位,左侧是高位,右侧是低位。最高位被指定为符号位,0代表正数,1代表负数。指数部分将是2的幂次,其编码值(即上表指数部分对应的八个二进制位)规定为指数的实际值加上偏移值2^7-1=127,这是为了避免负数,将[-127, 128]映射到[0, 255],这样指数部分编码就可以简单地编排为[00000000, 11111111]。例如指数部分为00001000,十进制为8。那么其所代表的实际指数是8-127=-119,即要乘上2-119。最后23位尾数是不包含整数位的实际有效小数位。规约数的整数位是1,非规约数的整数位是0。
规约形式的浮点数与非规约形式的浮点数
指数部分的编码值在[1, 2e-2]内,且尾数部分的整数位是1,这样的浮点数被称为规约形式的浮点数。
指数部分的编码值为0,尾数非零,这样的浮点数被称为非规约形式的浮点数。
规约浮点数的尾数∈[1, 2),而非规约浮点数的尾数∈(0, 1)。 需要注意,非规约数指数编码为00000000,但指数实际值是-126,而非-127。非规约浮点数被IEEE 754-1985标准采用是因为它的渐进式下溢出,而规约浮点数将导致突然式下溢出,具体原理不再展开。
实际计算
设符号位为s。sign(s)确定正负:sign(0)=1,sign(1)=-1;指数部分为e;尾数部分为f。用(N)2表示二进制数N。
规约形式:sign(s)*2e-127*(1.f)2
非规约形式:sign(s)*2-126*(0.f)2
特殊值和极值
类别
符号位
指数部分
尾数
数值
正负零
0/1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
±0
正负无穷
0/1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
±∞
最大规约数
0/1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
±(2 2-23) × 2127 ≈ ±3.40e38
最大非规约数
0/1
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
±(1 2 23) × 2-126 ≈ ±1.18e-38
最小规约数
0/1
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
±2 126 ≈ ±1.18e-38
最小非规约数
0/1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
±2 23 × 2 126 = ±2 149 ≈ ±1.40e-45
NaN
0/1
1
1
1
1
1
1
1
1
非零