4

重複の可能性:
C++ float 精度に関する質問

std::accumulate を使用して、正の数のみであるベクトル要素の合計を計算する 3 つの方法の中で最も正確な方法を決定するという問題があります。

1)

double sum(vector<float> &v)
{
     return accumulate(v.begin(), v.end(), 0.0);
}

2)

double sum(vector<float> &v)
{
     sort(v.begin(), v.end());
     return accumulate(v.begin(), v.end(), 0.0);
}

3)

double sum(vector<float> &v)
{
     sort(v.begin(), v.end(), greater<float>());
     return accumulate(v.begin(), v.end(), 0.0);
}

これは一種の就職面接の質問です。そのため、合計を計算するこれらの特定の 3 つの方法を取得しました。いろいろネットで調べましたが違いがわかりませんでした。みんなが理解できるように助けてくれませんか?

4

1 に答える 1

4

違いは非常に小さいはずですが、小さい数値から始めると、わずかに正確になります。説明のために、浮動小数点数には有効数字 4 桁と指数のみが含まれており、2 進数ではなく 10 進数であると考えてください。数字の使用:

a = 5000
b = 5000
c = 1000e4 (10000000)

c最初に追加すると、 または のいずれab、2 つのうち小さい方が表現から外れ、丸められます。c++の最終結果は になりbます。一方、加算して最初の中間値として取得し、それを加算すると、演算のより正確な結果が得られます。a1000e4ab1e4c1001e4

于 2011-07-23T13:59:19.047 に答える