使用fibonacci和GoldenRatio未正确舍入



不是另一个斐波那契问题吗?

这些代码适用于较低的数字,但随着我在序列中的位置越来越高,计算就结束了。有人看到我做错了什么吗?

#include <iostream>
#include <math.h>
using namespace std;
/* 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597,
2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811 */
int main()
{
const double goldenRatio = 1.618034;
const double oneMinusGoldenRatio = 1 - goldenRatio;
const float squareOfFive = sqrt(5);
double fib;
int result;
int testNumber = 10;
fib = (pow (goldenRatio,testNumber) - ( - (pow (oneMinusGoldenRatio, testNumber)))) / squareOfFive;
printf ("The Fibonacci sequence for %i equals %lf",testNumber,fib);
}

我认为您的Binet公式有点错误。我正在阅读你的代码以计算

CCD_ 1。

这应该是

CCD_ 2。

我认为在你的版本中,如果你省略了-((1-phi)^n)中的前导减号,那么这与(-phi)^(-n)相同,因为根据黄金比例的定义,1 - phi等于-(1/phi),但我可能在那里弄错了代数。在任何情况下,下面都会打印出代码注释中列出的fibonacci值:

#include <iostream>
#include <cmath>
/* 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597,
2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811 */
double fibo(double n) {
const double sqrtOfFive = std::sqrt(5.0);
const double goldenRatio = (1.0 + sqrtOfFive) / 2.0;
return (std::pow(goldenRatio, n) - ((std::pow(-goldenRatio, -n)))) / sqrtOfFive;
}
int main()
{
for (int i = 1; i <= 28; i++) {
std::cout << i << " => " << fibo(i) << "n";
}
}

不过请注意,正如其他人所说,浮点数具有有限的精度和有限的边界。当您处理指数级快速增长的函数时,您会比预期更快地溢出标准浮点类型。运行上面的28增加到30以上看看我的意思。

这就是浮点运算的本质。我在这个答案中讨论了更多。