此外,在计算大斐波那契数时存在精度误差
Precision error in addition while calculating large Fibonacci numbers
我的程序计算以下斐波那契数列:
-
第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 long
或unsigned long long
(的序列中,最终将无法存储大值,因此需要更改策略。例如,在这种情况下,字符串可用于存储大数字的数字,并且您执行的任何操作都必须按数字进行。另外,与此问题中已解决的问题类似的问题
相关文章:
- C++模板来检查友元函数的存在
- 既然存在危险,为什么项目要使用-I include开关
- 我们可以访问一个不存在的联盟的成员吗
- 为什么在浮点中从大到小会引入更多的误差
- C++:对不存在的命名空间使用命名空间指令
- C++quit()函数中可能存在作用域问题
- C++擦除(如果存在)
- g++ 说函数不存在,即使包含正确的标头
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 有了gcc,是否可以链接库,但前提是它存在
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- C++Builder中的OnClick事件签名存在问题
- 如何正确地将分支添加到已存在的树中
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 如何检查QList中是否存在值
- 根据某个函数是否存在启用模板
- 如何将分支添加到已存在的TTree:ROOT
- 此外,在计算大斐波那契数时存在精度误差
- 是否存在两个相乘(或除)的数字会引入误差?