二进制的科学计数法?白话谈谈计算机如何存储与理解小数:IEEE 754

您所在的位置:网站首页 11的22次方是多少科学技术发 二进制的科学计数法?白话谈谈计算机如何存储与理解小数:IEEE 754

二进制的科学计数法?白话谈谈计算机如何存储与理解小数:IEEE 754

2024-03-01 19:13| 来源: 网络整理| 查看: 265

浮点数的计算机表示(IEEE 754),由 UCB 数学教授 William Kahan 主要起草。后者也因其卓越贡献于1989年获得图灵奖。计算机组成原理与汇编语言这两门课均对该内容有所讲解。与课程中直接抛出公式与概念不同,我想首先与各位探讨"科学计数法"这个概念,进而讨论设计二进制的科学计数法需要涉及到哪些元素。接着,我们讨论如何在内存上表达这个方案。最后讨论计算机的具体实现。

科学计数法

我们都了解科学计数法。科学计数法的精妙之处在于,其将"量级"与"数值"两个信息拆分,让使用者对这两个信息更加明确。 12345 = 1.2345 × 1 0 4 12345 = 1.2345 \times 10^4 12345=1.2345×104

如上,我们可以将任何有理数拆分成 A = B × 1 0 C A=B \times 10^C A=B×10C的形式。值得注意的是:

B B B的取值范围是 B ∈ [ 1 , 10 ) B\in [1,10) B∈[1,10) C C C一定是一个整数

对于任何有理数,我们都可以用两个范围狭小(规则明确)的数字 B 与 C 来表示。

此外,我们知道,十进制只不过是记录数字大小的一种方式而已。历史上出现过的二进制、三进制、二十进制,都可以毫无障碍地表示数字,并且还有其独具的数学特性。

那么,二进制可以用科学计数法表示吗?答案当然是肯定的。

二进制的科学计数法

A 2 = B 2 × 1 0 2 C A_2 = B_2 \times 10_2^C A2​=B2​×102C​

注意,这里下标2,代表这个数是二进制。 同理, 1 0 2 10_2 102​对应十进制中的数字 2 = 2 1 × 1 + 2 0 × 0 2=2^1 \times 1 + 2^0 \times 0 2=21×1+20×0。

通过观察十进制的科学计数法形式,对于二进制,我们自然可以做出如下约定:

B B B的取值范围是 B ∈ [ 1 , 2 ) B \in [1,2) B∈[1,2) C C C一定是一个整数

这里我们补充说明一下,二进制的小数是什么样的。对于 5.25 5.25 5.25 这个十进制数,如果要将其转换为二进制:

将其整数部分与小树部分分开; 对于整数部分 5 ,我们使用"不断除以2取余数"的方法,得到 101 ; 对于小数部分 .25 ,我们使用"不断乘以2取整数"的方法,得到 .01 。

关于进制转换的具体方法与背后的数学原理,我写过一篇文章进行讨论,见这里:十进制转二进制 / 八进制 / 十六进制的手算方法,及其数学原理的通俗解释。

这里,我们只需要明确,二进制是存在小数形式的,且可以表示一切十进制可表示的数(的近似)。

计算机如何记录二进制的科学计数法

接着,我们步入正题:只会表示0/1的计算机,如何记录并表达浮点数呢?

给一个32位的空间,如果不做任何约束,我们只能将其理解为一个整数,并且其取值范围为 [ 0 , 2 32 − 1 ] [0, 2^{32}-1] [0,232−1] 。

这是因为,计算机只能记录 0 和 1 这两个信息,并不能直接记录小数点点在哪里。因此,我们需要设置一定规则,取出一定位,用于表示小数点点在哪里。这必将牺牲一定的精度与取值范围。

因此,我们将这 32 位空间分为三部分:

第一部分,用于表示精度,即这个数字值是多少,对应上面的B; 第二部分,用于表示小数点,即量级,对应上面的C; 第三部分,用于表示正负,只需要使用1位。

在 IEEE 754 中,我们分别将上述一、二、三部分叫做尾数M,阶码E,符号s。 于是我们有了二进制的表达式: V = ( − 1 ) s × M × 2 E V=(-1)^s \times M \times 2^E V=(−1)s×M×2E

为了表示尽可能多的、常用的小数,我们有如下需求:

对于符号位 s ,如果该位上是 0 ,则为正数;为 1 ,则为负数。 对于尾数 M ,其取值范围为 [ 1 , 2 ) [1, 2) [1,2) ; 对于阶码 E ,其为一个整数,并且取值范围应该包含负数、0、正数。

可以注意到,对于 M 、 E ,我们并不能直接用二进制表示,还需要设定一定规则。

尾数 M

假设尾数 M 一共有 f 位,则 f 可表示的整数取值范围为 [ 0 , 2 f − 1 ] [0, 2^f - 1] [0,2f−1] ,我们称 f 直接对应的非负整数为 C 。为了将其投影到 [ 0 , 1 ) [0, 1) [0,1) ,我们做出如下变换: M = 1 + C 2 f M=1+\frac{C}{2^f} M=1+2fC​

解码 E

假设解码 E 一共有 e 位,则 e 可表示的整数取值范围为 [ 0 , 2 e − 1 ] [0, 2^e - 1] [0,2e−1] ,我们称 e 直接对应的非负整数为 Exp 。我们希望 E 可以取到负数,因此做出如下变换: E = E x p − ( 2 e − 1 − 1 ) E = Exp - (2^{e-1}-1) E=Ex



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3