I trying to calculate standard deviation with a next method:
private static double? StdDev(IReadOnlyCollection<double> items) {
if(items == null) {
throw new ArgumentNullException("items");
}//if
var count = items.Count;
if(count == 0 || count == 1) {
return null;
}//if
var sum = 0d;
var sqrsum = 0d;
foreach(var item in items) {
sum += item;
sqrsum += item * item;
}//for
var average = sum / count;
var stddev = Math.Sqrt((sqrsum - count * average * average) / (count - 1));
return stddev;
}
Sometimes, the expression "sqrsum - count * average * average" is less than 0 and Math.Sqrt returns NaN. For example, in this case:
private static void Main() {
var data = Enumerable.Repeat(86.399999999999991, 3).ToList();
var stddev = StdDev(data);
Console.WriteLine("StdDev = " + stddev);
}
How can I fix this cases in my code? should I use Math.Abs(sqrsum - count * average * average) or should I round something?