2011-09-22 64 views
1

我正在爲iphone和ipad編寫應用程序,我的程序需要添加兩個double值才能獲得單個double值。問題是當其中一個double值相當大(例如:2^100),另一個非常小時如1或2,添加這兩個double值的結果是錯誤的,或者甚至沒有進行加法。有誰知道這是爲什麼,如果有解決方法。謝謝。在目標c中添加兩個double值的問題

回答

6

這與obj-c無關。 A double是一個存儲浮點值的64位數據類型。在十進制中,double可以保存大約15.955位的精度。但是,您的2^100號碼有大約30位十進制數字。因此,如果您嘗試添加高達約1千萬億次的任何數據,您會發現添加不起作用,因爲這超出了數字的精確範圍。

爲了解決這個問題,你可以使用NSDecimalNumber,它可以保存38位精度的十進制數字。

+0

有趣的是,當我添加2^100與另一個2^100一切正常,但是當我添加2^100像1這樣的小數字它保持不變,並且不添加1到2^100這就是我不明白的地方。 – Milad

+0

@Milad:2^100 + 2^100可以正常工作。認爲雙重作爲科學記數法(因爲這基本上是它是什麼,除了二進制)。谷歌說2^100是1.2676506×10^30。如果你以「常規」的形式寫出來,你會注意到很多0。但是真實的數字並不包含所有這些0。科學記數法碰到了一個精確的限制 - 你會注意到小數點後面只有7位數字。這是因爲一個float大約有7個十進制數字的精度。如果這是一倍,那麼大概是15。 –

+0

@Milad:我希望很明顯爲什麼加2^100 + 2^100很容易,因爲1.2676506×10^30加1.2676506×10^30很容易(你會得到2.5353012×10^30)。但是如果你添加1,你將如何寫出來?如果不在數字中添加另外的23位數字,那麼這些數字就沒有空間了。基本上,當你寫2^100時,你得到的是一個代表該區域大約1千萬億的數字的數字,因爲任何計算任何這些數字的嘗試都會返回2^100的相同結果。 –