首页 > 解决方案 > 计算大斐波那契数时还有精度误差

问题描述

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

但很明显,如果我添加第 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;
}

标签: c++

解决方案


通过使用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

此处为 IdeOne 示例

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


推荐阅读