我有以下非常简单的代码 -
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 :(得分: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;