ページ 11

標準偏差

Posted: 2010年10月25日(月) 22:44
by light
タイトルにあるようにこれは標準偏差を求めるプログラムですが、結果として表示される値が
異常に大きなものになってしまいます。コンパイル自体はちゃんと出来てるみたいなのですが
どうすれば正常な値で標準偏差が求められるでしょうか?
どなたか回答よろしくお願いします。


#include <stdio.h>
#include <math.h>

double ave(int v[/url],int n)
{
int i;
double sum=0;

for(i=0; i<n; i++)
sum += v;

return sum/n;

}

double ave2(int v[/url], int n)

{
int i;
double sum=0;

for(i=0; i<n; i++)
sum += pow(v,2);

return sum/n;
}

double std(int v[/url], int n)
{

int i;
int sa[10];

double average;
average=ave(v,n);

return sqrt(ave2(sa,n));

}

int main(void)

{

int score[/url] = {25, 63, 72, 54, 92, 35, 89, 95, 44, 69};
double std_score;

std_score= std(score, 10);
printf("標準偏差 = %lf\n", std_score);

return 0;

}

Re:標準偏差

Posted: 2010年10月25日(月) 22:58
by box
std関数におけるaverage変数の存在理由がわかりません。

> average=ave(v,n);

求めた値をその後で使わないということは、なくていいんじゃありませんか?

Re:標準偏差

Posted: 2010年10月25日(月) 23:27
by light
何回も手直ししてるうちに結構グダグダになっている所があるのでその名残りです、多分;
仰るとおり、
double average;
average=ave(v,n);
↑の二行を削除してもコンパイルは出来ました;
ただ結果は異常な数値のままなので解説していただけたらと思います。

Re:標準偏差

Posted: 2010年10月25日(月) 23:47
by Poco
標準偏差の導出式を間違っています。
今のソースコードだと、単純に二乗の平均の平方根を返しているだけです。

Re:標準偏差

Posted: 2010年10月25日(月) 23:47
by box
> 何回も手直ししてるうちに結構グダグダになっている所があるのでその名残りです

きちんと設計し直して(標準偏差を求める式の再確認を含む)から、
あらためて投稿することをおすすめします。

グダグダになっているコードをとっかかりにして話をしても、
よけいグダグダになりそうです。

Re:標準偏差

Posted: 2010年10月26日(火) 00:02
by ゆーずぃ
皆さんおっしゃっているように、一から作り直した方が早いです。
関数の分け方にはセンスを感じるので、その調子で頑張って下さい。
ただ、あまり関数に分けすぎると引数と戻り値の型を合わせるのが大変になったりするので、
最初の内はある程度まとめてしまってもいいかもしれません。
とりあえずpow()にはdouble型を使った方がいいと思います。(自動で型調整をしてはくれますが。)

Re:標準偏差

Posted: 2010年10月26日(火) 00:12
by box
まあ、pow関数にわざわざご登場いただくよりも、単に2乗を求めるだけなら
x * x
くらいでじゅうぶんな気がします。

2乗の計算を何億回も行なううちに、
pow関数の呼び出しに伴うオーバーヘッドや、pow関数の内部ロジックの実行にかかる時間と、
単に x * x を計算する時間との差が無視できないくらい出てくるような気がします。 画像

Re:標準偏差

Posted: 2010年10月26日(火) 10:55
by light
みなさん回答ありがとうございます。
もう少し、自分でじっくり考えてみようと思います。