簡體   English   中英

我怎樣才能加快這個循環?

[英]How can I speed-up this loop?

如何加速此循環(在C中)?

unsigned int x = 50000000;
double a= 0.9;
double b= -0.9;
for ( unsigned int i = 1; i <= x; i++)
{
    a *= 0.9; //power
    b -=  a/i;
}

執行時間:14.000秒

我不知道為什么,但是當我在代碼中添加這兩行時,執行時間只有1.000秒。

unsigned int x = 50000000;
double a= 0.9;
double b= -0.9;
for ( unsigned int i = 1; i <= x; i++)
{
    a *= 0.9; //power
    a += 10e250;
    a -=10e250;
    b -=  a/i;
}

謝謝你的幫助

首先,代碼運行速度低於預期的最可能原因是a變為非規范化數字。 非規范化數字是一個特殊情況,可能會運行很多,速度慢很多。 也可以通過添加10 ^ 251並再次減去它來將a更改為0並將零除以任何更快(因為不需要計算結果)。

但真正的加速來自不是愚蠢地添加微小的,沒有任何影響的微小數字。 當x =幾百時,a將是如此之小以至於從b中減去a / i將不會產生任何差異。 所以代替b - = a / i; 你寫

double old_b = b;
b -= a / i;
if (b == old_b) break;

你的時間會從幾秒鍾變化到不到一毫秒。

添加10e250它超過了雙變量可以支持的數字限制,當減去它時總是變為0.不確定這個,但乘法應該比加法花費更多的時間,所以它減慢了速度,例如。 如果你試試這個:

for ( unsigned int i = 1; i <= x; i++)
{
  a ++; //power
  b -=  a/i;
}

您將看到它將像第二次一樣運行。 我想當你添加10e250並且在a = 0之后; 乘以0比使用其他非零變量快。

暫無
暫無

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

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