繁体   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