尾数的最左端总是1吗?

问题描述

enter image description here

我正在读《程序的秘密生活》一书。在第一章中,对数字设备公司(DEC)发明的技巧进行了解释,该技巧可以使精度提高一倍:“丢弃尾数的最左位会使精度提高一倍,因为我们知道该精度始终为1,因此还有一点空间。”

我听不懂。举例来说:让我们考虑一个2位尾数和2位指数的4位浮点表示形式。二进制数字01.11然后代表4.0。最左边的位是0,而不是1。

任何人都可以通过一个简单的例子向我解释“扔掉最左边的位”和“加倍精度”是什么意思吗?

解决方法

浮点格式有所不同,但是在大多数情况下,浮点表示是 s b e f ,其中 s 是+1或-1表示符号, b 是基数(通常为2或10 ), e 是一个指数,而 f 是一个以 b 为底的 p 数字。 b p 是由格式确定的固定数字。 s e f 根据所代表的数字而变化。 f 被称为有效数。 (这是浮点数小数部分的首选术语。“ Mantissa”是对数小数部分的历史术语。)

e 上的界限以及 f 的缩放比例由格式决定。有时 f 被指定为在其第一位数字后有一个小数点(十进制的一般形式),因此其形式为 d 0 d −1 d −2 ... d 1- p ,其中每个 d i 是基数- b (一个从0到 b -1的整数,包括两端)。以这种形式,0≤ f b 。 (我们不需要在此答案中关注其他形式。)

在大多数情况下, f 的第一位不需要为零。如果为零,我们可以将其删除并将其他数字左移一个位置。这会将 f 乘以 b ,但是我们可以通过将指数 e 减一来进行补偿。例如,如果浮点数为0.111 2 •2 7 ,则可以将其表示为1.110 2 •2 6 。这为 f 末尾的新数字打开了空间,这比起第一个数字为零的精度更高。

因此,我们希望第一位数字不为零。这称为标准形式。第一位数字为零的数字将被规格化。在可表示数字的最“底端”, e 达到其界限,我们无法进一步减小它,因此我们无法向左移动 f 的数字,因此必须在第一位置保留零。这些必须进行非正规化的数字是次正规数字。一些浮点格式支持它们。有些没有。

当基数为 b 时,只有两位数字,因此,如果第一位数字不为零,则必须为一。因此,如果数字是正常形式,则我们知道其第一个数字是1。因此,如果我们知道该数字是正常的,则无需与其他数字一起记录。

在IEEE-754格式中,用于记录指数的位还记录该数字是否正常。上面的数字 s e f 存储在我们可能称为 S E F 。但是,它们没有直接存储为这些位中的二进制整数。在指数字段 E 中,如果这些位全为零,则表示一个次正规数。这告诉我们指数 e 处于最低值,并且有效位数的第一位为零。如果所有位均为1,则表示该项为无穷大或NaN。在所有零和所有零之间的所有 e 值表示 e 的值,并且有效数字的第一位是1。 ( E 的值不直接是 e 的值;存在用于调整的偏差,因此 e = E - bias 。例如,IEEE-754 binary32的偏差为127,因此 E 为00000001表示 e = 1 -127 = -126。)

因此,说我们“扔掉”了有效位数的最左边是错误的。实际上发生的是,最左边的位被编码在指数字段中,而最右边的位被存储在有效字段中。

用这种方式处理最左边的位“使准确性加倍”也很草率。的确,用 p 位而不是 p -1位的有效位数具有两倍的可能值,因为每个位将可表示的值数量加倍。因此,与仅使用字段 F 作为有效位相比,通过指数字段编码一位可以为我们提供两倍的可能值。但是,将其描述为比将精度提高一倍还多的精度更为清晰。