计算一系列双打的重均值

时间:2013-02-28 21:24:54

标签: c# double

我有很长的双数序列(假设不超过100 000)。 我们还假设每个数字不大于200 000.如果我的算法适合这样的计算?它会足够精确吗?

例如,如果我总计100 000次200 000而不是100 000,我希望有一个介于199 999和200 001之间的东西,但不是200 100或类似的东西(尽管对于这些特定的数字,似乎我的班级工作感谢MarcinJuraszek的测试)

class Candle
{

    public Candle(double value)
    {
        ValueUpdated(value);
    }

    private double sum = 0;
    private double count = 0;

    public void ValueUpdated(double value)
    {
        sum += value;
        count++;
    }

    public double WeightAverage
    {
        get { return sum / count; }
    }

}

3 个答案:

答案 0 :(得分:1)

双精度浮点数具有52个小数位,即它们具有大约log10(2 ^ 52)〜= 16位小数的精度。由于你只需要6位小数的精度,你应该完全没问题。

为什么不试试呢?

double sum = 0.0;
int count = 100000;
for (int i = 0; i < count; ++i) {
    sum += 200000.0;
}
double average = sum / (double)count;
Console.WriteLine(average); // prints out exactly 200000

答案 1 :(得分:0)

你的循环肯定有错误。刚试过:

var candle = new Candle(200000);

for (int i = 1; i < 100000; i++)
    candle.ValueUpdated(200000);

Console.WriteLine(candle.WeightAverage);

结果是可预测且正确的: 200000

根据MSDN,双精度设置为15-16位数,远远超出您的需要。

答案 2 :(得分:0)

如上所述,double的精确度为15-16位小数。因此,只要您的值的范围(直线值或值乘以加权平均值的权重)为15位数或更少,您应该没问题。