Cumulative standard deviation: Difference between revisions

(added factor implemenation)
Line 38:
<pre>
Deviation 2.00000E+00</pre>
=={{header|ALGOL 68}}==
{{trans|C}}
 
{{works with|ALGOL 68|Standard - no extensions to language used}}
 
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}}
 
<!-- {{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8.8d.fc9.i386]}} -->
Note: the use of a UNION to mimic C's enumerated types is "experimental" and probably not typical of "production code". However it is a good example of '''ALGOL 68'''s ''conformity CASE clause''.
<lang Algol68>MODE VALUE = STRUCT(CHAR value),
STDDEV = STRUCT(CHAR stddev),
MEAN = STRUCT(CHAR mean),
VAR = STRUCT(CHAR var),
COUNT = STRUCT(CHAR count),
RESET = STRUCT(CHAR reset);
 
MODE ACTION = UNION ( VALUE, STDDEV, MEAN, VAR, COUNT, RESET );
 
LONG REAL sum := 0.0;
LONG REAL sum2 := 0.0;
INT num := 0;
 
PROC stat object = (LONG REAL v, ACTION action)LONG REAL:
(
LONG REAL m;
CASE action IN
(VALUE):(
num +:= 1;
sum +:= v;
sum2 +:= v*v;
stat object(0.0, LOC STDDEV)
),
(STDDEV):
long sqrt(stat object(0.0, LOC VAR)),
(MEAN):
IF (num>0) THEN sum/LONG REAL(num) ELSE 0.0 FI,
(VAR):(
m := stat object(0.0, LOC MEAN);
IF (num>0) THEN sum2/LONG REAL(num) - m*m ELSE 0.0 FI
),
(COUNT):
num,
(RESET):(
sum := sum2 := 0.0; num := 0;
0.0
)
ESAC
);
 
[]LONG REAL v = ( 2,4,4,4,5,5,7,9 );
main:
(
LONG REAL sd;
FOR i FROM LWB v TO UPB v DO
sd := stat object(v[i], LOC VALUE)
OD;
printf(($"standard dev := "g(0,6)l$, sd))
)</lang>Output:
<pre>
standard dev := 2.000000
</pre>
 
=={{header|AutoHotkey}}==
ahk forum: [http://www.autohotkey.com/forum/post-276698.html#276698 discussion]