POSIX用于struct timeval
表示时间间隔.
struct timeval { time_t tv_sec; unsigned tv_usec; };
GHS Integrity Time
以下列方式表示:
struct Time { time_t Seconds; unsigned Fraction; };
例如,0.5sec表示为0x80000000
,0.25sec表示为0x40000000
.
什么是要转换的最佳方式timeval
来Time
?
(ps答案不是将POSIX库链接到Integrity并使用POSIX调用.)
这是一种代表时间的不寻常方式.
无论如何,如果你有64位整数或浮点(前者更有可能在嵌入式系统上),有两种简单的方法可以做到这一点:
/* assuming long is 64-bit and int is 32-bit or in general long twice the size of int: */ Fraction = (long) tv_usec * UINT_MAX / 1000000 /* usecs to fraction */ tv_usec = (long) Fraction * 1000000 / UINT_MAX /* fraction to usecs */ /* assuming floating points are available: */ Fraction = tv_usec * ((double) UINT_MAX / 1000000) /* usecs to fraction */ tv_usec = Fraction * ((double) 1000000 / UINT_MAX) /* fraction to usecs */
显然两者都只是整数近似,因为一个尺度中的大多数值不能在另一个尺度中表示为整数.在一个方向上,您可能会失去一些精度,因为Fraction
表单可以表示更精细的时间 - Fraction
表单的一个增量小于0.00024微秒.但是,只有当你的计时器能够实际测量那些不太可能的值时 - 大多数计时器甚至无法以微秒级进行测量,并且你看到的值tv_usec
通常是四舍五入的.
如果64位整数和浮点都不是可用的选项,则可以使用额外变量迭代地执行.我正在考虑是否有更简单(并且更便宜,考虑到这是时序代码)的方式进行这样的缩放比做等效的迭代64位乘法和除法有两个32位整数.在我想到的两个想法中,一个人不会做出精确的均衡缩放,并且可能产生最多9位的结果,并且补偿的结果不会更便宜.如果我想到了新的东西,我会在这里发布,但这是一个有趣的挑战.有没有其他人有一个好的算法或片段?也许借助一张小型预先计算的桌子?