被长期截断的分裂 - C.

时间:2013-04-17 16:29:34

标签: c timing division truncation

我正在尝试使用gettimeofday()函数计时功能。我能够以微秒为单位获取时间,但是当试图将其除以long以获得时间(秒)时,我的值将被截断为单个integer。有没有人有任何关于为什么会发生这种情况的见解?我曾假设long = 1000000.0的除法会阻止这种截断。

功能时间:

struct timeval t1,t2;

gettimeofday(&t1, NULL);

// Computes C - C1 - using single thread
for (i=0; i < n; i++)
    for (j=0; j < p; j++)
    {
        C1[i][j]=0;
        for (k=0; k < m; k++)
            C1[i][j] += A[i][k]*B[k][j];
    }

gettimeofday(&t2, NULL);

分部适用于此:

long divider = 1000000.0;
long elapsed = ((t2.tv_sec - t1.tv_sec) * 1000000.0L) + (t2.tv_usec - t1.tv_usec);
elapsed = (elapsed/divider);

printf("Time in seconds: %ld seconds\n", elapsed);

感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

Long是一个整数类型,意味着它不会包含小数,您可能希望将double用于dividerelapsed。有关cplusplus.com

的更多信息

请注意,您还需要%lfprintf的值。

更正:仅%f因为printf格式显然是enough

答案 1 :(得分:2)

long类型是整数类型。

问题是您要在float中存储想要成为double(或long)的结果。

这里有两个问题: 1-您的操作数永远不会转换为float / double(由编译器隐式转换),因此所有中间操作都返回intlong。 2-您的结果为long:即使您的操作数为float / double,您的结果也会投放到long

您需要做的事情:使用double变量。

double divider = 1000000.0;
double elapsed = ((t2.tv_sec - t1.tv_sec) * 1000000.0) + (t2.tv_usec - t1.tv_usec);
elapsed = (elapsed/divider);

printf("Time in seconds: %5.5f seconds\n", elapsed);