2

首先,请允许我承认我是一位经验丰富的程序员,拥有超过 10 年的编程经验。但是,我在这里要问的问题是,从那时起我就一直困扰着我,大约十年前我第一次拿起一本关于 C 的书。

下面是一本关于 Python 的书的摘录,解释了 Python 的浮点类型。

浮点数使用机器上浮点数的本机双精度(64 位)表示来表示。通常这是 IEEE 754,它提供大约 17 位精度和一个在 –308 到 308 范围内的指数。这与 C 中的 double 类型相同。

我一直不明白的是这句话的意思

" ... 提供大约 17 位精度和 –308 到 308 范围内的指数 ..."

我的直觉在这里误入歧途,因为我可以理解精度的含义,但是范围与此有何不同。我的意思是,如果一个浮点数可以表示最多 17 位的值(即最大值为 1,000,000,000,000,000,00 - 1),那么指数怎么可能是 +308。如果指数是 10,那不会是 308 位数字,如果指数是 2,那不是一个粗略的 100 位数字。

我希望,我能够表达我的困惑。

问候 Vaid,阿布舍克

4

3 回答 3

5

假设我们用两位精度写 1500。这意味着我们已经足够精确地将 1500 与 1600 和 1400 区分开来,但还不足以将 1500 与 1510 或 1490 区分开来。区分这些数字需要三位数的精度。

即使我写了四位数字,浮点表示也不一定包含所有这些数字。1500 是 1.5 * 10^3。在具有两位精度的十进制浮点表示中,仅存储数字的前两位和指数,我将写为 (1.5, 3)。

为什么“真实”数字和占位符零之间存在区别?因为它告诉我们我们可以多精确地表示数字,也就是说,由于逼近而损失了多少数值。我们可以区分 1500 = (1.5, 3) 和 1500+100 = (1.6, 3)。但是如果我们增加指数,我们无法区分 15000 = (1.5, 4) 和 15000+100 = (1.51, 4)。充其量,我们可以用两位小数的精度来近似 +/- 10% 内的数字。无论指数有多大或多小,这都是正确的。

于 2012-06-05T04:22:55.913 回答
0

数字的常规十进制表示掩盖了这个问题。相反,如果人们以标准化的科学记数法来考虑它们以将尾数和指数分开,那么区别是立竿见影的。标准化是通过缩放尾数直到它在 0.0 和 1.0 之间并调整指数以避免比例损失来实现的。

数字的精度是尾数中的位数。浮点数具有有限数量的位来表示这部分值。它决定了区分大小相似的数字的准确程度。

范围确定指数的允许值。在您的示例中,-308 到 308 的范围独立于尾数值表示,并受分配用于存储范围的浮点数中的位数限制。

这两个值可以独立变化以适应。例如,在许多图形管道中,更小的值用截断的值表示,这些值被缩放以适应甚至 16 位。

数值方法库花费大量精力来确保不超过这些限制以保持计算的正确性。临时使用通常不会遇到这些限制。

IEEE 754 中的选择被认为是精度和范围之间的合理权衡。32 位单曲具有相似但不同的限制。问题在 16、32 和 64 位 IEEE-754 系统中可以表示哪些数字范围?提供了更长的摘要和进一步的链接以供更多研究。

于 2021-08-16T16:31:27.720 回答
-2

Wiki中,预计双精度浮点数的精度为 17 位或 17 SF。指数可以在 -1022 到 1023 的范围内。
它们的 -308 到 308 似乎是一个错误,或者是一个没有完全解释的想法。

于 2012-06-05T03:49:30.140 回答