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 桁の精度です。しかし、ループの最後で関数を for に変換sumOfSquaredDifferencesするとdoublesqrt余分な精度はすべて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 に答える