diff --git a/src/Numerics/Statistics/ArrayStatistics.cs b/src/Numerics/Statistics/ArrayStatistics.cs index 28418d07..265e1255 100644 --- a/src/Numerics/Statistics/ArrayStatistics.cs +++ b/src/Numerics/Statistics/ArrayStatistics.cs @@ -123,7 +123,7 @@ namespace MathNet.Numerics.Statistics { t += samples[i]; double diff = ((i + 1)*samples[i]) - t; - variance += (diff*diff)/((i + 1)*i); + variance += (diff*diff)/((i + 1.0)*i); } return variance/(samples.Length - 1); } @@ -145,7 +145,7 @@ namespace MathNet.Numerics.Statistics { t += population[i]; double diff = ((i + 1)*population[i]) - t; - variance += (diff*diff)/((i + 1)*i); + variance += (diff*diff)/((i + 1.0)*i); } return variance/population.Length; } diff --git a/src/UnitTests/StatisticsTests/StatisticsTests.cs b/src/UnitTests/StatisticsTests/StatisticsTests.cs index d491d48e..aeea3c68 100644 --- a/src/UnitTests/StatisticsTests/StatisticsTests.cs +++ b/src/UnitTests/StatisticsTests/StatisticsTests.cs @@ -712,5 +712,15 @@ namespace MathNet.Numerics.UnitTests.StatisticsTests Array.Sort(array); Assert.AreEqual(1.0, SortedArrayStatistics.Median(array)); } + + [Test] + public void VarianceDenominatorMustNotOverflow_GitHubIssue137() + { + var a = new double[46342]; + a[a.Length - 1] = 1000d; + + Assert.AreEqual(21.578697, a.Variance(), 1e-5); + Assert.AreEqual(21.578231, a.PopulationVariance(), 1e-5); + } } }