【问题标题】:Time from gettimeofday not updating as it should从 gettimeofday 开始的时间没有按照应有的方式更新
【发布时间】:2012-09-19 13:04:50
【问题描述】:
#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

这种情况会发生,直到几秒钟后我得到更新的时间值。

【问题讨论】:

  • int main() 是未定义的行为。这是 C,其中 ()(void) 不同。

标签: c gettimeofday


【解决方案1】:

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

【讨论】:

  • 不仅仅是“出现”——这正是问题所在。 float可以存储6-7个十进制数字;第二级的时间戳在时间的整数部分需要 10 个小数位,因此要获得 6 个小数位,您也需要 16 个小数位,正好在 double 的范围内(假设 IEEE 754 浮点运算)。
  • +1 从不把时间花在float上。始终使用doubletime_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 算法。

【讨论】:

  • 顺便说一句,我更喜欢这个答案作为实现 OP 想要的一种方式,但 Tshepang 的答案更好地解释了 OP 遇到的具体问题的机制。无论如何,对两者都 +1。
猜你喜欢
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2011-09-30
相关资源
最近更新 更多