添加到Number.MAX_VALUE

Mar*_*ark 13 javascript math floating-point infinity

这个问题的答案可能非常明显,但我无法通过粗略搜索在Mozilla文档或谷歌上找到它.

如果你有这样的代码

Number.MAX_VALUE + 1; // Infinity, right?
Number.MIN_VALUE - 1; // -Infinity, right?
Run Code Online (Sandbox Code Playgroud)

然后我希望将任何东西添加到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
Run Code Online (Sandbox Code Playgroud)

什么是这个"缓冲"的解释Number.MAX_VALUEInfinity

ken*_*ytm 17

标准方式...

在ECMAScript中,实现了两个非零有限数的加法(ECMA-262§11.6.3"将加法运算符应用于数字"):

计算总和并使用IEEE 754舍入到最接近模式四舍五入到最接近的可表示值.如果幅度太大而无法表示,则操作溢出,结果是无穷大的适当符号.

IEEE-754的舍入到最接近模式指定(IEEE-7542008§4.3.1"舍入方向属性为最接近的")

在以下两个舍入方向属性,与大小的无限精确的结果至少b EMAX(b - ½ b 1- p)须轮到∞以符号不变; 这里emaxp由目的地格式决定(见3.3).附:

  • roundTiesToEven,最接近无限精确结果的浮点数应交付 ; 如果包含无法代表的无限精确结果的两个最近的浮点数同样接近,那么具有偶数最低位的数字应该被传递
  • roundTiesToAway,最接近无限精确结果的浮点数应交付; 如果包含无法代表的无限精确结果的两个最接近的浮点数同样接近,则应传递幅度较大的浮点数.

ECMAScript没有指定哪个舍入到最近,但这里没关系,因为两者都给出了相同的结果.ECMAScript中的数字是"双",其中

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

因此结果必须至少为2 1024 - 2 970 ~1.797693134862315 8 ×10 308才能舍入到无穷大.否则,它只会轮MAX_VALUE,因为那比无限较近.

请注意,MAX_VALUE = 2 1024 - 2 971,因此您需要添加至少2 971 - 2 970 = 2 970 ~9.979202×10 291才能获得无穷大.我们可以查看:

>>> Number.MAX_VALUE + 9.979201e291
1.7976931348623157e+308
>>> Number.MAX_VALUE + 9.979202e291
Infinity
Run Code Online (Sandbox Code Playgroud)

同时,你的Math.pow(100,1000)~2 6643.9远远超过2 1024 - 2 970.它已经无限的.

  • @Mark:我发现IEEE 754标准简洁而友好,正如标准所规定的那样.对于处理严重失眠,我建议改为阅读Unicode标准.:-) (2认同)

aps*_*ers 9

如果你看一下Number.MAX_VALUE.toString(2),你会看到二进制表示MAX_VALUE是53个,然后是971个零.这是因为IEEE 754浮点由尾数系数乘以2的幂(因此浮点数的另一半是指数).有了MAX_VALUE,尾数和指数都被最大化,所以你会看到一堆有点向上移位.

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

Math.pow(2, 969)是2的最低功率,不会MAX_VALUE进入Infinity.