这个问题的答案可能很痛苦,但我无法从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_VALUEInfinity之间的“缓冲区”的解释是什么?

最佳答案

标准地...
在ECMAScript中,两个非零有限数的加法实现为(ECMA-262§11.6.3“将加法运算符应用于数字”):

IEEE-754的最近舍入模式指定(IEEE-754 2008§4.3.1“最接近的环绕方向属性”)

ECMAScript没有指定最近舍入中的哪一个,但是在这里并不重要,因为两者都给出相同的结果。 ECMAScript中的数字为“双”,其中

  • b = 2
  • emax = 1023
  • p = 53,

  • 因此,结果必须至少为21024-2970〜1.7976931348623158×10308,才能四舍五入为无穷大。否则,它将四舍五入到MAX_VALUE,因为那比Infinity还要近。
    请注意,MAX_VALUE = 21024-2971,因此您至少需要添加2971-2970 = 2970〜9.979202×10291才能获得无穷大。我们可以检查:
    >>> Number.MAX_VALUE + 9.979201e291
    1.7976931348623157e+308
    >>> Number.MAX_VALUE + 9.979202e291
    Infinity
    

    同时,您的Math.pow(100,1000)〜26643.9远远超出了21024-2970。它已经是无穷大。

    10-06 04:47