斐波那契数列的结果是无穷大,然后是 NaN

Fibonacci sequence results in infinity, then NaN

本文关键字:无穷大 然后 NaN 结果是 数列      更新时间:2023-09-26

我正在尝试编写JavaScript斐波那契数列,因为我从未尝试过这样做,想出了一个简单的迭代公式来计算它。然后我决定通过执行 10000 次迭代来测试运行它以查看结果。令我惊讶的是,它一直工作到 1476 次迭代,然后坏了。1477年和1478年都给出了"无穷大"的结果。我尝试了不同的浏览器,更改了显示方法,但最终得到了相同的结果。

1475i - 1.3069892237633983e+3081476i - 无限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>

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

第 1477 个斐波那契数太大,无法用 Javascript 表示。"溢出"会导致您的号码变得Infinity

Infinity - 1476thFibonacciNumber在以下y计算中仍Infinity

然后在下一次迭代中,您将Infinity - Infinity JavaScriptNaN。从那一刻起,它一直NaN到最后。

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

对于 N 的大值,斐波那契级数可以近似为

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.因此,即使您再次减去最后一个数字,您也不会回到"真实"数字。这就是处理溢出的方式。

关于 JavaScript 中的斐波那契数列。MDN有一个使用生成器的很好的例子:

// 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)
}