0

次の関数をできるだけ正確にする(速度は目的ではありません)というタスクがあります。float中央の四角形のメソッドを使用する必要があります。何か提案していただけますか?実際には、浮動小数点の丸め誤差を最小限に抑えることがすべてだと思います。それが私がやったことです:

typedef float T;

T integrate(T left, T right, long N, T (*func)(T)) {
    long i = 0;
    T result = 0.0;
    T interval = right - left;
    for(i = 0; i < N; i++) {
        result += func(left + interval * (i + 0.5) / N) * interval / N;
    }
    return result;
}
4

4 に答える 4

4

次の関数をできるだけ正確にするタスクがあります

を使用する必要があると言うfloatので、問題は丸めではなく、積分をより正確に計算することであると思います。

また、単純に増やすことNは選択肢ではないと思います。

中点規則を使用する代わりに、高次の直交規則 (台形、シンプソンなど) の使用を検討することをお勧めします。

于 2013-03-16T18:50:39.350 に答える
4

浮動小数点の丸めを回避または補正する方法はたくさんあります (MM の提案、Kahan の合計の使用など...)。ただし、丸め誤差は積分スキームの誤差よりもはるかに小さいため、そうする理由はありません。より正確な積分は得られず、中点規則によって計算された誤った結果のより正確な近似が得られます。そのような努力は、非常に特殊な状況を除いて完全に無駄になります。

于 2013-03-16T18:58:02.710 に答える
2

積分を正確に計算したい場合は、積分スキームを読んでください。いくつかの家庭用ニットルーチンは、どんな種類の精度も与えません

「数値レシピ」(いくつかのバージョンがあり、1つはC用)という本は高く評価されています。個人的には見ていません。

于 2013-03-16T19:05:31.740 に答える
2

これを試して:

{
   long i = 0;
   T result = 0.0;
   T interval = right - left;
   for(i = 0; i < N; i++) {
       result += func(left + interval * (i + 0.5) / N);
   }
   return result * interval / N;
}
于 2013-03-16T18:49:45.603 に答える