最近复习计算机组成原理,看到关于机器浮点数这一块的知识,头有点大,并且对于原码,补码下不同的机器浮点数特别容易弄混,所以在一阵小研究之后,有了自己的一点看法。
1.浮点数的表现形式
浮点数在机器中的形式如下所示:
jf,j1j2.....jmSf.S1S2.....Sn
对于上述的形式的解释:
1.浮点数由阶码j和尾数S两部分组成。
2.阶码是整数,阶符和阶码位数m合起来表示浮点数的表示范围及小数点的实际位置。
3.尾数是小数,其位数n反应了浮点数的精度,尾数的符号
Sf
代表浮点数的正负
2.浮点数的表示范围
下面将从两个机器数形式介绍下机器浮点数的范围表示:
2.1非规格化下的原码形式浮点数
这种浮点数的二进制数据是原码形式表示。
1.最大正数:最大正数要求阶码为正且足够大,尾数为正且最大,则得以下形式:
0,11...1m个10.11...1n个1
这时很容易就得到最大正数为: 22m−1∗(1−2−n)
2.最小正数:对于浮点数,由于浮点数不考虑为0的情况,所以要得到最小正数,阶码为负且足够小,尾数为正但足够小,则得到以下形式:
1,11...1m个10.00...0n−1个01
得到最小正数为: 2−(2m−1)∗2−n
3.最大负数:要得到最大负数,则是绝对值最小的负数,保证绝对值最小,则需要阶码为负足够小,尾数足够小,其次由于负数,要求数符 Sf 为1,则得到以下形式:
1,11...1m个11.00...0n−1个01
得到最大负数为:- 2−(2m−1)∗2−n
4.最小负数:要得到最小负数,则是绝对值最大的负数,保证绝对值最小,则需要阶码为正足够大,尾数足够大,其次由于负数,要求数符 Sf 为1,则得到以下形式:
0,11...1m个11.11...1n个1
得到最小负数为:- 22m−1∗(1−2−n)
这里我们其实可以很清楚的看到正数和负数的范围其实具有一种对称性,主要是由于相同位数下的机器原码的正负表示范围相对于坐标原点具有一种对称性。
2.2规格化下的原码形式浮点数
对于规格化原码形式浮点数,则是要求尾数的最高位为1。所以在这种要求下,相对于非规格化原码形式浮点数,其最大正数和最小负数不变,仍分别为
22m−1∗(1−2−n)
, -
22m−1∗(1−2−n)
发生变化的是最小正数和最大负数,要求尾数最高位为1,此时最小正数的形式为:
1,11...1m个10.100...0n−1个0
得到最小正数为:
2−(2m−1)∗2−1
;
同理,最大负数的形式如下:
1,11...1m个11.100...0n−1个0
得到最大负数为: - 2−(2m−1)∗2−1 ;
2.3规格化下的补码形式浮点数
补码形式下的浮点数范围是比较复杂的,因为涉及原码补码的转化。其次还有个比较重要的点就是规格化下的补码浮点数有个要求,如下:
a. 当尾数S>0时,要求补码规格化形式为:
[S]补
=0.1xxxxx
b. 当尾数S<0时,要求补码规格化形式为:
[S]补
=1.0xxxxx
一句话概括就是尾数第一位要保证与数符
Sf
不同
下面将基于上面所说介绍补码下的浮点数范围:
1.最大正数:这个和原码形式下的表示是一样的,形如:
0,11...1m个10.11...1n个1
这时很容易就得到最大正数为: 22m−1∗(1−2−n)
2.最小正数:要求是一样的,保证阶码为负且最小,尾数为正且最小,由于补码形式下,最小负数形式为1,00000…….,所以得规格化补码形式的浮点数的最小正数形如:
1,00...0m个00.100...0n−1个0
这里的阶码转换为原码后真值为: −2m ,所以得最小正数为: 2−2m∗2−1
3.最大负数:同样的要求,阶码为负最小,尾数为负最小,形如:
1,00...0m个01.011...1n−1个1
这里的阶码转换为原码对应的真值为:
−2m
, 就不做过多解释,对于尾数,在规格化要求下,小数点后第一位要与数符不同,所以这里只能是
1.011...1n−1个1
,转换为原码则为:
1.100...0n−2个01
,对应的十进制真值为:
−2−1−2−n
.
综上所述,最大负数为:
2−2m
*(
−2−1−2−n
)
4.最小负数:要求阶码正最大,尾数、负最小,因为小数补码允许为-1,形如 [S]补 =1.0……..0,所以最小负数对应的规格化补码为:
0,11...1m个01.00...0n个0
其对应的真值为: 22m−1 *(-1).
从上面的介绍,我们可以更直观的发现规格化补码形式的浮点数的范围确实比原码形式下复杂。由于相同位数下的补码表示的正数范围和负数范围也不是对称的,这点需要大家特别注意。(其实在复习到这一块的知识时,当时也是比较懵逼的,所以写下这篇博客和大家交流分享。)
到此这里为止就主要介绍了原码和补码下的浮点数范围。欢迎大家指教交流。
PS:本文设计比较复杂的公式和符号表达,为了更好地写出博客,特地去看了MarkDown编辑器的语法,感觉真心好用。更好使用MarkDown编辑器,推荐去看看用MarkDown编辑器写出漂亮博客。哈哈要午睡了,有问题或者想交流的直接私信或评论就可以啦~