NSDecimalNumber用于密集的科学应用?

时间:2010-08-19 01:44:00

标签: objective-c c cocoa scientific-computing montecarlo

假设我正在编写一个包含ivars的“DayData”类

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

最后四个ivars是该日股票的开盘价,最高价,最低价,收盘价。

假设我使用这个类作为几十年(即数千天)历史数据的密集蒙特卡罗模拟背后的基本构建块类。这意味着我必须在短时间内访问这些非常数千万甚至数千甚至数十亿甚至数十亿的数据,以便尽可能快地进行模拟。

问题:我应该坚持加倍,还是应该使用NSDecimalNumber? NSDecimalNumber有多快,真的吗?有没有人在这里测试NSDecimalNumber用于密集的科学应用?

3 个答案:

答案 0 :(得分:2)

NSDecimalNumber更快NSDecimal,这不是一个Obj-C对象,因此不会产生objc_msgSend的开销,但仍然具有十进制数学的优点。 Here是与NSDecimal一起使用的功能。

答案 1 :(得分:1)

如果你正在处理美元和美分(但总是整分美分),没有什么比计算美分的常规int更快或更有效率,除以100来获得美元

答案 2 :(得分:1)

正如jtbandes所说,如果你想要速度,你应该使用NSDecimalNSDecimalNumberNSDecimal周围的Obj-C对象包装器。 NSDecimal是一个用于表示十进制数的结构,它允许您进行不给出二进制>十进制舍入和表示错误的计算。

我会选择double,因为它是一个模拟,最后一盎司的精度可能无论如何都不重要(可能你的模拟包括近似值,所以微小的误差不会有太大的影响) 。您需要注意浮点计算的缺陷 - 某些类型的操作可能会导致更大的错误,特别是如果两个浮点数的幅度非常不同,或者从另一个非常接近的数字中减去一个数字。维基百科上的This page涵盖了一些陷阱。