数组,I / O文件和标准差(c ++)

时间:2010-04-22 18:53:33

标签: c++

    double s_deviation(double data[],int cnt, double mean)
   {
      int i;
      double sum= 0;
      double sdeviation;
      double x;

    //x = mean(billy,a_size);

      for(i=0; i<cnt; i++)
      {    
         sum += ((data[i]) - (mean));
      } 

        sdeviation = sqrt(sum/((double)cnt));

      return sdeviation;
   }

当我从这个功能中获得结果时,它给了我NaN。 我使用了测试(平均值)和数据[i]的值 返回数据[i]并返回平均值 它们是有效的。

当我用实际数字替换mean时,操作返回有限数字。 但是以平均值作为变量,它产生了NaH。 我目前无法看到我的代码有任何问题。

同样,我确信这意味着,数据根据这些测试获得了正确的数字。

谢谢

3 个答案:

答案 0 :(得分:4)

我猜测mean的值相对于您的数据而言较大,因此某些((data[i]) - (mean))值为负数,因此整体sum最终为负数。

然后,当您尝试计算sqrt(sum/((double)cnt))时,您将采用负数的平方根,这会产生复数,而double无法表示。

但是,潜在的问题是您的标准偏差算法不正确。您应该将距离均值的距离的正方形相加,而不是距离本身。除了使您的计算正确之外,这还可以保证sum永远不会为负,因此您始终可以获得实值平方根。

答案 1 :(得分:1)

我认为你应该

for(i=0; i<cnt; i++)
{    
   sum += ((data[i]) - (mean)) * ((data[i]) - (mean));
} 

在版本中你现在总和应该是0,但由于一些舍入错误,它很可能是一个小的负值。

答案 2 :(得分:0)

你正在使用负数的sqrt(最有可能),那是因为你使用了错误的标准偏差公式。

标准dev不是(val-mean)平均值的sqrt,它是(val-mean)平均SQUARE的sqrt。