70 lines
1.2 KiB
Text
70 lines
1.2 KiB
Text
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.
|