2017-04-08 71 views
-3

第一代码浮子之间和双

double pi=3.14159,a=100.64; 
cin>>a; 
double sum=(a*a)*pi; 
cout <<fixed<<setprecision(4)<<"Value is="<<sum<<endl; 
return 0; 

值Dfference是= 31819.3103 第二代码

float pi=3.14159,a=100.64; 
float sum=(a*a)*pi; 
cout <<fixed<<setprecision(4)<<"Value="<<sum<<endl; 
return 0; 

值= 31819.3105 为什么是两个值之间的差?

+4

为什么不应该有? – alexeykuzmin0

+3

尝试谷歌它第一? –

+1

从这里开始:http://floating-point-gui.de/ –

回答

1

在这两种floatdouble(和在c++所有其他可用的浮点类型)的值表示在浮点形式:存储x = m * 2^p,值mp被写入到存储器中。

显然,并非所有的实数都可以用这种形式表示(特别是考虑到最大长度为m和是有限的)。所有无法用这种形式表示的数字都被舍入为最近的邻居之一。由于在二进制系统中3.14159和100.64都是无限分数,所以它们都是四舍五入的,当你编写a = 3.14159时,a实际上有点不同。

随后,圆角值的一些表达计算的结果是不准确的,如果我们使用不同的舍入模式可能会有所不同,这就是为什么你看到,你看到的结果。

在大多数体系结构中,使用double获得的值可能更精确,因为double和编译器使用更多数字的尾数。要达到更高的精度,请考虑使用long double

+0

在实践中(和upvoted)是正确的,但C++标准实际上并未强制使用IEEE-754或类似的尾数+指数格式。这是迄今为止最常见的,但没有必要。 – Angew

+0

@Angew感谢您指点 – alexeykuzmin0