NSDecimalNumber для интенсивных научных приложений? - PullRequest
0 голосов
/ 19 августа 2010

Допустим, я пишу класс "DayData", содержащий ивары

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

Последние четыре ивара - это цены открытия, максимума, минимума и закрытия этой акции в этот день.

Скажем, я использую этот класс как фундаментальный класс строительных блоков, стоящий за интенсивным моделированием Монте-Карло на протяжении многих десятилетий, то есть тысяч дней, исторических данных.Это означает, что мне нужно было бы получить доступ к этим иварам тысячами, если не миллионами, если не миллиардами раз за короткий период времени, чтобы сделать симуляции как можно быстрее.

Вопрос: Должен ли я придерживаться удвоения или долженЯ все еще использую NSDecimalNumber?Насколько быстрый NSDecimalNumber, правда?Кто-нибудь здесь проверял NSDecimalNumber для интенсивных научных приложений?

Ответы [ 3 ]

2 голосов
/ 19 августа 2010

Быстрее, чем NSDecimalNumber будет NSDecimal, который не является объектом Obj-C, поэтому не требует дополнительных затрат objc_msgSend, но все же имеет преимущества десятичной математики. Здесь - функции для работы с NSDecimal с.

1 голос
/ 19 августа 2010

Как сказал jtbandes, вы должны использовать NSDecimal, если вам нужна скорость, NSDecimalNumber - это обёртка объекта Obj-C около NSDecimal.NSDecimal - это структура, используемая для представления десятичных чисел, которая позволяет выполнять вычисления, не приводящие к двоичным ошибкам> десятичного округления и ошибкам представления.

Я бы пошел с double, поскольку это симуляциягде последняя унция точности, вероятно, в любом случае не будет иметь значения (вероятно, ваша симуляция включает приближение, поэтому незначительные ошибки не будут иметь слишком большого эффекта).Вы должны остерегаться ловушек вычислений с плавающей запятой - некоторые типы операций могут привести к большим ошибкам, особенно если величина двух чисел с плавающей запятой сильно различается или если вы вычитаете одно число из другого, которое очень близко. Эта страница в Википедии охватывает несколько ловушек.

1 голос
/ 19 августа 2010

Если вы имеете дело с долларами и центами (но всегда целые центы), нет ничего быстрее и эффективнее, чем обычный int подсчет центов и деление на 100 для получения долларов.

...