此外,在计算大斐波那契数时存在精度误差



我的程序计算以下斐波那契数列:

  • 第77届5527939700884757

  • 第78届8944394323791464

  • 第79 14472334024676220

但显然,如果我加上第 77 和第 78 个数字的最后两位数字,它应该是 1,我无法理解这个问题

long double iterative_fib(int n){
long double firstNumber = 0;
long double secondNumber = 1;
long double thirdNumber = 0;
for (int i = 0;i <n-1;i++)
{
if ( n == 0)
{
cout << "The fibonacci number is: " << n;
}
else
{
thirdNumber = firstNumber + secondNumber;
firstNumber = secondNumber;
secondNumber = thirdNumber;
}
}
return thirdNumber;
}

通过使用long double作为累积数据类型,您将自己打开该类型的精度限制,通常约为 17 位。

由于斐波那契数都是正整数,我会改用unsigned long long来表示整数 - 这适用于2^64-1的有符号整数表示,即至少 19 位精度。

unsigned long long iterative_fib(int n){
unsigned long long firstNumber = 0;
unsigned long long secondNumber = 1;
unsigned long long thirdNumber = 0;
for (int i = 0; i < n-1; i++)
{
thirdNumber = firstNumber + secondNumber;
firstNumber = secondNumber;
secondNumber = thirdNumber;
}
return thirdNumber;
}

返回正确答案,14472334024676221

Ide这里有一个例子

但是,超过 19 位数字,您需要求助于大整数表示库,或者自己滚动。

当使用斐波那契数等数字序列时,如果使用一种方法,尝试将数字存储在特定类型(例如long longunsigned long long(的序列中,最终将无法存储大值,因此需要更改策略。例如,在这种情况下,字符串可用于存储大数字的数字,并且您执行的任何操作都必须按数字进行。另外,与此问题中已解决的问题类似的问题

这里

最新更新