如果有足够的时间,此循环会结束吗?
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]
k
是多少? (至少k = 1e304
会)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。