为什么double和long double在以下程序中给出不同的答案

时间:2015-07-19 14:02:49

标签: c++

此代码计算定义为的系列的第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的不同输出,而没有一个中间值在小数点后有非零数字,所以我猜不应该有任何舍入。

1 个答案:

答案 0 :(得分:1)

  

虽然没有一个中间值在小数点后有非零数字,所以我猜不应该有任何四舍五入。

这个假设是完全错误的。像double等所有浮点数都存储为

mantissa * 2^exponent

尾数和指数的位数都是有限的。因此浮点数可以存储固定数量的有效数字(对于转换为十进制表示的double,通常为16左右)。如果一个数字在小数点前有更多的数字,则会发生舍入,并且总舍入误差越大,您需要“忘记”的位数越多。

如果您想了解更多详细信息,最常见的浮点实现遵循IEEE floating point standard