首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速此标准差方法

问加速此标准差方法
EN

Stack Overflow用户
提问于 2012-06-14 13:15:46
回答 1查看 726关注 0票数 1

我有这个方法来计算NSNumber整数数组的标准差,给定一个平均值。计算使用NSDecimals来保留最高分辨率。这是目前需要很多cpu周期,任何帮助它加速,同时保留所需的分辨率是感激的!谢谢。

代码语言:javascript
复制
-(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]
                                 )
                            );
}
EN

回答 1

Stack Overflow用户

发布于 2012-06-14 14:13:43

NSDecimal的精度为38位,而double的精度约为16位。但是在循环结束时,当您为sqrt函数将sumOfSquaredDifferences转换为double时,您在NSDecimal中拥有的所有额外精度都会“丢失”。您最好使用比NSDecimal快得多的double来执行内部循环的运算

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11027035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档