c# float [] average 失去准确性

标签 c# .net average

我正在尝试计算一组 float 的平均值。我需要使用索引,因为这是在二进制搜索中,所以顶部和底部会移动。 (总的来说,我们正在尝试优化半范围估计,因此我们不必每次都重新创建数组)。

无论如何,我写了一个自定义平均循环,我得到的准确度比 c# Average() 方法低 2 位

float test = input.Average();

int count = (top - bottom) + 1;//number of elements in this iteration
int pos = bottom;
float average = 0f;//working average
while (pos <= top)
{
     average += input[pos];
     pos++;
}
average = average / count;

例子:

0.0371166766 - c#
0.03711666 - my loop

125090.148 - c#
125090.281 - my loop 

http://pastebin.com/qRE3VrCt

最佳答案

I'm getting 2 places less accuracy than the c# Average()

不,您只损失了 1 位有效数字。 float 类型只能存储 7 位有效数字,其余的只是随机噪声。在这样的计算中,您不可避免地会累积舍入误差,从而失去精度。平衡舍入误差需要运气。

避免它的唯一方法是使用具有更高精度的浮点类型来累加结果。没问题,您有可用。这就是 Linq Average 方法看起来像这样的原因:

   public static float Average(this IEnumerable<float> source) {
       if (source == null) throw Error.ArgumentNull("source");
       double sum = 0;         // <=== NOTE: double
       long count = 0;
       checked {
           foreach (float v in source) {
               sum += v;
               count++;
           }
       }
       if (count > 0) return (float)(sum / count);
       throw Error.NoElements();
   }

使用 double 重现 Linq 结果,结果中的有效数字位数相当。

关于c# float [] average 失去准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14839309/

相关文章:

c# - 异步线程体循环,它只是工作,但如何?

python - 大型阵列的优化平均?

javascript - 如何知道是否在另一个页面上单击了按钮?

c# - algorithm - C# 中的 RijndaelManaged 类是否等同于 AES 加密?

c# - 如何在 .NET 中找到 NumLock、CapsLock 和 ScrollLock 的状态?

json - 如何使用 JSON 输出中的 jq 计算平均值

javascript - 合并多个对象数组并平均重复值javascript

c++ - WinSxS 无法加载 VC++ DLL

.net - 如何在 Entity Framework 中使用外键作为复合主键的一部分?

c# - LINQ - 按最后一位数字连接两个列表