为什么 1e100 不能完全表示为 64 位浮点数?

Why is 1e100 not exactly representable as 64 bit float?

提问人:James Rider 提问时间:7/3/2022 更新时间:7/8/2022 访问量:266

问:

有人告诉我,1e100 不能完全表示为 64 位浮点数。使用 64 位浮点数,我们可以在有效数中有 16 位有效数字,并操纵指数(最多约 10^308)。因此,由于 1e100 只有一个有效数字,为什么这个数字不能完全表示为浮点数?

浮点 计算机科学 精密 数值方法

评论

1赞 old_timer 7/3/2022
检查表示 100、1000、10000 需要什么,然后答案很快就会变得非常明显。
0赞 topsail 7/3/2022
这是计算机科学的一个主题,如果你真的想知道,那么你必须深入研究数学。否则 - 你只是相信它(只有 2 的幂可以用浮点表示) - 参见:为什么浮点数不准确)、浮点算术、浮点数和数百篇类似的文章(长短)
0赞 old_timer 7/3/2022
浮点是以 2 为基数,而不是以 10 为基数。

答:

3赞 chux - Reinstate Monica 7/4/2022 #1

1e100或 10 100 与 2100 * 5100 相同。

5100 是一个奇数,是一个 233 位整数,远远超出了常见的 64 位二进制浮点的精度能力,后者通常具有 53 位的精度。每个二进制浮点都有一个精确值,即一些整数乘以 2 的幂。

如果我们使用不太常见的十进制浮点编码,那么准确保存 10100 是没有问题的。

1赞 user1196549 7/4/2022 #2

浮点使用指数 2 而不是 10。

10^100 ~ 1.1429873912822749822157835483053 x 2^332.

相反,尽管 2^332 有 99 位有效数字,但它可以精确地表示为浮点数。

评论

0赞 Sam Mason 7/5/2022
可能值得指出的是,最接近 1e100 的 f64 正好是 ,并且与预期的小数点后 16 位匹配。 匹配您的“1.14...”,但您的十进制近似值可能会使表示形式模糊不清5147557589468029 * 2^(332-52)5147557589468029 * (2^-52)
0赞 7/5/2022
@SamMason:不,浮点表示使用超过 1 的尾数,而不是最接近的近似值。此外,显示整数似乎意味着一个确切的值。你的评论掩盖了事情。