MODULE CumulDev; (* Cumulative standard deviation *) FROM RealMath IMPORT sqrt; FROM SRealIO IMPORT WriteFixed; FROM STextIO IMPORT WriteLn, WriteString; FROM SWholeIO IMPORT WriteInt; TYPE TSample = RECORD N: CARDINAL; Sum: REAL; SumOfSquares: REAL END; TData = ARRAY [1 .. 8] OF REAL; VAR Test: TData; S: TSample; I: CARDINAL; PROCEDURE Init(VAR OUT S: TSample); BEGIN WITH S DO N := 0; Sum := 0.0; SumOfSquares := 0.0 END; END Init; PROCEDURE Add(VAR INOUT S: TSample; P: REAL); BEGIN WITH S DO N := N + 1; Sum := Sum + P; SumOfSquares := SumOfSquares + P * P END END Add; PROCEDURE Deviation (S: TSample): REAL; VAR Quot: REAL; BEGIN WITH S DO Quot := Sum / FLOAT(N); RETURN sqrt(SumOfSquares / FLOAT(N) - Quot * Quot) END; END Deviation; BEGIN Test := TData{2.0, 4.0, 4.0, 4.0, 5.0, 5.0, 7.0, 9.0}; Init(S); WriteString("N ITEM AVG STDDEV"); WriteLn; FOR I := 1 TO HIGH(Test) DO Add(S, Test[I]); WriteInt(I, 1); WriteString(" "); WriteFixed(Test[I], 1, 3); WriteString(" "); WriteFixed(S.Sum / FLOAT(I), 3, 5); WriteString(" "); WriteFixed(Deviation(S), 3, 5); WriteLn END; END CumulDev.