簡體   English   中英

為什么(1UL << 53)加1.0不等於自身?

[英]Why (1UL <<53) plus 1.0 does not equal to itself?

int64_t x = (1UL << 53);
cout << x << end;
x+= 1.0;
cout << x << end;

x的結果相同,即為'9007199254740992'。

但是, x += 1; 可以使x加1正確。

此外,對於1UL << 52加1.0可以正確得出結果。

我認為可能是浮動不精確。 有人可以給我更多細節嗎?

x+= 1.0的計算方式為

x = (int64_t)((double)x + (double)1.0);

數字2^53 + 1 = 9007199254740993不能完全表示為IEEE double ,因此將其舍入為2^53 = 9007199254740992 (實際上,這取決於當前的舍入模式),然后將其無損地轉換為int64_t

x+= 1.0;

x + 1.0表達式是使用浮點算法完成的。

假設使用IEEE-754 ,則雙精度浮點類型最多可以精確表示2 53個整數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM