-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

前述のように、doublea の精度は小数点以下 15 ~ 16 桁です。したがって、値の範囲(ストレート値または加重平均の重みを掛けた値) が 15 桁以下である限り、問題はありません。

于 2013-02-28T21:43:23.510 に答える