到现在为止还好。现在,如何解释数字通常用公式来解释:这通常是我翻转表的地方。也许我对数学符号过敏,但当我读到这篇文章时,我的大脑里就是有什么东西没有灵光一闪。感觉像是在学画猫头鹰。
虽然这种解释浮点的方式是正确的,但通常会让我们中的一些人完全不知所措。我指责这个可怕的符号让大批程序员灰心丧气,把他们吓到再也不回头去理解浮点的实际工作原理的地步。幸运的是,有一种不同的方式来解释它。不是指数,而是两个整数的两个连续幂之间的窗口。考虑窗口内偏移量,而不是尾数。该窗口告诉您数字将在哪两个连续的2次幂范围内:[0.5,1]、[1,2]、[2,4]、[4,8]等等(最高可达[$2^{127}$,$2^{128}$]。偏移量将窗口划分为$2^{23}=8388608$存储桶。使用窗口和偏移量,您可以近似计算一个数字。窗户是一种很好的防止溢出的装置。一旦您在一个窗口中达到最大值(例如[2,4]),您就可以将其浮动并表示下一个窗口(例如[4,8])中的数字。因为窗口变得两倍大,所以它只需要一点精度。下图说明了数字6.1将如何编码。窗口必须从4开始,跨度到2的下一个幂8。偏移量大约是窗口的一半。
当窗口覆盖范围较大时,精度会损失多少?让我们以窗口[1,2]为例,其中8388608个偏移量覆盖范围1,其精度为$\frac{(2-1)}{8388608}=0.00000011920929$。在窗口[2048,4096]中,8388608个偏移量覆盖$(4096-2048)=2048$的范围,这给出了精度$\FRAC{(4096-2048)}{8388608}=0.0002$。
让我们举另一个例子,详细计算我们都很熟悉的一个数字的浮点表示:3.14。数字3.14是正的$\right tarrow S=0$。数字3.14介于2和4的幂之间,因此浮动窗口必须从$2^1$$\right tarrow E=128$开始(请参阅公式,其中窗口是$2^{(E-127)}$)。最后,有$2^{23}$偏移量可用于表示3.14在区间[2-4]内的位置。在使偏移量$M=2^{23}*0.57=4781507$的区间内,它位于$\frac{3.14-2}{4-2}=0.57$。
其二进制翻译为:因此,值3.14近似为3.1400001049041748046875。用难看的公式对应的值:最后是用窗口和偏移量表示的图形:希望对您有帮助:)!既然浮点单位速度如此之慢,为什么C语言以FLOAT和DOUBLE类型结束呢?毕竟,用于发明语言(PDP-11)的机器没有浮点单元!制造商(DEC)曾向丹尼斯·里奇和肯·汤普森承诺,下一款将会有一款。作为天文学爱好者,他们决定在他们的语言中加入这两种类型。琐事:1991年真正想要硬件浮点运算单元的人可以买一个。当时唯一可能想要一台的人可能是科学家(根据英特尔对市场的理解)。它们在市场上被称为数学协处理器。性能一般,价格惊人(1993年的200美元相当于2016年的350美元)。因此,销售表现平平。
*