RosettaCodeData/Task/Cumulative-standard-deviation/Oberon/cumulative-standard-deviation.oberon
2026-04-30 12:34:36 -04:00

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.