【发布时间】:2012-06-14 05:15:45
【问题描述】:
我有这个方法来计算一个 NSNumber 整数数组的标准偏差,给定一个平均值。计算使用 NSDecimals 来保留最高分辨率。这目前需要许多 cpu 周期,在保持所需分辨率的同时加快速度的任何帮助表示赞赏!谢谢。
-(NSDecimal)standardDeviationOf:(NSMutableArray *)array withMean:(NSDecimal)mean {
if (![array count]) return CPTDecimalFromInt(0);
NSDecimal sumOfSquaredDifferences = CPTDecimalFromInt(0);
for (NSNumber *number in array) {
NSDecimal valueOfNumber = CPTDecimalFromInt([number intValue]);
NSDecimal difference = CPTDecimalSubtract(valueOfNumber, mean);
sumOfSquaredDifferences = CPTDecimalAdd(sumOfSquaredDifferences, CPTDecimalMultiply(difference, difference));
}
return CPTDecimalFromDouble(
sqrt(
CPTDecimalDoubleValue(sumOfSquaredDifferences) / [[NSNumber numberWithInt:[array count]] doubleValue]
)
);
}
【问题讨论】:
-
您是否使用 Instruments 对您的代码进行了分析,以了解减速在哪里?我的猜测是您在
intValue和NSDecimal之间进行的所有转换。将NSDecimalNumber用于内部循环并使用NSDecimalNumber difference = [valueOfNumber decimalNumberBySubtracting:mean];会更好吗? (您需要先将一些内容从NSDecimal转换为NSDecimalNumber。) -
既然您最终转换为
double来执行平方根,那么您是否真的通过使用NSDecimal而不仅仅是double进行所有循环算术来获得任何精度? -
不要使用 NSDecimal,只使用浮点数或双精度数。十进制算术的要点是具有精确的以 10 为底的十进制数字,主要用于金融交易。对于像您这样的应用程序来说,没有比这更准确的方法了。
-
90% 的时间花在这两行: NSDecimal valueOfNumber = CPTDecimalFromInt([number intValue]); sumOfSquaredDifferences = CPTDecimalAdd(sumOfSquaredDifferences, CPTDecimalMultiply(difference, difference));
标签: objective-c c nsdecimalnumber standard-deviation