2016-12-21 136 views
0

在32位系統上,我發現下面的操作總是返回正確的值,但返回的是隨機結果,其中a更大。32位系統中整數和浮點數之間的數學運算

uint64_t a = 14227959735; 
uint64_t b = 32768; 
float c = 256.0; 
uint64_t d = a - b/ c; // d returns 14227959808 

我相信這裏的問題是,INT-漂浮的操作返回未定義的行爲,但也有人有助於解釋爲什麼它給出這樣的價值呢?

+0

浮點計算只能精確到7位http://stackoverflow.com/questions/9765744/precision-in-c-floats – pm100

+1

沒有什麼隨機或未定義的,並且你得到的結果是非常接近正確的(關閉一億分之一)。這只是一個舍入誤差。如果你使用'double'而不是'float',你會得到確切的結果,儘管對於更大的輸入值你仍然可以得到舍入誤差。 –

+0

有大量的問題可能是重複的;我選擇的那個人的優點是成爲最老的人之一(它有很好的答案)。順便說一句,在64位系統上的結果是一樣的;問題是'float'(幾乎總是)使用4個字節,它不會給出很多精度的十進制數字。 –

回答

2

整個計算都是浮點運算,然後轉換爲64位整數。但是浮動不能準確表示大整數,除非它們碰巧是兩個冪。