在下面的代码: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
难道这些值允许不同?
我预计,即使编译器使用更高的内部精度比double
为xi * xd
计算,就应该始终如一地做到这一点。浮点转换中的精度损失为实现定义的,并且此计算的精度为实现定义的 - [c.limits]/3表示FLT_EVAL_METHOD
应该从C99导入。 IOW我预计它不应该被允许在一条线上使用不同于另一条线上的xi * xd
的精度。
注意:这是故意的C++问题而不是C问题 - 我相信这两种语言在这方面有不同的规则。
请注意,您需要将'xi * xd'作为'long double'并将'long double'中的整数转换为这个错误; 1e9 * 1.18比1.18e9大约1/4 ulp。 – tmyklebu
相关:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=323#c127 – Nemo