Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 添加到Number.MAX_值_Javascript_Math_Floating Point_Infinity - Fatal编程技术网

Javascript 添加到Number.MAX_值

Javascript 添加到Number.MAX_值,javascript,math,floating-point,infinity,Javascript,Math,Floating Point,Infinity,这个问题的答案可能是显而易见的,但我在Mozilla文档和谷歌上都找不到它 如果你有这样的代码 Number.MAX_VALUE + 1; // Infinity, right? Number.MIN_VALUE - 1; // -Infinity, right? 然后,我希望向Number添加任何内容。MAX_值将把它推到无穷大。结果就是Number.MAX\u VALUE朝我吐了一口唾沫 然而,当我在Chrome JS控制台中玩的时候,我注意到它实际上并没有变成无穷大,直到我加/减了足够多

这个问题的答案可能是显而易见的,但我在Mozilla文档和谷歌上都找不到它

如果你有这样的代码

Number.MAX_VALUE + 1; // Infinity, right?
Number.MIN_VALUE - 1; // -Infinity, right?
然后,我希望向Number添加任何内容。MAX_值将把它推到无穷大。结果就是
Number.MAX\u VALUE
朝我吐了一口唾沫

然而,当我在Chrome JS控制台中玩的时候,我注意到它实际上并没有变成无穷大,直到我加/减了足够多:

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

这个介于
Number.MAX\u VALUE
无穷大之间的“缓冲区”的解释是什么?

如果你看
Number.MAX\u VALUE.toString(2)
,你会发现
MAX\u VALUE
的二进制表示是53个1后跟971个0。这是因为IEEE 754浮点数由尾数系数乘以2的幂构成(因此浮点数的另一半是指数)。使用
MAX\u VALUE,尾数和指数都会最大化,因此您会看到一堆的值会大幅上移

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


Math.pow(2969)
是2的最小幂,它不会将
MAX_值
变为
无穷大
如果你看
Number.MAX_值.toString(2)
,你会发现
MAX_值
的二进制表示是53个1,后面跟着971个零。这是因为IEEE 754浮点数由尾数系数乘以2的幂构成(因此浮点数的另一半是指数)。使用MAX\u VALUE,尾数和指数都会最大化,因此您会看到一堆的值会大幅上移

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

Math.pow(2969)
是2的最低幂,它不会将
最大值
倾斜到
无穷大

标准值

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

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

IEEE-754的四舍五入至最近模式规定(IEEE-754 2008§4.3.1“四舍五入方向属性至最近”)

在以下两个舍入方向属性中,一个数值至少为bemax(b)的无限精确结果− ½b1-p)应四舍五入至∞符号无变化;此处,emax和p由目标格式确定(见3.3)。与:

  • 四舍五入即使,应提供最接近无限精确结果的浮点数;如果包含不可表示的无限精确结果的两个最近的浮点数相等,则应交付具有偶数最低有效位的浮点数
  • 最接近无限精确结果的浮点数;如果包含不可表示的无限精确结果的两个最接近的浮点数相等,则应交付更大量级的浮点数
ECMAScript没有指定哪一轮最接近,但在这里这并不重要,因为两者给出相同的结果。ECMAScript中的数字为“double”,其中

  • b=2
  • emax=1023
  • p=53
因此,结果必须至少为21024-2970~1.7976931348623158×10308才能四舍五入到无穷大。否则它只会四舍五入到MAX_值,因为它比无穷大更接近

请注意,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(1001000)
~26643.9远远超过21024-2970。它已经是无限的了。

标准的

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

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

IEEE-754的四舍五入至最近模式规定(IEEE-754 2008§4.3.1“四舍五入方向属性至最近”)

在以下两个舍入方向属性中,一个数值至少为bemax(b)的无限精确结果− ½b1-p)应四舍五入至∞符号无变化;此处,emax和p由目标格式确定(见3.3)。与:

  • 四舍五入即使,应提供最接近无限精确结果的浮点数;如果包含不可表示的无限精确结果的两个最近的浮点数相等,则应交付具有偶数最低有效位的浮点数
  • 最接近无限精确结果的浮点数;如果包含不可表示的无限精确结果的两个最接近的浮点数相等,则应交付更大量级的浮点数
ECMAScript没有指定哪一轮最接近,但在这里这并不重要,因为两者给出相同的结果。ECMAScript中的数字为“double”,其中

  • b=2
  • emax=1023
  • p=53
所以结果一定是