celica さんが書きました: ↑5年前
100個の配列データの総和に対して、最新データを加算してから古いデータを減算しているので、
分母は100で問題ないと考えています。
データの個数を 100 から 5 に変えてみましょう。
データには、1 から 10 までの 10個を与えてみましょう。
引いてから、割るとどうなるか。
コード:
#include <stdio.h>
unsigned int avgPtr;
double avgData[5]; // 各要素に初期値:100000を格納済み
double avgSumData; // 初期値:10000000を格納済み
double k = 0;
static void GetAvgResult(void)
{
double instData; // 最新データ
double avgResult; // 平均結果
instData = ++k;
printf("avgData[%3d] = %10.3f", avgPtr, instData);
avgData[avgPtr] = instData; // 最新データをバッファに格納
avgSumData += instData; // 平均用SUM値に最新データ加算
if (++avgPtr >= 5) avgPtr = 0;
avgSumData -= avgData[avgPtr];// もっとも古いデータを減算(FIFO)
avgResult = avgSumData / 5;
printf(" avgSumData = %12.3f avgResult = %10.3f\n",
avgSumData, avgResult);
}
int main(void)
{
srand(time(0));
for (int i = 0; i < 10; i++)
GetAvgResult();
}
実行結果
コード:
avgData[ 0] = 1.000 avgSumData = 1.000 avgResult = 0.200
avgData[ 1] = 2.000 avgSumData = 3.000 avgResult = 0.600
avgData[ 2] = 3.000 avgSumData = 6.000 avgResult = 1.200
avgData[ 3] = 4.000 avgSumData = 10.000 avgResult = 2.000
avgData[ 4] = 5.000 avgSumData = 14.000 avgResult = 2.800
avgData[ 0] = 6.000 avgSumData = 18.000 avgResult = 3.600
avgData[ 1] = 7.000 avgSumData = 22.000 avgResult = 4.400
avgData[ 2] = 8.000 avgSumData = 26.000 avgResult = 5.200
avgData[ 3] = 9.000 avgSumData = 30.000 avgResult = 6.000
avgData[ 4] = 10.000 avgSumData = 34.000 avgResult = 6.800
最新の 5個(6~10) の平均値が 6.8 と出ました。
(6+7+8+9+10)/5 = 8.0 のはずなのに、
(7+8+9+10)/5 = 6.8 と計算しています。
次のように変更して、割ってから引くと、
コード:
avgResult = avgSumData / 5;
printf(" avgSumData = %12.3f avgResult = %10.3f\n",
avgSumData, avgResult);
avgSumData -= avgData[avgPtr];// もっとも古いデータを減算(FIFO)
実行結果
コード:
avgData[ 0] = 1.000 avgSumData = 1.000 avgResult = 0.200
avgData[ 1] = 2.000 avgSumData = 3.000 avgResult = 0.600
avgData[ 2] = 3.000 avgSumData = 6.000 avgResult = 1.200
avgData[ 3] = 4.000 avgSumData = 10.000 avgResult = 2.000
avgData[ 4] = 5.000 avgSumData = 15.000 avgResult = 3.000
avgData[ 0] = 6.000 avgSumData = 20.000 avgResult = 4.000
avgData[ 1] = 7.000 avgSumData = 25.000 avgResult = 5.000
avgData[ 2] = 8.000 avgSumData = 30.000 avgResult = 6.000
avgData[ 3] = 9.000 avgSumData = 35.000 avgResult = 7.000
avgData[ 4] = 10.000 avgSumData = 40.000 avgResult = 8.000
ちゃんと 8 になりました。