谁都能看懂的ieee单精度浮点编码

先起个头:上次说完二,十进制小数间怎样转换后,有很多小伙伴私信问我(其实一个都没有(>﹏<))把十进制小数先转成分数再转成二进制小数的方法只适用于分母为2的幂的分数,那0.1或者0.3这种就转不了啊。嗯……我只能说是的,确实转不了T_T。But,难道这种数就不做了吗!显然不行(┯_┯),至于怎么做待我先说完今天的主题ieee单精度浮点的编码。

计算机为每个字节都给予了一个地址,ieee用4个字节,也就是32位二进制来对一个科学记数法的小数进行编码。

ieee表示的浮点数有如下四种

首先是最常见的规格化数,这样的数,由于这一部分的数每个都是1.开头,所以我们将这一位省略,从而可以多表示一位精度的小数。规格化数的阶码E=exp-bias,八位阶码的bias是127。


经过观察后你会发现最小的规格化的二进制小数的编码是0x00800000,将它转为十进制

如果要表示的小数比它还小就要用到非规格化数,非规格化数的阶码E=1-bias。如将5.877e-39转换为二进制编码

非规格化的还有一个重要用途是表示浮点的+ -0,最后注意一下这里不像规格化数那里有个隐含的1了。

剩下的两种编码就不说了。

现在再回到0.1和0.3的问题,0.1我实在是没想到怎样用分数来转成二进制,但是可以用辗转相乘法来得到(其实我是直接用printf打印看的(^_^)),来个图(这是个规格化数)

这样就得到了0.1对应的二进制编码,记住这个编码后加三次就得到了0.3的编码,或者把乘法变为移位和加法

再如0.6可以用0.5+0.1…,这样又能解决一大批二进制的转换问题了。

最后,以上内容均摘自csapp,如有雷同…嗯……

你可能感兴趣的:(谁都能看懂的ieee单精度浮点编码)