C++ 关于c++;

C++ 关于c++;,c++,C++,我有以下非常简单的代码- int x=15000 int z=0.7*x cout<<"z = "<<z<<endl; 但是如果我把它改成 int z=0.7*15000 cout<<"z = "<<z<<endl; 我知道这与z将结果转换为int有关 但为什么这两种情况都不同呢 谢谢 编辑- 我使用的是ubuntu的10.10GCC版本,我想这是因为编译器在编译时简化了算术表达式 第一个表达式使用FPU(有限精度)计算

我有以下非常简单的代码-

int x=15000
int z=0.7*x
cout<<"z = "<<z<<endl;
但是如果我把它改成

int z=0.7*15000
cout<<"z = "<<z<<endl;
我知道这与z将结果转换为int有关 但为什么这两种情况都不同呢

谢谢

编辑-
我使用的是ubuntu的10.10GCC版本,我想这是因为编译器在编译时简化了算术表达式


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

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

我只想补充一句:在最后一刻之前,始终保持浮点或双精度计算。这样你就不会失去精确性

尝试将代码更改为:

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

双精度值0.7不能精确表示为浮点数;在大多数机器上,它的十六进制表示形式是3FE666,这小于真实值3FE666。。。因此,0.7*x的双精度结果小于其真实值,并向下舍入。这是正确的行为

intz=0.7*15000


另一方面,编译器足够聪明,可以将0.7*15000表示为7*1500=10500。因此,它使用正确的结果,而不是编译表达式并执行它所得到的结果。

我有10500(gcc 4.2)。。。你在用什么编译器?这就是你的代码吗?这两个建议都不是ops,对解决问题没有任何作用。问题是0.7*x给出的结果与0.7*15000不同。请看下面/上面我的答案。我认为这是一个很好的建议。如果您需要双精度,请将变量保持为双精度。如有必要,将舍入作为最后一步。
z=10500
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;