0

我的任务是使以下功能尽可能精确(速度不是目标)。我必须使用floatmiddle rectangles 的方法。你能建议点什么吗?实际上,我认为,这一切都是为了最大限度地减少浮点舍入误差。这就是我所做的:

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

试试这个:

{
   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 回答
2

如果您想精确计算积分,请阅读积分方案。一些家庭编织程序不会给出任何精确度

《数值食谱》一书(有几个版本,一个为 C 版本)备受推崇。个人没看过。

于 2013-03-16T19:05:31.740 回答