我有这个方法来计算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]
)
);
}发布于 2012-06-14 14:13:43
NSDecimal的精度为38位,而double的精度约为16位。但是在循环结束时,当您为sqrt函数将sumOfSquaredDifferences转换为double时,您在NSDecimal中拥有的所有额外精度都会“丢失”。您最好使用比NSDecimal快得多的double来执行内部循环的运算
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])));https://stackoverflow.com/questions/11027035
复制相似问题