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。 我目前无法看到我的代码有任何问题。
同样,我确信这意味着,数据根据这些测试获得了正确的数字。
谢谢
答案 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。