2010-08-19 48 views
0

比方說,我正在寫一個「DayData」類,包含高德密集科學應用的NSDecimalNumber?

NSString *symbol; //such as "AAPL" 
NSString *currency; //such as "USD" 
NSDate *day; 
double open; 
double high; 
double low; 
double close; 

最後四個實例變量是開放的,高,低,接近股票的那一天的價格。

假設我使用這個類作爲沿着數十年(即數千天)的歷史數據進行密集蒙特卡羅模擬的基本構建塊類。這意味着我必須在短時間內訪問這些ivars,如果不是數百萬甚至數十億次以儘可能快地進行模擬。

問題:我應該堅持加倍,還是應該使用NSDecimalNumber? NSDecimalNumber速度有多快?有人在這裏測試NSDecimalNumber密集的科學應用程序?

回答

2

NSDecimalNumber更快的將是NSDecimal,它不是Obj-C對象,所以不會產生objc_msgSend的開銷,但仍具有十進制數學的優點。 Here是與NSDecimal一起使用的功能。

+0

嗯。你可能有一些關於如何使用NSDecimal的代碼示例?因爲看起來NSDecimal中的變量是私有的。是通過NSDecimalNumber類創建NSDecimal的唯一方法嗎?這有點令人困惑。 – Enchilada 2010-08-20 05:24:00

+0

@enchilada:是的,不幸的是,它看起來像你必須創建它像'NSDecimal d = [[NSNumber numberWithInt:(some number)] decimalValue]'。但是你可以使用更快的C函數。 – jtbandes 2010-08-20 05:36:52

1

如果你正在處理的美元和美分(但總是整個美分),沒有什麼比一個普通int計數美分,併除以100得到美元更快或更有效。

1

正如jtbandes所說,如果您想要速度,您應該使用NSDecimalNSDecimalNumber是圍繞NSDecimal的Obj-C對象包裝。 NSDecimal是一個用於表示十進制數的結構,它允許您進行不會出現二進制 - >小數舍入和表示錯誤的計算。因爲它是一種模擬,其中最後一盎司的準確度可能無論如何都不重要(大概你的模擬包括近似值,所以微小的誤差不會有太多的影響)。您需要注意浮點計算的缺陷 - 某些類型的操作可能會導致更大的錯誤,尤其是如果兩個浮點數的大小非常不同,或者如果您從另一個非常接近的數中減去一個數。維基百科上的This page涵蓋了一些缺陷。