我有很长的双数序列(假设不超过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; }
}
}
答案 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位数或更少,您应该没问题。