2012-09-19 23 views
2
#include <stdio.h> 
#include <sys/time.h> 

int main() 
{ 
    float time; 
    struct timeval tv; 
    gettimeofday(&tv, NULL); 
    time = tv.tv_sec + (tv.tv_usec/1000000.0); 
    printf("time: %f\n", time); 
    return 0; 
} 

運行二進制這段代碼重複產生,我往往會得到相同的時間值:時間沒有更新,因爲它應該

$ ./a.out 
time: 1348059520.000000 
$ ./a.out 
time: 1348059520.000000 
$ ./a.out 
time: 1348059520.000000 

出現這種情況,直到幾秒鐘後,在我獲得更新時間價值。

+0

'int main()'是未定義的行爲。這是C,其中'()'與'(void)'不一樣。 – Jens

回答

3

看來,float是太小,無法包含的tv.tv_sec + (tv.tv_usec/1000000.0)結果。改爲使用double

#include <stdio.h> 
#include <sys/time.h> 

int main() 
{ 
    double time; 
    struct timeval tv; 
    gettimeofday(&tv, NULL); 
    time = tv.tv_sec + (tv.tv_usec/1000000.0); 
    printf("time: %f\n", time); 
    return 0; 
} 
+3

不僅'出現' - 這正是麻煩。 'float'可以存儲6-7位十進制數字;第二級的時間標記在整數部分需要10個十進制數字,所以要得到6個小數位,則需要16位十進制數字,它只在'double'範圍內(假設IEEE 754浮點算法)。 –

+0

+1 _Never_把時間放在'float'中。總是使用'double'或'time_t',因爲我已經學會了艱難的道路。附:使用gcc(和其他編譯器)的影子警告,不應該使用'time'作爲變量名稱。 –

2

爲什麼你使用浮點數?

#include <stdio.h> 
#include <sys/time.h> 

int main (void) 
{ 
    struct timeval tv; 
    gettimeofday (&tv, NULL); 
    printf ("time: %d.%06d\n", (int)tv.tv_sec, (int)tv.tv_usec); 
    return 0; 
} 

./a.out 
time: 1348067289.069908 

看起來輕飄,但它是INTY :-)由於微秒值的範圍是從0..999999所有你需要做的是零到6位數字。不需要FP算術。

+0

'%.6d'會更習慣...... –

+1

順便說一句,我更喜歡這個答案,以更好地完成OP所需的任務,但Tshepang的答案更好地解釋了OP遇到的特定問題的機制。無論如何,這兩個都是+1。 –

相關問題