【问题标题】:JavaScript: Why is this causing an infinite loop?JavaScript:为什么这会导致无限循环?
【发布时间】:2015-11-23 22:24:32
【问题描述】:

我试图通过找到 JavaScript 数字线环绕的点来找到最大的数字。例如,如果它只能保存数字0, 1, 127,那么我会通过使用“127 + 1 = 0”这一事实找到127。所以我做了一个函数

function getLargestNumber ( ) 
{
   var somethingBig = 12939123, last = (somethingBig - 1);
   while ( ++somethingBig > ++last );
   return last;
}

但这会导致无限循环(或由于其他原因导致浏览器崩溃)。

我的函数逻辑有什么问题吗?

【问题讨论】:

    标签: javascript algorithm bit-manipulation integer-overflow


    【解决方案1】:

    JavaScript 数字始终存储为浮点数,而不是 C 中的整数。浮点数不会像 C 整数那样“环绕”。

    这可能会帮助你What is JavaScript's highest integer value that a Number can go to without losing precision?

    【讨论】:

    • 当数字变得如此之大以至于精度不包括最低位时,它最终应该停止。
    • @Barmar 如果它最终停止,那么我应该寻找somethingBig + 1 = somethingBig 的点吗?
    • 是的,但这不是 JavaScript 数字可以达到的最大值。它只是整数精度开始丢失之前的最大数字。
    • @SubparWebDev 正确。以 100 万次迭代/秒计算,这将需要大约 285 年。
    • @SubparWebDev 你想完成什么?
    【解决方案2】:

    看起来 while 循环将永远运行,因为您总是在递增 somethingBig 和 last,因此 somethingBig 总是会更大:

    while ( ++somethingBig > ++last );
    

    我不确定您要完成什么,但这将是无限循环的原因。

    希望这会有所帮助!

    【讨论】:

    • 他希望somethingBiglast 之前溢出并回绕到 0。
    • @Barmar 不一定为零……可能是最小的负数。
    • 谢谢@Barmar,不幸的是,它需要的时间比预期的要长一点:)
    • @SubparWebDev 对,我在想无符号数。
    猜你喜欢
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2012-09-27
    • 2011-07-31
    相关资源
    最近更新 更多