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 ( sd : CSD ) sample*( x : REAL ) : REAL;
|
|
VAR r, sum, sum2 : REAL;
|
|
BEGIN
|
|
sum := sd.sum + x;
|
|
sum2 := sd.sum2 + ( x * x );;
|
|
INC( sd.n );
|
|
r := 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 ( sd : CSD ) showSampleEffect( x : REAL );
|
|
VAR dev : REAL;
|
|
BEGIN
|
|
dev := sd.sample( x );
|
|
Out.Int( sd.n, 6 );Out.String( ": " );Out.Real( x, 15 );
|
|
Out.String( " -> " );Out.Real( dev, 15 );Out.Ln
|
|
END showSampleEffect;
|
|
|
|
PROCEDURE test;
|
|
VAR sd : CSD;
|
|
BEGIN
|
|
sd := NewCSD();
|
|
sd.showSampleEffect( 2.0 );
|
|
sd.showSampleEffect( 4.0 ); sd.showSampleEffect( 4.0 ); sd.showSampleEffect( 4.0 );
|
|
sd.showSampleEffect( 5.0 ); sd.showSampleEffect( 5.0 );
|
|
sd.showSampleEffect( 7.0 );
|
|
sd.showSampleEffect( 9.0 )
|
|
END test;
|
|
|
|
BEGIN
|
|
test;
|
|
END CumulativeStandardDeviation.
|