说
int64_t x = (1UL << 53);
cout << x << end;
x+= 1.0;
cout << x << end;
x的结果相同,即&#39; 9007199254740992&#39;
但是,x += 1;
可以正确地使x加1。
此外,对于1UL << 52
加1.0,可以正确地生成结果。
我认为这可能是浮动不精确。有人可以给我更多细节吗?
答案 0 :(得分:3)
行x+= 1.0
评估为
x = (int64_t)((double)x + (double)1.0);
数字2^53 + 1 = 9007199254740993
无法完全表示为IEEE double
,因此它会四舍五入为2^53 = 9007199254740992
(这实际上取决于当前的舍入模式)然后(无损)转换为int64_t
。
答案 1 :(得分:2)