5

シリーズの最初の20要素を計算しました-

ここに画像の説明を入力してください

2つの方法で、1番目-前方、2番目-後方。このために私はしました-

#include <iostream>
#include <math.h>
using namespace std;

float sumSeriesForward(int elementCount) {
    float sum = 0;
    for (int i = 0; i < elementCount; ++i) {
        sum += (float) 1 / (pow(3, i));
    }
    return sum;
}

float sumSeriesBack(int elementCount) {
    float sum = 0;
    for (int i = (elementCount - 1); i >= 0; --i) {
        sum += (float) 1 / (pow(3, i));
    }
    return sum;
}

int main() {
    cout.precision(30);
    cout << "sum 20 first elements - forward: " << sumSeriesForward(20) << endl;
    cout << "sum 20 first elements - back: " << sumSeriesBack(20) << endl;
}

そして私は得た-

sum 20 first elements - forward: 1.5000001192092896
sum 20 first elements - back: 1.5

誰かが2つの方法の違いはなぜですか?

4

2 に答える 2

10

一般に、浮動小数点数は値を正確に表すことができません。値を操作すると、エラーが伝播します。あなたの例では、逆方向に計算するときに、これまでの小さな数値の合計が大きな数値に影響を与える可能性が高くなり、小さな値をさらに大きな数値に追加します。一方、順方向に計算する場合は、大きな数値から開始し、小さな数値はそれに対する影響が少なくなります。つまり、合計するときは、常に最小から最大へと合計する必要があります。

固定桁数だけで合計を維持することを検討してください。たとえば、4 桁を保持し、これらの数字を上から下、下から上に合計します。

values   top to bottom   bottom to top
10.00      10.00            10.01
0.004      10.00            0.010
0.003      10.00            0.006
0.002      10.00            0.003
0.001      10.00            0.001

浮動小数点数も同じように機能し、[2 進] 桁の固定数を使用します。

于 2012-09-05T00:29:32.237 に答える
5

数値を合計する際の精度を向上させるには、カハン合計アルゴリズムを検討してください。これにより、明らかなアプローチ (最小から最大までの数値の合計を含む) と比較して、エラーが大幅に減少します。

于 2012-09-05T01:59:15.617 に答える