在以下代码中:
#include <cstdint>
#include <cinttypes>
#include <cstdio>
using namespace std;
int main() {
double xd = 1.18;
int64_t xi = 1000000000;
int64_t res1 = (double)(xi * xd);
double d = xi * xd;
int64_t res2 = d;
printf("%" PRId64"\n", res1);
printf("%" PRId64"\n", res2);
}
使用针对32位Windows的v4.9.3 g++ -std=c++14
我得到输出:
1179999999
1180000000
这些值是否允许不同?
我预计,即使编译器使用比double
更高的内部精度来计算xi * xd
,它也应该一致地执行此操作。浮动转换中的精确度丢失是实现定义的,并且此计算的精度是实现定义的 - [c.limits] / 3表示{{1}应该从C99导入。我以为我不应该允许它在一行上使用FLT_EVAL_METHOD
的不同精度而不是在另一行上使用不同的精度。
注意:这是故意的C ++问题,而不是C问题 - 我相信这两种语言在这个领域有不同的规则。