我正在尝试进行一些递归乘法。
当迭代次数超过100万时,完成时间开始增加,为什么?
#include <time.h>
#include <stdio.h>
float num;
unsigned long i, j;
clock_t start, end;
int main(void)
{
start = clock();
for (j = 0; j<10000000; j++){
num = 1.000001E30f;
for (i = 0; i<100; i++){
num = num * 0.999915454854432f;
if (num == 0){
printf("zero\n");
}
}
//printf("%e\n", num);
//printf("%ld\n", j);
}
end = clock();
float cpu_time_used = ((float)(end - start))/CLOCKS_PER_SEC;
printf("%f", cpu_time_used);
return 0;
}
在Windows 10上与GCC 7.3一起编译
答案 0 :(得分:5)
您不断将累加器乘以0.999915454854432f,从而使该值越来越接近零。您可能已经接近于零,以至于它变成了denormal表示形式。这可能会触发浮点硬件的执行速度变慢,并且可能导致令人惊讶的性能膨胀。只是一个疯狂的猜测!
请参阅上述Wikipedia页面上的“性能问题”部分。