为什么(1UL <&lt;&lt; 53)加1.0不等于自己?

时间:2015-11-21 14:38:06

标签: c++ floating-point

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,可以正确地生成结果。

我认为这可能是浮动不精确。有人可以给我更多细节吗?

2 个答案:

答案 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)

x+= 1.0;

表达式x + 1.0使用浮点运算完成。

假设使用了IEEE-754double precision floating point type可以精确地表示最多2 53 的整数。