2012-06-14 2 views
1

평균을 감안할 때 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] 
           ) 
          ); 
} 
+0

당신이 둔화이 어디 볼 ​​계기로 코드를 프로파일 적이 : 당신은뿐만 아니라 NSDecimal보다 훨씬 더 빠르게 처리 될 수 double를 사용하여 내부 루프의 연산을 수행 할 수 있는가? 내 생각 엔'intValue'와'NSDecimal' 사이에하는 모든 변환이 될 것입니다. 내부 루프에 대해'NSDecimalNumber'를 사용하고 NSDecimalNumber difference = [valueOfNumber decimalNumberBySubtracting : mean]; (먼저'NSDecimal'에서'NSDecimalNumber'로 변환해야 할 것입니다.) – user1118321

+1

제곱근을 수행하기 위해'double'으로 변환되기 때문에, 모든 루프 연산을' NSDecimal' 대신'double'을 사용해야합니까? –

+1

NSDecimal을 사용하지 말고 그냥 float 또는 double을 사용하십시오. 10 진수 산술의 요점은 주로 금융 거래를위한 정확한 10 진수를 갖는 것입니다. 귀하의 응용 프로그램과 같은 고유 한 정확성은 더 이상 없습니다. – zaph

답변

0

NSDecimal는 38 자리의 정밀도를 갖는다. 그러나 루프가 끝날 때 sqrt 함수의 경우 sumOfSquaredDifferencesdouble으로 변환하면 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]))); 
+0

나는 십진법으로 제곱근을하고 싶지만 어떤 방법을 모르겠다. 이런 식으로 정밀도를 잃어 버리는 것이 맞습니다. –

+0

빠른 웹 검색을 통해 NSDecimalNumber의 제곱근 계산에 대한이 블로그 게시물로 이동했습니다. http://cocoawithlove.com/2008/05/square-root-numerical-fun-with.html –

+0

32 비트 정수의 표준 편차 및 32 비트 정수의 정밀도가 10 진수로 10 자릿수 밖에되지 않으므로 왜 NSDecimal에서 표준 편차 산술 연산을 수행해야합니까? 그것은 말이되지 않습니다. 모두 double 연산을하고 NSDecimal로 변환하면됩니다. –

관련 문제