在以下代码中:
#include#include #include 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); }
使用g++ -std=c++14
针对32位Windows的v4.9.3 获取输出:
1179999999 1180000000
这些值是否允许不同?
我期望,即使编译器使用比double
计算更高的内部精度xi * xd
,它也应该一致地执行此操作.浮动转换中的精确度丢失是实现定义的,并且该计算的精度也是实现定义的 - [c.limits]/3表示FLT_EVAL_METHOD
应该从C99导入.IOW我希望不允许xi * xd
在一行上使用不同的精度而不是在另一行上使用不同的精度.
注意:这是故意的C++问题,而不是C问题 - 我相信这两种语言在这个领域有不同的规则.