16

这个问题的答案可能很明显,但我无法在 Mozilla 文档中或通过粗略搜索在 Google 上找到它。

如果你有这样的代码

Number.MAX_VALUE + 1; // Infinity, right?
Number.MIN_VALUE - 1; // -Infinity, right?

然后我希望向 Number.MAX_VALUE 添加任何内容会将其推到Infinity. 结果只是Number.MAX_VALUE向我吐口水。

然而,当在 Chrome JS 控制台中玩耍时,我注意到它实际上并没有变成Infinity直到我添加/减去足够多:

Number.MAX_VALUE + Math.pow(100,1000); // now we hit Infinity
Number.MIN_VALUE - Math.pow(100,1000); // -Infinity at last

Number.MAX_VALUE和之间的这个“缓冲区”的解释是什么Infinity

4

2 回答 2

19
于 2012-05-31T17:05:32.203 回答
10

如果您查看Number.MAX_VALUE.toString(2),您会看到 的二进制表示MAX_VALUE是 53 个 1 后跟 971 个 0。这是因为 IEEE 754 浮点数是由尾数系数乘以 2 的幂(所以浮点数的另一半是指数)。使用MAX_VALUE时,尾数和指数都已达到最大值,因此您会看到一堆移位了很多位。

简而言之,您需要增加MAX_VALUE足以实际影响尾数的值,否则您的附加值会丢失并四舍五入。

Math.pow(2, 969)是不会倾斜的 2 的最低MAX_VALUEInfinity

于 2012-05-31T16:52:17.797 回答