添加到 Number.MAX_VALUE

IT技术 javascript math floating-point infinity
2021-02-27 02:48:55

这个问题的答案可能非常明显,但我无法通过粗略搜索在 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

2个回答

标准...

在 ECMAScript 中,两个非零有限数的加法实现为(ECMA-262 §11.6.3 "Applying the Additive Operators to Numbers")

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

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

在以下两个舍入方向属性中,幅度至少为b emax ( b − ½ b 1- p )的无限精确结果应舍入到 ∞且符号不变;这里emaxp由目标格式决定(见 3.3)。和:

  • roundTiesToEven,最接近无限精确结果的浮点数将被传递如果括号中不可表示的无限精确结果的两个最接近的浮点数相等,则应传递具有偶数最低有效位的那个
  • roundTiesToAway,传递最接近无限精确结果的浮点数;如果括号中无法表示的无限精确结果的两个最接近的浮点数相等,则应交付数量级较大的浮点数。

ECMAScript 没有指定哪一个舍入到最近,但这里无关紧要,因为两者给出了相同的结果。ECMAScript 中的数字是“double”,其中

  • = 2
  • 最大值= 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

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

那么舍入到最接近的方法是否会进入它?我现在觉得删除我的答案很愚蠢。;-)
2021-04-23 02:48:55
@TJCrowder:因为没有<small>.
2021-04-23 02:48:55
@kennytm,来自问题:Number.MIN_VALUE - 1; // -无穷大,对吧?- 我的理解是否正确,这不应该被视为溢出,它是下溢,并且不应该评估为-Infinity,而是0根据 IEEE-754 标准?
2021-04-29 02:48:55
@Mark:我发现 IEEE 754 标准简短而友好,就像标准一样。为了处理严重的失眠,我建议改为阅读 Unicode 标准。:-)
2021-04-30 02:48:55
直接来自 IEEE-754 的精彩解释!我需要花时间阅读该规范……也许是在我入睡困难的时候。
2021-05-14 02:48:55

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

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

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

谢谢!(为了向未来的观众澄清,@TJ 正在与他自己(现已删除)的答案进行比较,而不是与 Kenny 的新答案进行比较,这很好。)
2021-04-19 02:48:55
+1 用于给出“提示”MAX_VALUEInfinity.
2021-04-22 02:48:55
+1,我也指出了这一点。事实上,我认为这是迄今为止更好的答案。
2021-04-29 02:48:55