二进制机器字长 12 位。浮点表示时,阶码 4 位,采用移码(含 1 位符号位),尾数 8 位,采用补码(含 1 位符号位)
浮点数的构成
阶码
对于4位阶码,我们可以知道其构成为符号位+阶码真值,既:
1 111 = 15 - 8 = + 7
1 000 = 8 - 8 = + 0
0 111 = 7 - 8 = - 1
0 000 = 0 - 8 = - 8后面我们将把阶码的值记作 E.
尾数
正数
对于一个正数,其符号位为0,并且补码与原码相同,我们将其记作 $$ Sf_{1}f_{2}f_{3}f_{4}f_{5}f_{6}f_{7} $$ 那么其计算方式为:
[ M = \sum_{i=1}^{7} f_{i}\cdot 2^{-i} ]
那么就得到如下:
0 1111111 = 1/2 + 1/4 + 1/8 +... + 1/128 = 1 - 1/128
0 0000001 = 1/128负数
对于一个负数我们有类似的定义,但计算公式为:
[ M = -1 + \sum_{i=1}^{7} f_{i}\cdot 2^{-i} ]
例如:
1 0000000 = -1 + 0 = -1
1 0100000 = -1 + 1*(1/2) = -0.5
1 1111111 = -1 + (1-1/128) = -1/128 // 注意,这个尾数是没有规格化的,是不符合IEEE754规范的尾数的规格化
为了保证计算的精度,我们引入尾数的规格化,其定义了对于一个正数,其尾数真值部分的第一位必须为 1 ,而对于负数,其第一位必须为 0,也就是
- 正数必须形如
0 1xxxxxx - 负数必须形如
1 0xxxxxx
通过计算,我们不难发现,正数 0 1000000 = 1/2,负数 1 0100000 = -1/2,并且使用这种方式,可以限制尾数的绝对值处于 1~1/2 中。
0 的表达
机器零(下溢0)
当阶码为 0000 时,机器将会视此数为0,因为这个数据已经过于小了,发生了下溢。
真值严格为0
当尾数为 0000000 时,该浮点数同样为 0 ,但不符合规格化,所以规格化浮点数没有真值为0的规格化数,所以0一定是非规格数。
浮点数的计算
既然我们已经知道了浮点数的尾数 M 和 阶码 E ,那么我们就可以得到计算方式为
[ X = M * 2^{E} ]
例如:
- $$ 1 = 0.5 * 2^{1} $$ ,此时 M = 0 100 0000 = 0.5 ,E = 1 001,最后得到了 1001 01000000 为该浮点数
正上溢
正上溢为最大可以表示的数,那么就是
1111 0111 1111 -> E=7,M=1-1/128 = $$ 127/128 * 2^{7} $$
负下溢
负下溢为一个数值极小的负数(无限接近零),那么就是让E和M都最小,既
0000 1000 0000 -> E=-8,M=-1 = $$ -1 * 2^{-8} $$
评论0
暂时没有评论