簡體   English   中英

優化浮點計算

[英]Optimize floating-point calculations

我的任務是使以下功能盡可能精確(速度不是目標)。 必須使用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;
}

我的任務是使以下功能盡可能精確

您說您必須使用float ,所以我認為問題不在於舍入,而在於更精確地計算積分。

我還假設僅增加N是不可行的。

我的建議不是考慮使用中點規則,而是考慮使用更高階的正交規則(梯形,辛普森等)

有很多方法可以避免或補償浮點舍入(MM的建議,使用Kahan求和,等等)。 但是,沒有理由這樣做,因為舍入誤差與集成方案的誤差絕對相形見 ;。 您將無法獲得更准確的積分,您將獲得由中點規則計算出的錯誤結果的更准確近似值。 除非在非常特殊的情況下,否則所有此類工作都將被浪費掉。

嘗試這個:

{
   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;
}

如果要精確計算積分,請繼續閱讀積分方案。 某些常規程序無法提供任何精度

本書“數字食譜” (有多個版本,一個用於C)受到高度重視。 還沒親自看過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM