gpt4 book ai didi

c++ - 如何从表示 usec 时间的 32 位 int 转换为表示时间的 32 位 int(以秒为单位的二进制分数)?

转载 作者:太空宇宙 更新时间:2023-11-04 01:15:54 24 4
gpt4 key购买 nike

POSIX 使用struct timeval 来表示时间间隔。

struct timeval
{
time_t tv_sec;
unsigned tv_usec;
};

GHS Integrity 按以下方式表示时间

struct Time
{
time_t Seconds;
unsigned Fraction;
};

例如,0.5秒表示为0x80000000,0.25秒表示为0x40000000

timeval 转换为 Time 的最佳方法是什么?

(p.s. 答案不是将 POSIX 库链接到 Integrity 并使用 POSIX 调用。)

最佳答案

这是一种不寻常的时间表示方式。

无论如何,如果您有 64 位整数或 float (前者更可能在嵌入式系统上使用),有两种简单的方法可以做到这一点:

/* 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 位整数和 float 都不是可用的选项,您可以使用一个额外的变量迭代地完成它。我在想是否有一种比用两个 32 位整数进行等效的迭代 64 位乘法和除法更简单(并且更便宜,考虑到这是计时代码)的方法来进行这种缩放。在我想到的两个想法中,一个不会进行精确的均匀缩放,并且可能会产生最多 9 位偏移的结果,而对此进行补偿的那个结果并不便宜。如果我想到什么新东西,我会把它贴在这里,但这是一个有趣的挑战。还有其他人有好的算法或代码片段吗?也许借助于一个小型的预先计算的表格?

关于c++ - 如何从表示 usec 时间的 32 位 int 转换为表示时间的 32 位 int(以秒为单位的二进制分数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/550686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com