![](/img/trans.png)
[英]Why doesn't a compiler optimize floating-point *2 into an exponent increment?
[英]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.