优化浮点计算

时间:2013-03-16 18:45:39

标签: c floating-point

我有一项任务是尽可能使以下功能精确(速度不是目标)。我必须使用 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 个答案:

答案 0 :(得分:4)

  

我有一项任务是尽可能精确地使用以下功能

你说你必须使用float,所以我认为这个问题不是关于舍入,而是更准确地计算积分。

我还假设只是增加N不是一种选择。

我的建议是考虑使用higher-order quadrature rule (trapezoid, Simpson's etc),而不是使用中点规则。

答案 1 :(得分:4)

有很多方法可以避免或补偿浮点舍入(MM的建议,使用Kahan求和等......)。但是,没有理由这样做,因为整合方案的错误导致舍入误差绝对相形见绌;你不会得到更准确的积分,你会得到一个更准确的近似中点规则计算的错误结果。除非在非常特殊的情况下,否则任何此类努力都将被完全浪费。

答案 2 :(得分: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;
}

答案 3 :(得分:2)

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

书籍"Numerical recipes"(有几个版本,一个用于C)受到高度重视。没有亲自看过。