標準偏差

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
light

標準偏差

#1

投稿記事 by light » 14年前

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


#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;

}

box

Re:標準偏差

#2

投稿記事 by box » 14年前

std関数におけるaverage変数の存在理由がわかりません。

> average=ave(v,n);

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

light

Re:標準偏差

#3

投稿記事 by light » 14年前

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

Poco

Re:標準偏差

#4

投稿記事 by Poco » 14年前

標準偏差の導出式を間違っています。
今のソースコードだと、単純に二乗の平均の平方根を返しているだけです。

box

Re:標準偏差

#5

投稿記事 by box » 14年前

> 何回も手直ししてるうちに結構グダグダになっている所があるのでその名残りです

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

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

ゆーずぃ

Re:標準偏差

#6

投稿記事 by ゆーずぃ » 14年前

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

box

Re:標準偏差

#7

投稿記事 by box » 14年前

まあ、pow関数にわざわざご登場いただくよりも、単に2乗を求めるだけなら
x * x
くらいでじゅうぶんな気がします。

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

light

Re:標準偏差

#8

投稿記事 by light » 14年前

みなさん回答ありがとうございます。
もう少し、自分でじっくり考えてみようと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る