关于在c ++中转换整数的简单问题

时间:2010-12-06 12:18:13

标签: 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版本

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

int z = 0.7 * x;

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

int z = 0.7 * 15000;

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

答案 2 :(得分:3)

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

我只想补充一点:始终保持你的计算浮动或双倍,直到最后一刻。这样你就不会失去精确度。

尝试将代码更改为:

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;