在以下代码中:
这些值可以不同吗?
我期望即使编译器在计算xi * xd时使用比double更高的内部精度,它也应该始终如一地这样做。浮点转换中的精度损失是“实现定义的”,并且此计算的精度也是“实现定义的” - [c.limits] / 3表示应该从C99导入FLT_EVAL_METHOD。我希望不允许在一行上使用与另一行不同的精度来计算xi * xd。
注意:这是一个有意的C++问题,而不是C问题 - 我相信这两种语言在此领域有不同的规则。
#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);
}
使用v4.9.3版本的g++ -std=c++14
,目标为32位Windows,在此情况下我得到以下输出:
1179999999
1180000000
这些值可以不同吗?
我期望即使编译器在计算xi * xd时使用比double更高的内部精度,它也应该始终如一地这样做。浮点转换中的精度损失是“实现定义的”,并且此计算的精度也是“实现定义的” - [c.limits] / 3表示应该从C99导入FLT_EVAL_METHOD。我希望不允许在一行上使用与另一行不同的精度来计算xi * xd。
注意:这是一个有意的C++问题,而不是C问题 - 我相信这两种语言在此领域有不同的规则。
xi * xd
计算为long double
并从long double
转换为整数才能出错;1e9 * 1.18 最终与 1.18e9 相差约 1/4 ulp。 - tmyklebu