2011-04-26 128 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编译器总是允许(由规范)来使用额外的精度对于中间值,如函数参数和返回值