2011-04-26 125 views
0

在下面的代碼中發生了一件奇怪的事情。函數get_time_in_seconds()是一個我自己構建和測試的自定義函數,在直接從long printf語句中調用時可以正常工作。但是,當我將其分配給變量curr_time2時,它不存儲期望值。任何猜測爲什麼?這段代碼有什麼問題?

while (1) 
{ 
    count++; 
    bytes_read = recvfrom(sock,recv_data,1024,0,(struct sockaddr *)&client_addr, (socklen_t*)&addr_len); 
    recv_data[bytes_read] = '\0'; 
    strcpy(buff,inet_ntoa(client_addr.sin_addr)); 
    printf("\nAt %lf (%s , %d, Num : %d) said : ",get_time_in_seconds(),buff,ntohs(client_addr.sin_port),get_id(buff)); 
    printf("%s", recv_data); 
    curr_time2=get_time_in_seconds(); 
    printf("%lf\n",curr_time2); 
//  data.nodeid=get_id(buff); 
//  data.time = curr_time2; 
    //printf("%f,%f\n",data.time,curr_time2); 
    store_packetdata(&data); 
    fflush(stdout); 
} 

示例輸出:

在1303829191.827888(10.22.6.162, 35355,貨號:1)所述:505 1303829248.000000

在1303829196.827893(10.22.6.162, 35355,貨號:1)說:506 1303829248.000000

at 1303829201.827898(10.22.6.162, 35355,貨號:1)所述:507 1303829248.000000

在1303829206.827903(10.22.6.162, 35355,貨號:1)所述:508 1303829248.000000

在1303829211.827908(10.22.6.162, 35355,貨號:1)所述:509 1303829248.000000

在1303829216.827913(10.22.6.162, 35355,貨號:1)所述:510 1303829248.000000

在1303829221.827918(10.22.6.162, 35355,貨號:1)所述:511 1303829248.000000

在1303829226.827923(10.22.6.162, 35355,貨號:1)所述:512 1303829248.000000

在1303829231.827928( 10.22.6.162, 35355,貨號:1)所述:513 1303829248.000000

在1303829236.827933(10.22.6.162,35355,貨號:1)所述:514 1303829248.000000

在1303829241.827938(10.22.6.162,35355,民:1)說:515 1303829248.000000

編輯:我現在已經解決了這個問題。最初,curr_time2和get_time_in_sconds()的返回類型都是浮動的。當我將這兩個代碼轉換爲兩倍時,代碼開始工作。但是,我想知道的是爲什麼printf()打印準確,而curr_time2只存儲該值的近似值。

新的聲明(更改舊的float浮動)。

double get_time_in_seconds() 
{ 
    gettimeofday(&tv, NULL); 
    double retval= (double)tv.tv_sec + ((double)tv.tv_sec)/1000000; 
    return retval; 
} 
    static double curr_time2=0.0; 
+1

@ apoorv020:你能發佈你的get_time_in_second函數和curr_time2的聲明嗎? – Heisenbug 2011-04-26 14:34:34

+0

'curr_time2'是什麼類型? – pmg 2011-04-26 14:35:36

+0

什麼類型是curr_time2? get_time_in_seconds()返回什麼數據類型? – Axel 2011-04-26 14:36:24

回答

2

不知道curr_time2的類型我只能猜測,但它似乎被聲明爲整數,而不是浮點數。

如果不是這種情況,請發佈更多的代碼(函數和參數聲明),因爲此刻我不能再做任何更多的猜測。

1

編輯

後>爲什麼printf()的被打印準確

功能printf()是一個可變參數函數。
參數「遭受」默認轉換:基本上charshortint; floatdouble

在代碼

printf("%lf", float_value); 

float_value是自動轉換爲double%lf轉換規範處理相同C99 %f"%lf"是在C89的誤差),其需要一個double值。

+0

但是不應該函數返回一個浮點值,在printf之前失去精度值使用該值? – apoorv020 2011-04-26 14:48:29

+0

我想它應該會失去精度。雖然我在標準中找不到相關的段落。 *在一個小的測試文件中,gcc(和[ideone編譯器](http://ideone.com/8hihD))表現得像預期的那樣,失去了精度*。 – pmg 2011-04-26 15:03:19

1

大多數C編譯器實際上不會將float的值作爲參數傳遞或從函數返回它們 - 它們會默默轉換爲double。所以當你直接將get_time_in_seconds()的返回值傳遞給printf時,它是以雙精度完成的。但是,當您將其存儲在float變量curr_time2中時,它會將其轉換爲商店的單精度並返回到雙精度傳遞給printf。

。注意,通過規範以上是允許的行爲,但不是必需的行爲 - C編譯器總是允許(由規範)來使用額外的精度對於中間值,如函數參數和返回值