2010-12-06 28 views
8

铸造整数一个简单的问题,我有以下代码非常简单 -关于C++

int x=15000 
int z=0.7*x 
cout<<"z = "<<z<<endl; 

我得到的输出

z=10499 

,但如果我将其更改为

int z=0.7*15000 
cout<<"z = "<<z<<endl; 

输出

z=10500 

我知道它与z将结果转换为int 有什么关系,但是为什么两种情况都不一样?

感谢,

编辑 - 我使用Ubuntu的10.10 GCC建立

+0

我有10500(gcc 4.2)...你在用什么编译器?这是你的代码吗? – Vladimir 2010-12-06 12:22:39

回答

4

INT Z = 0.7 * X;

双精度值0.7不能完全表示为浮点数;在大多数机器上它的十六进制表示是3fe6666666666666,它小于真实值3fe6666666666666 ...所以0.7 * x的双精度结果小于它的真实值,并向下取整。这是正确的行为。

int z = 0.7 * 15000;

另一方面,编译器很聪明,可以看到0.7 * 15000完全可以表示为7 * 1500 = 10500.所以它使用正确的结果,而不是通过编译表达式获得的结果并执行它。

6

我想这是因为编译器,是在编译时简化算术表达式。

第一个表达式使用FPU(有限精度)计算,第二个表达式使用预处理器(使用“无限”精度)。尝试在发布模式下运行程序(或使用-O2),结果对于这两个表达式应该是相同的。

3

我认为ruslik对你的问题有正确的答案。

我只是补充一点:始终保持您的计算结果为float或double,直到最后一刻。这样你就不会失去精确度。

试着改变你的代码如下:

double z = 0.7 * 15000.0; 
cout<<"z = "<<z<<endl; // Will need to include some formatting 

int z = (int) (0.7 * 15000.0); 
cout<<"z = "<<z<<endl; 
+1

这两个建议都是没有用的,并且没有办法解决问题。 – TonyK 2010-12-06 12:35:08