铸造整数一个简单的问题,我有以下代码非常简单 -关于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建立
铸造整数一个简单的问题,我有以下代码非常简单 -关于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建立
INT Z = 0.7 * X;
双精度值0.7不能完全表示为浮点数;在大多数机器上它的十六进制表示是3fe6666666666666,它小于真实值3fe6666666666666 ...所以0.7 * x的双精度结果小于它的真实值,并向下取整。这是正确的行为。
int z = 0.7 * 15000;
另一方面,编译器很聪明,可以看到0.7 * 15000完全可以表示为7 * 1500 = 10500.所以它使用正确的结果,而不是通过编译表达式获得的结果并执行它。
我想这是因为编译器,是在编译时简化算术表达式。
第一个表达式使用FPU(有限精度)计算,第二个表达式使用预处理器(使用“无限”精度)。尝试在发布模式下运行程序(或使用-O2
),结果对于这两个表达式应该是相同的。
我认为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;
这两个建议都是没有用的,并且没有办法解决问题。 – TonyK 2010-12-06 12:35:08
我有10500(gcc 4.2)...你在用什么编译器?这是你的代码吗? – Vladimir 2010-12-06 12:22:39