我正在尝试使用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);
感谢任何帮助。
答案 0 :(得分:3)
Long
是一个整数类型,意味着它不会包含小数,您可能希望将double
用于divider
和elapsed
。有关cplusplus.com
请注意,您还需要%lf
到printf的值。
更正:仅%f
因为printf格式显然是enough
答案 1 :(得分:2)
long
类型是整数类型。
问题是您要在float
中存储想要成为double
(或long
)的结果。
这里有两个问题:
1-您的操作数永远不会转换为float
/ double
(由编译器隐式转换),因此所有中间操作都返回int
或long
。
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);