行为异常循环超过一百万

时间:2019-07-04 04:44:40

标签: c

我正在尝试进行一些递归乘法。

当迭代次数超过100万时,完成时间开始增加,为什么?

enter image description here

#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一起编译

1 个答案:

答案 0 :(得分:5)

您不断将累加器乘以0.999915454854432f,从而使该值越来越接近零。您可能已经接近于零,以至于它变成了denormal表示形式。这可能会触发浮点硬件的执行速度变慢,并且可能导致令人惊讶的性能膨胀。只是一个疯狂的猜测!

请参阅上述Wikipedia页面上的“性能问题”部分。