60 lines
1.7 KiB
Text
60 lines
1.7 KiB
Text
MODULE CumulativeStandardDeviation;
|
|
IMPORT Math, Out;
|
|
|
|
TYPE CSD* = POINTER TO CSDStruct;
|
|
CSDStruct
|
|
= RECORD
|
|
sum, sum2, sd : REAL;
|
|
n : INTEGER
|
|
END;
|
|
|
|
PROCEDURE sample*( sd : CSD ; x : REAL ) : REAL;
|
|
VAR r, sum, sum2 : REAL;
|
|
BEGIN
|
|
sum := sd.sum + x;
|
|
sum2 := sd.sum2 + ( x * x );;
|
|
INC( sd.n );
|
|
r := FLT( sd.n );
|
|
IF sd.n = 0 THEN
|
|
sd.sd := 0.0
|
|
ELSE
|
|
sd.sd := Math.sqrt( sum2 / r - sum * sum / r / r )
|
|
END;
|
|
sd.sum := sum;
|
|
sd.sum2 := sum2
|
|
RETURN sd.sd
|
|
END sample;
|
|
|
|
PROCEDURE NewCSD*() : CSD ;
|
|
VAR sd : CSD;
|
|
BEGIN
|
|
NEW( sd );
|
|
sd.n := 0;
|
|
sd.sum := 0.0;
|
|
sd.sum2 := 0.0;
|
|
sd.sd := 0.0
|
|
RETURN sd
|
|
END NewCSD ;
|
|
|
|
PROCEDURE showSampleEffect( sd : CSD; x : REAL );
|
|
VAR dev : REAL;
|
|
BEGIN
|
|
dev := sample( sd, x );
|
|
Out.Int( sd.n, 6 );Out.String( ": " );Out.Real( x, 10 );
|
|
Out.String( " -> " );Out.Real( dev, 10 );Out.Ln
|
|
END showSampleEffect;
|
|
|
|
PROCEDURE test;
|
|
VAR sd : CSD;
|
|
BEGIN
|
|
sd := NewCSD();
|
|
showSampleEffect( sd, 2.0 );
|
|
showSampleEffect( sd, 4.0 );showSampleEffect( sd, 4.0 );showSampleEffect( sd, 4.0 );
|
|
showSampleEffect( sd, 5.0 );showSampleEffect( sd, 5.0 );
|
|
showSampleEffect( sd, 7.0 );
|
|
showSampleEffect( sd, 9.0 )
|
|
END test;
|
|
|
|
BEGIN
|
|
test;
|
|
END CumulativeStandardDeviation.
|