启用优化选项后,GCC给出了错误的答案

5

我有下面这个C程序

double d = 1.4;
int x;
x = d * 10;
printf("\n\n VALUE = %d " ,x);

我有Ubuntu 9.04自带的gcc 4.3.3

使用-O0编译时,结果为13,但使用更高级别的优化后,得到正确的答案14。

这是已知的问题还是我的代码有问题?

4个回答

9

使用double不能精确表示1.4,实际值可能略大或略小(请参见此处)。因此,没有“正确”的答案-应该使用round()而不是隐式截断。


9

这是gcc Bug #323,事实上这并不是一个bug而是一些实现细节。


4

在更高级别的优化中,GCC可能会将两个变量都优化掉,并预先计算要打印的值。在没有进行任何优化的情况下,d的值(以及打印值)将受到浮点数表示的影响,可能不完全等于1.4。尝试这样做:

double d = 1.4;
int x;
x = d * 10;
printf("Old = %lf, New = %d\n", d, x);

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接