浮点数的二进制表示
在理解二进制浮点数的表示之前,首先先从十进制的浮点数表示开始,十进制的浮点数表示如下
\[d_{m}d_{m-1}...d_{1}d_{0}.d_{-1}.d_{-2}...d_{-n} \]每一个十进制数字\(d_{i}\)的范围为\([0,9]\)。这个十进制浮点数表示法的值为
\[d=\sum_{i=-n}^{m}10^{i}\cdot d_{i} \]二进制浮点数表示和十进制浮点数的类似,如下所示
\[b_{m}b_{m-1} \cdots b_{1}b_{0}.b_{-1}b_{-2}b_{-3} \cdots b_{-n} \]每一个二进制数字\(b_{i}\)的范围为\([0,1]\)。因此,这个二进制浮点数表示法的值为
\[\sum_{i=-n}^{m}2^{i} \cdot b_{i} \]举个例子,例如二进制浮点数表示法111.111的值为:
\[1 \cdot 2^2+1 \cdot 2^1+1 \cdot 2^0+1 \cdot 2^{-1}+1 \cdot 2^{-2}+1 \cdot 2^{-3}=4\frac7 8 \]IEEE754浮点数表示法
IEEE浮点数由三部分组成,分别为符号位\(s\),指数位\(exp\)和小数位\(frac\)。单精度浮点数用32位表示,符号位\(s\)占1位,指数位\(exp\)占8位,小数位\(frac\)占23位。双精度浮点数用64位表示,其中符号位\(s\)占1位,指数位\(exp\)占11位,小数位\(frac\)占52位。以单精度浮点数为例:
\[b_{31} \space \space b_{30}b_{29}b_{28}b_{27}b_{26}b_{25}b_{24}b_{23} \space \space b_{22}b_{21}b_20{}...b_{0} \]\(b_{31}\)为符号位\(s\),\(b_{30}-b_{23}\)为指数位\(exp\),\(b_{22}-b_{0}\)为小数位\(frac\)。
IEEE浮点数表示法编码
IEEE浮点数表示法的编码可以分为三个种类,规格化值,非规格化值,特殊值。
规格化值
当指数位不全为0且不全为1的时候为规格化值,这时浮点数的编码为\((-1)^{s} \cdot M \cdot 2^{E}\)。
\(s\)就是符号位的值,也就是说当\(s=1\)的时候,\((-1)^{1}=-1\)表示负数,\((-1)^0=1\)表示正数.
\(E\)等于\(e-Bias\)。\(e\)是由指数位编码的无符号整数,而\(Bias=2^{k-1}-1\)。其中\(k\)为指数位的位数,因此单精度浮点数的\(Bias=2^{8-1}-1=127\),双精度浮点数的\(Bias=2^{11-1}-1=1023\)。由于规格化值的指数位不全为0且不全为1,所以单精度浮点数的指数范围为\([-126,127]\),双精度浮点数的指数范围为\([-1022,1023]\)
\(M=1+f\),其中\(f\)表示的是由小数位\(frac\)编码的二进制小数,即\(0.f_{n-1}f{n-2}...f_0\).因此\(M=1.f_{n-1}f_{n-2}...f_0\),由此可以看出,规格化值会有一个额外的精度.
非规格化值
当指数位全部为0的时候,此时为非规格化值,编码公式为\((-1)^{s} \cdot M \cdot 2^{E}\)。非规格化值的区别有以下几点.首先\(M\)的值就是小数位\(frac\)编码的二进制小数,没有隐藏的额外精度了.其次,\(E\)的计算方式为\(1-Bias\),\(Bias\)的计算方式还是一样的,这样的计算方式是为了实现平滑的过度.
非规格化值的目的有两个。第一个是提供数值0的表示,因为在规格化值中,由于前导1的存在,无法表示数值0,但是在非规格化值中,不存在前导1,所以只要有效位全部为0,指数位也全部为0,那么就可以表示数值0。唯一需要注意的一点是,由于符号位的存在,所以会出现\(+0.0\)和\(-0.0\)。非规格化值的另一个目的是可以表示十分接近0的数字。
特殊值
当指数位全部为1的时候,此时表示特殊值。当小数位全部为0的时候,此时表示无穷,同样由于符号位的存在,\(+\infty\)和\(-\infty\)。当小数位不全部为0的时候,表示\(NaN\)。这个值用于表示某些操作返回的值不能有实数表示,例如\(\infty-\infty\)。
标签:规格化,754,cdot,浮点数,表示法,二进制,小数位,IEEE From: https://www.cnblogs.com/riasartemis/p/17086199.html