计算大的斐波纳契数时,精度误差

时间:2018-06-10 06:40:12

标签: c++

我的程序计算以下Fibonacci序列:

  • enter image description here 5527939700884757

  • 77th 8944394323791464

  • 78th 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;
}

2 个答案:

答案 0 :(得分:4)

通过使用long double作为累积数据类型,您可以达到类型的精度限制,通常在17 digits左右。

由于斐波纳契数都是正整数,我宁愿使用unsigned long long来表示整数 - 这对于2^64-1的有符号整数表示是有利的,即至少19位精度。< / p>

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 example here

但是,除了19位数之外,您还需要求助于Big Integer representation库,或者自己动手。

答案 1 :(得分:1)

当处理数字序列(如Fibonacci数)时,如果使用某种方法尝试将数字存储在特定类型的序列中,例如long longunsigned long long,最终会变得无法存储大值,因此需要改变策略。在这种情况下,例如,字符串可用于存储大数字的数字,并且您执行的任何操作都必须是数字方式。此外,问题类似于this question here

中提到的问题