有人可以阐明这段代码的行为方式:
double x = 9223371036854;
int64_t y1 = /* trunc */ (x * 1000000);
int64_t y2 = round(x * 1000000);
cout << y1 << " <= " << y2 << endl;
assert( y1 <= y2 ); // fail
由于y1
实际上等于9223371036854000000
while y2
is ,此代码失败9223371036853999616
。
取消注释后trunc
一切正常(断言已验证)。
由 gcc-4.6.3-1ubuntu5 编译,带有g++ --std=c++0x x.cpp
.
为什么int64_t(round(x * 1000000))
小于int64_t(x * 1000000)
哪里x
是double
?
为什么结果int64_t(trunc(x * 1000000))
不同int64_t(x * 1000000)
?