C ++标准是否允许这种浮点行为?

时间:2015-12-21 05:07:06

标签: c++ floating-point language-lawyer c++14

在以下代码中:

#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问题 - 我相信这两种语言在这个领域有不同的规则。

0 个答案:

没有答案