-1

我有很长的双数序列(假设不超过 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; }
    }

}
4

3 回答 3

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
于 2013-02-28T21:33:45.313 回答
0

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

var candle = new Candle(200000);

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

Console.WriteLine(candle.WeightAverage);

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

根据MSDN双精度设置为 15-16 位,这远远超过你的需要。

于 2013-02-28T21:29:07.587 回答
0

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

于 2013-02-28T21:43:23.510 回答