1

我有这种方法来计算 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]
                                 )
                            );
}
4

1 回答 1

0

AnNSDecimal具有 38 位精度,而double具有大约 16 位精度。但是在循环结束时,当您转换sumOfSquaredDifferencesdoubleforsqrt函数时,您在 中拥有的所有额外精度都NSDecimal“丢失”了。您不妨使用 执行内部循环的算术运算double,这应该比 快得多NSDecimal

double sumOfSquaredDifferences = 0;
double valueOfMean = [mean doubleValue];
for (NSNumber *number in array) {

    double valueOfNumber = [number intValue];
    double difference = valueOfNumber - valueOfMean;
    sumOfSquaredDifferences += difference * difference;

}

return CPTDecimalFromDouble(sqrt(sumOfSquaredDifferences /
                                 double([array count])));
于 2012-06-14T06:13:43.343 回答