首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >for(var i = 0; 1 / i> 0; i ++){}这个'for'循环是否停止,为什么?为什么不呢?

for(var i = 0; 1 / i> 0; i ++){}这个'for'循环是否停止,为什么?为什么不呢?
EN

Stack Overflow用户
提问于 2018-03-26 06:50:03
回答 2查看 0关注 0票数 0

这个for循环是否会停止?

代码语言:javascript
复制
for (var i=0; 1/i > 0; i++) {
}

如果是这样,何时和为什么?

EN

Stack Overflow用户

发布于 2018-03-26 16:32:07

该条件1/i > 0将始终评估为真:

  • 最初,它因为是真实的1/0评估,以InfinityInfinity > 0为真
  • 它保持真实,因为1/i > 0对所有人都是真的i < Infinityi++永远不会到达Infinity

为什么i++永远不会到达Infinity?由于Number数据类型的精确度有限,因此存在以下值i + 1 == i

代码语言:javascript
复制
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

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100004310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档