RosettaCodeData/Task/Cumulative-standard-deviation/Oberon-07/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 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.