Fibonacci序列导致无穷大,然后是NaN

时间:2013-12-13 22:18:49

标签: javascript html linear-algebra

我正在玩写一个javascript Fibonacci序列,因为我从未尝试这样做,想出了一个简单的迭代公式来计算它。然后我决定通过10000次迭代测试运行它来查看结果。令我惊讶的是,它一直工作到第1476次迭代,然后破裂了。 1477和1478都给出了结果" Infinity"。我尝试过不同的浏览器,改变显示方法,但结果却相同。

1475i - 1.3069892237633983e + 308 1476i - 无限 1477i - 无限 1478i - NaN

使用的代码:

<!DOCTYPE html><html><head><script>
function fibonacci(){
var x = 1;
var y = 0;
  for(i=0;i<1478;i++){
    var box = document.createElement('div');
    box.setAttribute('id','box'+i);
    document.body.appendChild(box);
    document.getElementById('box'+i).innerHTML = [i] + 'i - ' + x;
        x = x + y;
    y = x - y;
  }
}
</script></head><body onLoad="fibonacci();"><div id="output"></div></body></html>

我不确定那时候某个功能是否破裂,或者我可能没有在序列中考虑到这一点。是的,我意识到我跳过了第一个整数,但这不应该影响函数。

4 个答案:

答案 0 :(得分:4)

第1477个Fibonacci数字太大而无法用Javascript表示。 “溢出”会导致您的号码变为Infinity

在以下Infinity - 1476thFibonacciNumber计算中,

Infinity仍为y

然后在下一次迭代中,您Infinity - Infinity NaN JavaScript。从那时起,它一直到NaN

答案 1 :(得分:3)

Javascript可以处理的最大值是1.7976931348623157e + 308。如果您的代码生成大于此值的任何内容,它将会中断。

答案 2 :(得分:1)

对于N的大值,Fibonacci系列可以近似为

F(N) = math.pow(phi, N) / math.sqrt(5) 

(参考:http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibFormula.html#fibround

其中phi是黄金比例:(sqrt(5)+1)/ 2

您现在可以找出可以使用以下内容计算出的最大斐波纳契数:

phi = (math.sqrt(5)+1)/2
fibMax = math.floor(log(1.79769)/log(phi) +  math.log(math.sqrt(5)))

上面的答案是...... 1475 - 这是你能够在没有溢出的情况下计算出来的最大数字。

底线 - 一旦你的计算溢出,它将继续这样做。 Infinity + anything = Infinity,有趣的是Infinity - anything = still infinity。并infinity + infinity = NaN。因此,即使您再次减去最后一个数字,也不会回到“真实”数字。这就是如何处理溢出。

答案 3 :(得分:0)

关于JavaScript中Fibonacci序列的主题。 srcdoc有一个使用生成器的好例子:

// Declare generator
function* fibonacci() {
    let n0;
    let n1 = 0
    let n2 = 1
    while (true) {
        n0 = n1
        n1 = n2
        n2 = n0 + n1
        yield n0
    }
}

// Create generator
var y = fibonacci()

// Print them out
for (let x = 0; x < 1477; x++) {
    console.log(x + 1, " ", y.next().value)
}