如果有足够的时间,此循环会结束吗?

for (let i = 0; 1 / i > 0; i++) {} // js code [0]

我想当i达到Number.POSITIVE_INFINITY时会这样,但不知道如何测试。

编辑:
for (let i = 0; 1 / i > 0; i += k) {} // js code [1]
  • 使 js代码[1] 完成的最小正数k是多少? (至少k = 1e304会)
  • 假设问题1的答案为K,大于K的任何数字是否可以保证 js代码[1] 的完成?
  • 最佳答案

    完整的最小k是2970 + 2918,它是99792015476736012741097286856294782669414255366625564959401511947947042067389340492492467467434984329062728450562916055870043158146546417572037761167336846677767767547677547604320760784654760760784679760-637654760-825760-760760-760-760-760-760-760-760-760-760-760-760-760-230-760

    JavaScript是ECMAScript的方言,它指定它使用64位(二进制)IEEE-754浮点格式,具有从最近到最近的关系到偶数。以这种格式,最大的有限数在从21023(含)到21024(不含)的binade中。由于浮点数的有效位(分数部分)具有53位,因此这些数的最低有效位的位置值为21023-52 =2971。这称为最低精度单位(ULP)。 (ULP是浮点数指数的函数;它随该数字缩放。)

    计算for (let i = 0; 1 / i > 0; i += k) {}时,结果将四舍五入到最接近的可表示数字。如果i+k小于k的1/2 ULP,那么最接近i + i的数学值的可表示数字是k,因此执行i时不会发生任何变化。如果i = i+k恰好是k的½ULP,则i + i的数学值恰好在k和下一个可表示值之间的一半。根据四舍五入原则,如果i的低位为零,则四舍五入;如果为零,则四舍五入。因此,如果i恰好是最大有限浮点数的½ULP,则k将不会对其中的一半产生任何变化,因此循环不会继续进行。

    如果i = i+k超过k的½ULP,则i + i的数学值比k更接近下一个可表示的值,因此结果是i加一个ULP,因此循环继续进行。 (在特殊情况下,i是可表示的最大有限值,加法将产生无穷大,由于i将为零,因此加法将结束循环。)

    如上所述,最大值的ULP为2971。1/ 2 ULP为2970。我们需要1 / i使其比此值大尽可能小的值,因此我们要向其添加一个ULP。 (一个规模的ULP,而不是最大数量的ULP。)2970的ULP为2970-52 = 2918。

    因此,导致循环终止的最小正k是2970 + 2918。

    09-18 09:23