2011-09-04 63 views
4

我試圖在我的程序中遞歸添加一些CGFloat值。我只是在一個特定的場景中意識到生成的總數是不正確的。爲了確保我的程序邏輯沒有任何問題,我創建了一個該場景的簡單示例(請參閱下文),並打印出相同的錯誤值。CGFloat添加bug?

CGFloat arr[3] = {34484000,512085280,143011440}; 
CGFloat sum = 0.0; 
sum = arr[0] + arr[1] + arr[2]; 

NSLog(@"%f",sum); 

int arr1[3] = {34484000,512085280,143011440}; 
int sum1 = 0.0; 
sum1 = arr1[0] + arr1[1] + arr1[2]; 

NSLog(@"%d",sum1); 

第一的NSLog打印689580736.000000 ......而正確的結果689580720.但是第二NSLog的打印正確的結果。我不確定這是一個錯誤還是我做錯了什麼。

謝謝, 穆拉利

回答

11

CGFloat是單精度浮點數在32個目標例如iOS - 它只有一個23位尾數,即約6 - 7顯著數字。如果您需要更高的準確度,請使用雙精度型。

在進一步學習編程之前,您應該先閱讀David Goldberg的What Every Computer Scientist Should Know About Floating-Point Arithmetic

+1

對於正確和詳細的答案+1。 – Till

+1

Paul,謝謝你的回答。我認爲它必須處理一些限制問題。你的筆記澄清了它。我將它從CGFloat改爲double,並打印出正確的結果。同樣基於我剛剛閱讀的其他信息 - 浮點數有7位數限制,雙15/16和小數位數28/29位數限制。感謝這篇文章,我會在閒暇時閱讀它。 –