Javascript 添加到Number.MAX_值
这个问题的答案可能是显而易见的,但我在Mozilla文档和谷歌上都找不到它 如果你有这样的代码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控制台中玩的时候,我注意到它实际上并没有变成无穷大,直到我加/减了足够多
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)。与:
- 四舍五入即使,应提供最接近无限精确结果的浮点数;如果包含不可表示的无限精确结果的两个最近的浮点数相等,则应交付具有偶数最低有效位的浮点数
- 最接近无限精确结果的浮点数;如果包含不可表示的无限精确结果的两个最接近的浮点数相等,则应交付更大量级的浮点数
- b=2
- emax=1023
- p=53
>>> 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)。与:
- 四舍五入即使,应提供最接近无限精确结果的浮点数;如果包含不可表示的无限精确结果的两个最近的浮点数相等,则应交付具有偶数最低有效位的浮点数
- 最接近无限精确结果的浮点数;如果包含不可表示的无限精确结果的两个最接近的浮点数相等,则应交付更大量级的浮点数
- b=2
- emax=1023
- p=53