这个for
循环是否会停止?
for (var i=0; 1/i > 0; i++) {
}
如果是这样,何时和为什么?
发布于 2018-03-26 16:32:07
该条件1/i > 0
将始终评估为真:
1/0
评估,以Infinity
和Infinity > 0
为真1/i > 0
对所有人都是真的i < Infinity
,i++
永远不会到达Infinity
。为什么i++
永远不会到达Infinity
?由于Number
数据类型的精确度有限,因此存在以下值i + 1 == i
:
9007199254740992 + 1 == 9007199254740992 // true
一旦i
达到该值(对应于),它将保持不变。Number.MAX_SAFE_INTEGER
+ 1i++
因此我们有一个无限循环。
为什么9007199254740992 + 1 == 9007199254740992
?
JavaScript的Number
数据类型实际上是一个64位IEEE 754双精度浮点数。每个Number
分解和存储为三部分:1位符号,11位指数和52位尾数。它的值是-1 符号 ×尾数×2 指数。
如何9007199254740992代表?由于1.0×2 53或二进制:
增加尾数的最低位,我们得到下一个更高的数字:
该号码的值为1.00000000000000022 ...×2 53 = 9007199254740994
那是什么意思?Number
可以是900719925474099 2或900719925474099 4,但两者之间没有任何关系。
现在,我们选择哪一个代表900719925474099 2 + 1?在IEEE 754舍入规则给出了答案:900719925474099 2。
https://stackoverflow.com/questions/-100004310
复制相似问题