此代码计算定义为的系列的第N项 Tn + 2 =(Tn + 1)^ 2 + Tn,其中第1和第2项在代码中给出为a和b。
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a,b,n;
char ch[100];
cin>>a>>b>>n;
long double res[3];
res[0]=a,res[1]=b;
for(int i=n-2;i>0;i--)
{
res[2]=res[1]*res[1]+res[0];
res[0]=res[1];
res[1]=res[2];
}
sprintf(ch,"%.0Lf",res[2]);
cout<<ch;
return 0;
}
输入:0 1 10
输出:
84266613096281242861568 // in case of double res[3];
84266613096281243385856 // in case of long double res[3];
correct output : 84266613096281243382112
因为它超出了整数范围,所以我使用的是double / long double。
但问题是我得到的是double和long double的不同输出,而没有一个中间值在小数点后有非零数字,所以我猜不应该有任何舍入。
答案 0 :(得分:1)
虽然没有一个中间值在小数点后有非零数字,所以我猜不应该有任何四舍五入。
这个假设是完全错误的。像double
等所有浮点数都存储为
mantissa * 2^exponent
尾数和指数的位数都是有限的。因此浮点数可以存储固定数量的有效数字(对于转换为十进制表示的double
,通常为16左右)。如果一个数字在小数点前有更多的数字,则会发生舍入,并且总舍入误差越大,您需要“忘记”的位数越多。
如果您想了解更多详细信息,最常见的浮点实现遵循IEEE floating point standard。