在一些工程领域中单单依靠整数是无法满足他们对精度的需求的,这种时候就需要用到浮点数了。今天着重来聊一聊在计算机底层,浮点数的编码方式,以及它相关值的计算方式。
二进制小数
在介绍浮点数之前先来看看二进制中实数可以如何表示。假设我有一个十进制的小数8.33,那么它的值可以表示为
8 + 3 / 10 + 3 / 100 = 833 / 100
复制代码
各个位的权重依次是10 ^ 0 = 1, 10 ^ -1 = 0.1, 10 ^ -2 = 0.01。其实二进制小数也是类似的,只不过它是逢二进一。考虑这个二进制串1001.1111,它所能够代表的十进制数字是多少呢?简单地可以把它分成整数部分1001以及小数部分1111。
整数部分
整数部分的计算很容易了,在不考虑符号的情况下依次代入相关的权重即可
1 * 2 ^ 3 + 0 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 1 = 9
复制代码
小数部分
小数部分其实类似,只不过相关的权重需要稍微调整一下。
1 * (2 ^ -1) + 1 * (2 ^ -2) + 1 * (2 ^ -3) + 1 * (2 ^ -4) = 1 / 2 + 1 / 4 + 1 / 8 + 1 / 16 = 15 / 16
复制代码
再换个角度去看这个小数的部分,其实它还等价于1111 / 10000。
(1 * 2 ^ 3 + 1 * 2 ^ 2 + 1 * 2 ^ 1 + 1 * 2 ^ 0) / (2 ^ 4) = 15 / 16
复制代码
就是先计算二进制串1111的值,再把它的小数点往左移动4位,因此需要除以2 ^ 4。结合整数部分以及小数部分,可以得到最终结果9 + (15 / 16) = 159 / 16。
如果用已有的二进制编码知识来表示数值159 / 16,那么只需要分配一段内存区域来存储159的二进制串10011111,然后再利用另一段区域来存储小数点相关的偏移量00000100即可。不过这种方式灵活性比较低,所能够表示的数值范围也十分有限。那么接下来看看现代机器中浮点数是如何表示的。
IEEE浮点数
基于前面所谈到的原理,了解IEEE浮点数就不是什么大问题了。IEEE浮点数是一个工业上的标准,根据标准来设计的机器彼此之间的兼容性会比较高。
基本原理
IEEE浮点数的计算方式稍微有点麻烦,不过原理十分简单,说白了就是科学计数法。假设我有一个十进制小数100.2那么其实这个数可以表示为0.1002 * (10 ^ 2),可以简单地