2013-04-17 87 views
0

我試圖一次使用gettimeofday()功能的功能。我能夠獲得以微秒的時間,但是當試圖通過一個long來劃分它在幾秒鐘內得到的時間我的值將被截斷單integer。有沒有人有任何見解,爲什麼發生這種情況?我曾以爲,除以一個long = 1000000.0會阻止這種截斷。司長被截斷 - Visual C

定時的功能:

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); 

任何幫助理解。

+1

爲什麼你不使用雙? long是一個整數類型。 – rerun

+1

你知道'long'是一個整數類型,不是嗎? –

+0

ahhhh,我道歉。我已經使用double進行了測試,但我沒有更改printf的格式代碼。謝謝您的幫助。 –

回答

3

Long是一個整數型這意味着它不會舉行小數,你可能想使用doubledividerelapsed。有關cplusplus.com的更多信息

請注意,您還需要%lfprintf的值。

糾錯:只是%f如printf格式是顯然enough

2

long類型是整數類型。

問題是,您試圖在long中存儲想要成爲float(或double)的結果。

有兩個問題在這裏: 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);