密集科学应用的NSDecimalNumber?
问题描述:
比方说,我正在写一个“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密集的科学应用程序?
答
比NSDecimalNumber
更快的将是NSDecimal
,它不是Obj-C对象,所以不会产生objc_msgSend
的开销,但仍具有十进制数学的优点。 Here是与NSDecimal
一起使用的功能。
答
如果你正在处理的美元和美分(但总是整个美分),没有什么比一个普通int
计数美分,并除以100得到美元更快或更有效。
答
正如jtbandes所说,如果您想要速度,您应该使用NSDecimal
,NSDecimalNumber
是围绕NSDecimal
的Obj-C对象包装。 NSDecimal
是一个用于表示十进制数的结构,它允许您进行不会出现二进制 - >小数舍入和表示错误的计算。因为它是一种模拟,其中最后一盎司的准确度可能无论如何都不重要(大概你的模拟包括近似值,所以微小的误差不会有太多的影响)。您需要注意浮点计算的缺陷 - 某些类型的操作可能会导致更大的错误,尤其是如果两个浮点数的大小非常不同,或者如果您从另一个非常接近的数中减去一个数。维基百科上的This page涵盖了一些缺陷。
嗯。你可能有一些关于如何使用NSDecimal的代码示例?因为看起来NSDecimal中的变量是私有的。是通过NSDecimalNumber类创建NSDecimal的唯一方法吗?这有点令人困惑。 – Enchilada 2010-08-20 05:24:00
@enchilada:是的,不幸的是,它看起来像你必须创建它像'NSDecimal d = [[NSNumber numberWithInt:(some number)] decimalValue]'。但是你可以使用更快的C函数。 – jtbandes 2010-08-20 05:36:52