Calculating mean and standard deviation with std.algorithm.reduce

FG home at fgda.pl
Wed Feb 13 06:48:20 PST 2013


On 2013-02-13 14:44, Joseph Rushton Wakeling wrote:
> The docs for std.algorithm give an illustration of its use to calculate mean and
> standard deviation in a single pass: [...]
> However, this formula for standard deviation is one that is well known for being
> subject to potentially fatal rounding error.

Typical thing with examples - they try to be terse and show off a mechanism like 
reduce, without going into too much details and hence are unusable IRL.

You can use reduce and put the division and subtraction into the reduce itself 
to prevent overflows. You also won't end up with jaw-dropping tuples, sorry. :)

     float[] a = [10_000.0f, 10_001.0f, 10_002.0f];
     auto n = a.length;
     auto avg = reduce!((a, b) => a + b / n)(0.0f, a);
     auto var = reduce!((a, b) => a + pow(b - avg, 2) / n)(0.0f, a);
     auto sd = sqrt(var);
     writeln(avg, "\t", sd);

Output: 10001   0.816497


More information about the Digitalmars-d-learn mailing list