[fpc-devel] Numeric error in the calculation of Variance

Werner Pamler werner.pamler at freenet.de
Sun Dec 24 11:04:42 CET 2017


Am 23.12.2017 um 13:24 schrieb Anton Shepelev:
> Hello, all
>
> May  I  ask you if there is any chance of fixing the
> error in the Math unit that I reported here:
>
>     https://bugs.freepascal.org/view.php?id=32804
>
> and provided a patch?  Here is a test case:
>
> Program Vartest;
> uses Math;
>
> const Size = 1000000;
> var dataS: array of Single;
>      dataD: array of Double;
>      dataE: array of Extended;
>      i,n: longint;
> begin
>    WriteLn('Each run should return a value near unity.');
>
>    WriteLn('Single:');
>    SetLength( dataS, Size );
>    for n := 1 to 4 do
>    begin
>      for i := 0 to Size - 1 do
>      begin
>        dataS[i] := 10000000 + RandG(0,1);
>      end;
>      WriteLn( Math.Variance( dataS ):5:3 );
>    end;
>
>    WriteLn('Double:');
>    SetLength( dataD, Size );
>    for n := 1 to 4 do
>    begin
>      for i := 0 to Size - 1 do
>      begin
>        dataD[i] := 1000000000000000 + RandG(0,1);
>      end;
>      WriteLn( Math.Variance( dataD ):5:3 );
>    end;
>
>    WriteLn('Extended:');
>    SetLength( dataE, Size );
>    for n := 1 to 4 do
>    begin
>      for i := 0 to Size - 1 do
>      begin
>        dataE[i] := 1000000000000000000 + RandG(0,1);
>      end;
>      WriteLn( Math.Variance( dataE ):5:3 );
>    end;
> end.

Yes, the formula used isĀ  SS-Sqr(S)/N, and this is the bad one. 
Explained somewhere in the Numerical Recipes, but also in Widepedia 
(https://en.wikipedia.org/wiki/Variance#Formulae_for_the_variance): "it 
is not advised for computer calculations as it suffers from catastrophic 
cancellation <https://en.wikipedia.org/wiki/Catastrophic_cancellation> 
if the two components of the equation are similar in magnitude and 
floating point arithmetic is used."
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20171224/83b2c81c/attachment.html>


More information about the fpc-devel mailing list