c++ - 计算大斐波那契数时还有精度误差
问题描述
我的程序计算以下斐波那契数列:
但很明显,如果我添加第 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 位。
由于斐波那契数都是正整数,我将改为使用 aunsigned 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
但是,超过 19 位数字,您将需要求助于大整数表示库,或者自己滚动。