根据IEEE 754标准实现十进制和二进制的转换
在文章开始之前,为大家推荐一款十进制和二进制根据IEEE 754的转换工具,希望可以帮助各位学习IEEE 754。
什么是IEEE 754
IEEE 754标准是由IEEE制定的,它最早发布于1985年,目的是为了统一浮点数的表示和运算规则,以便不同计算机系统之间可以互相兼容。该标准定义了浮点数的表示形式、运算规则和舍入方式,以及特殊值(如无穷大、NaN等)的处理方式。
根据IEEE 754将十进制转换为二进制
十进制浮点型转换为二进制浮点型:
首先我们要知道怎么将十进制的浮点型转换成二进制的浮点型
我们以25.75为例
-
整数部分:25转换成二进制
做连续的除法/2直到最后为0,然后倒写余数
-
小数部分:0.75转换成二进制
将小数部分*2连乘,提取出每一次的整数部分,直到小数部分最后为0,然后正写整数部分。
所以我们得到的二进制小数是11001.11
我们接下来的任务就是将这个二进制小数以IEEE 754标准改写二进制小数
IEEE 754的基本格局
IEEE 754标准主要包括两种浮点数格式:float单精度浮点型(4字节=32位)和double双精度浮点型(8字节=64位)。
单精度浮点数由1位符号位(sign)、8位指数位(Exponent)和23位尾数(Mantissa)位组成。
双精度浮点数由1位符号位(sign)、11位指数位(Exponent)和52位尾数位(Mantissa)组成。
因为两种浮点型的表示规则相似,我们以较为简单的float(单精度浮点数)为例:
- 符号位(S):1位,0表示正数,1表示负数
- 指数位(E):8位,使用移码表示
- 尾数位(M):23位,二进制小数形式表示
以上三个部分是相对独立的,我们在转换和阅读的时候也必须分开。
我们以下面的表格表示32位的float单精度浮点型位数和顺序:
S | E(8位) | M(23位) | |||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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位符号位(S)
正数的符号位为0,负数的符号位为1。
首先,判断该浮点数是正数还是负数。
我们举例的25.75是正数,所以符号位位0。
第2~9位指数位(E)
这里我们参考科学计数法,要用指数位将小数点移到第一二位之间。
对于11001.11(25.75)而言,只需要将小数点向左移4位就可以,也就是说指数位是4。
- 可是这里有一个问题,8位的指数位只能代表正数,在这个例子上应该没问题,可是如果遇到-4该怎么办呢?
- IEEE 754给出的答案是我们以01111111(十进制的127)为0,也就是是如果我们要表示4,实际的指数位应该4+127=131,那么指数位应当10000011
- 在这里我们将127定义为偏移值
我们可以使用就将25.75转换为了1.100111*(2^4)。
这里我们得到了前面的9位数字:0 10000011
第10~32位尾数位
对于1.100111*(2^4)来说,我们为了拓宽float的表达范围,因为整数部分始终为1,我们只需要表达小数部分100111,然后只需要将之后的每一位都补0。最后尾数位是10011100000000000000000。
结果
有限小数
无限小数
我们可以发现最后的实际值不是准确值,是因为二进制无法准确的表示该十进制值,所以只能在最大程度上用近似值去表达。
IEEE 754的意义
IEEE 754标准在计算机科学和工程领域得到了广泛的应用,几乎所有现代的计算机系统都采用了IEEE 754标准来表示和处理浮点数。它为不同计算机系统之间的数据交换和计算结果的一致性提供了基础,同时也为软件开发者提供了一致的浮点数运算规则,一定程度上避免了因为浮点数表示和运算规则不一致而导致的错误。