斐波那契数列的结果是无穷大,然后是 NaN
Fibonacci sequence results in infinity, then NaN
我正在尝试编写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
JavaScript
中NaN
。从那一刻起,它一直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)
}
- 让文本输入幻灯片显示输入时的新文本输入?然后向后滑动
- Javascript运行php文件,然后下载文件
- 如何将屏幕分辨率乘以 80%,然后在代码中使用
- 弹出窗口出现,然后退出
- 如何在JQuery函数中定义一个值,然后调用另一个函数并使用该值
- 将值输入到对象,然后该对象推送到数组
- 如何临时暂停浏览器渲染,然后恢复整个页面
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 滚动然后捕捉到顶部而不是取消捕捉
- AngularJS加载JSON数据,然后从中解析/加载HTML
- 有没有一个抽象层,这样我就可以集成一次,然后使用pusher、pubnub或faye
- Canvas+svg路径动画,在路径中的特定点暂停一段时间,然后继续
- 如何为排除无穷大和NaN的数字声明Flow类型
- 如果30秒未单击,请应用CSS一次,将其删除,然后重新迭代
- 点击相同的按钮打开模型,然后提交表单
- ThreeJS将画布中的文本渲染为纹理,然后应用于平面
- 将display属性更改为visible flicks,然后再次消失
- 什么是“;选择“;然后触发事件
- 等待300毫秒,然后使用jQuery向下滑动菜单
- 斐波那契数列的结果是无穷大,然后是 NaN