浮点数尾数的基数越大,能表示的数越多?
The larger the radix of the mantissa of a floating-point number, the more numbers it can represent?
我在《计算机系统》教材(清华大学出版社,ISBN:978-7-302-53021-3,第25页)上看到这段话:
the larger the radix of the mantissa of floating-point number, the more numbers it can represent.
我觉得这有点难以理解。我的想法是,不管尾数的基数有多大,浮点数能表示多少个数都是由尾数决定的。如果尾数部分可以表示210个数,无论尾数的基数如何变化,都只是让210个数变大或者一起变小,数量不变。
这句话应该怎么理解?
您链接到的页面似乎不是来自教科书。似乎有人问一个问题,两个人回答。其中之一说,基数越高(以 1、2、4 和 8 为例),给定有效数的固定宽度,越多的有效数(首选术语而不是“尾数”)是正常的而不是非规范化的.这在某种程度上是正确的,但这并不意味着可以表示更多的数字。
关于非正规有效数的一个问题是它们与其他指数的表示重叠,除了指数范围的低端。例如,在四进制中,0.123•41 等于 1.230•40,因此该数字有两种表示形式。给定 28 = 256 个有效数字(四个数字,每个数字为两位)和一个指数范围,比方说,100 个值,我们有 256•100 = 25,600 个数字表示。然而,在 99 个指数值中,所有第一个数字为 0 的有效数字都与具有较低指数的表示重叠。所以有 26•99 = 6,336 个重复项,只剩下 25,600−6,336 = 19,264 个唯一可表示的数字。
如果我们使用二进制,仍然有 28 = 256 个有效数字(现在分组为八位数字,每个数字一位),所以仍然有 25,600 种数字表示形式。在 99 个指数值中,所有第一个数字为 0 的有效数字都与具有较低指数的表示重叠。但是现在第一个数字只有一位,所以有 27•99 = 12,672 个重复项,剩下 25,600−12,672 = 12,928 个唯一可表示的数字。
所以,是的,一般来说,如果我们允许有效数字中有任何值,并且有效数字的位数和指数范围是固定的,那么更高的基数允许我们表示更多的数字。当基数等于或超过有效数可以具有的值的数量时,将达到最大效率,此时唯一的副本将是零有效数。然后 floating-point 数字将是某个巨大基数中的单个数字乘以该基数的幂。这种格式的一个问题是它会在单个指数覆盖的大部分区间内失去精度。例如,在基数 100 中,有效数字的范围从 00 到 99。我们可以将 12 表示为 12•1000。但是,当我们想将其乘以 10 时,我们不能表示 120。我们能得到的最接近的是 01•1001 = 100.
但是,对于基数 2,我们可以使用一个技巧:我们不使用任何首位为零的表示,除了我们留出一个指数代码来处理小数。每当指数代码为“normal”时,尾数的第一位必须为1,我们不单独存储。 (从指数代码得知。)当指数代码是特殊的 set-aside 值时,我们将其视为最低指数,但它表示尾数的第一位为零。那么可表示的数字之间就没有重叠。继续以100个指数值为例,对于99个指数代码,有256•99 = 25,344个可表示值,每个都不同,并且对于一个指数代码,有256•1 = 256个可表示值,每个都不同其他和以前的值。所以有25,344+256 = 25,600个独特的可表示值,完美的效率。
我在《计算机系统》教材(清华大学出版社,ISBN:978-7-302-53021-3,第25页)上看到这段话:
the larger the radix of the mantissa of floating-point number, the more numbers it can represent.
我觉得这有点难以理解。我的想法是,不管尾数的基数有多大,浮点数能表示多少个数都是由尾数决定的。如果尾数部分可以表示210个数,无论尾数的基数如何变化,都只是让210个数变大或者一起变小,数量不变。
这句话应该怎么理解?
您链接到的页面似乎不是来自教科书。似乎有人问一个问题,两个人回答。其中之一说,基数越高(以 1、2、4 和 8 为例),给定有效数的固定宽度,越多的有效数(首选术语而不是“尾数”)是正常的而不是非规范化的.这在某种程度上是正确的,但这并不意味着可以表示更多的数字。
关于非正规有效数的一个问题是它们与其他指数的表示重叠,除了指数范围的低端。例如,在四进制中,0.123•41 等于 1.230•40,因此该数字有两种表示形式。给定 28 = 256 个有效数字(四个数字,每个数字为两位)和一个指数范围,比方说,100 个值,我们有 256•100 = 25,600 个数字表示。然而,在 99 个指数值中,所有第一个数字为 0 的有效数字都与具有较低指数的表示重叠。所以有 26•99 = 6,336 个重复项,只剩下 25,600−6,336 = 19,264 个唯一可表示的数字。
如果我们使用二进制,仍然有 28 = 256 个有效数字(现在分组为八位数字,每个数字一位),所以仍然有 25,600 种数字表示形式。在 99 个指数值中,所有第一个数字为 0 的有效数字都与具有较低指数的表示重叠。但是现在第一个数字只有一位,所以有 27•99 = 12,672 个重复项,剩下 25,600−12,672 = 12,928 个唯一可表示的数字。
所以,是的,一般来说,如果我们允许有效数字中有任何值,并且有效数字的位数和指数范围是固定的,那么更高的基数允许我们表示更多的数字。当基数等于或超过有效数可以具有的值的数量时,将达到最大效率,此时唯一的副本将是零有效数。然后 floating-point 数字将是某个巨大基数中的单个数字乘以该基数的幂。这种格式的一个问题是它会在单个指数覆盖的大部分区间内失去精度。例如,在基数 100 中,有效数字的范围从 00 到 99。我们可以将 12 表示为 12•1000。但是,当我们想将其乘以 10 时,我们不能表示 120。我们能得到的最接近的是 01•1001 = 100.
但是,对于基数 2,我们可以使用一个技巧:我们不使用任何首位为零的表示,除了我们留出一个指数代码来处理小数。每当指数代码为“normal”时,尾数的第一位必须为1,我们不单独存储。 (从指数代码得知。)当指数代码是特殊的 set-aside 值时,我们将其视为最低指数,但它表示尾数的第一位为零。那么可表示的数字之间就没有重叠。继续以100个指数值为例,对于99个指数代码,有256•99 = 25,344个可表示值,每个都不同,并且对于一个指数代码,有256•1 = 256个可表示值,每个都不同其他和以前的值。所以有25,344+256 = 25,600个独特的可表示值,完美的效率。