0

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

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

最后四个 ivars 是该股票当天的开盘价、最高价、最低价、收盘价。

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

问题:我应该坚持加倍,还是应该仍然使用 NSDecimalNumber?NSDecimalNumber 到底有多快?这里有没有人为密集的科学应用测试过 NSDecimalNumber?

4

3 回答 3

2

NSDecimalNumber比将要快NSDecimal,它不是 Obj-C 对象,因此不会产生 的开销objc_msgSend,但仍然具有十进制数学的优点。以下是与NSDecimals 一起使用的函数。

于 2010-08-19T02:27:56.723 回答
1

如果您正在处理美元和美分(但总是整美分),没有什么比定期int计算美分并除以 100 得到美元更快或更有效的了。

于 2010-08-19T02:43:46.737 回答
1

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

我会选择double,因为它是一个模拟,最后一盎司的准确度可能无论如何都无关紧要(大概你的模拟包括近似值,所以微小的错误不会产生太大的影响)。您需要注意浮点计算的陷阱——某些类型的运算可能会导致更大的错误,特别是如果两个浮点数的大小非常不同,或者如果您从另一个非常接近的数字中减去一个数字。维基百科上的这个页面涵盖了一些陷阱。

于 2010-08-19T02:44:12.703 回答