2015-07-19 27 views
0

该代码正在计算定义为 Tn + 2 =(Tn + 1)^ 2 + Tn的系列的第N项,其中第1项和第2项在代码中作为a和b给出。为什么double和long double在以下程序中给出了不同的答案

#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 

既然是外出整数的范围的,因此,我使用的双/长一倍。

但问题是我得到不同的输出为双和长双,而没有一个中间值是非小数点后的零位,所以不应该有任何舍入,我猜。

+0

你应该看看“浮点”是什么意思。 – melpomene

+0

您似乎对这两种数据类型都存在根本的误解。你是否认为他们都有无限的积分数位,并且只有他们可以表示的“小数位数”的不同?你正在使用哪本书? –

+1

http://floating-point-gui.de/ –

回答

1

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

这个假设显然是错误的。像double等所有浮点数存储像

mantissa * 2^exponent 

了具有有限数量的尾数和指数两者的比特。所以浮点数可以存储固定数量的有效数字(对于double转换为十进制表示,通常大约为16)。如果一个数字在小数点之前有更多数字,则会发生舍入,并且舍入误差越大,您需要“忘记”的数字越多。

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

相关问题