평균을 감안할 때 NSNumber 정수 배열의 표준 편차를 계산하려면이 방법이 있습니다. 이 계산은 NSDecimals를 사용하여 가장 높은 해상도를 유지합니다. 이것은 현재 많은 cpu주기를 요구하고 있으며, 필요한 해결책을 유지하면서 속도를 높이는 데 도움이됩니다! 고맙습니다. double
정밀도의 약 16 자리를 갖는 반면이 표준 편차 방법의 속도를 높입니다.
-(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]
)
);
}
당신이 둔화이 어디 볼 계기로 코드를 프로파일 적이 : 당신은뿐만 아니라
NSDecimal
보다 훨씬 더 빠르게 처리 될 수double
를 사용하여 내부 루프의 연산을 수행 할 수 있는가? 내 생각 엔'intValue'와'NSDecimal' 사이에하는 모든 변환이 될 것입니다. 내부 루프에 대해'NSDecimalNumber'를 사용하고 NSDecimalNumber difference = [valueOfNumber decimalNumberBySubtracting : mean]; (먼저'NSDecimal'에서'NSDecimalNumber'로 변환해야 할 것입니다.) – user1118321제곱근을 수행하기 위해'double'으로 변환되기 때문에, 모든 루프 연산을' NSDecimal' 대신'double'을 사용해야합니까? –
NSDecimal을 사용하지 말고 그냥 float 또는 double을 사용하십시오. 10 진수 산술의 요점은 주로 금융 거래를위한 정확한 10 진수를 갖는 것입니다. 귀하의 응용 프로그램과 같은 고유 한 정확성은 더 이상 없습니다. – zaph