【发布时间】:2010-06-03 04:34:46
【问题描述】:
有人可以解释这种行为吗?
test.c:
#include <stdio.h>
int main(void)
{
printf("%d, %d\n", (int) (300.6000/0.05000), (int) (300.65000/0.05000));
printf("%f, %f\n", (300.6000/0.05000), (300.65000/0.05000));
return 0;
}
$ gcc test.c
$ ./a.out
6012, 6012
6012.000000, 6013.000000
我检查了汇编代码,它把第一个 printf 的两个参数都设置为 6012,所以这似乎是一个编译时错误。
【问题讨论】:
-
搜索精度/舍入
-
如果是精度/舍入误差,第二行不是也都为 6012 吗?正如我所说,第一行的程序集中有 6012,所以编译器在编译时计算它。
-
在如此简单的代码中找到编译器错误是非常非常不可能的。
-
足够高 (> 6012.999999) printf 打印 6013.000000,但仍介于 6012 和 6013 之间,因此截断为 6012。
标签: c gcc compiler-construction