如何从双精度计数器初始化timespec

如何从双精度计数器初始化timespec,c,C,我想从double初始化timespec结构。如何实现分数部分到纳秒的精确转换 double x = 10.1; struct timespec tp; tp.tv_sec = (long) x; tp.tv_nsec = (x - tp.tv_sec) * 1000000000L; printf("%ld %ld\n", tp.tv_sec, tp.tv_nsec); // 10 99999999 <- actual (BAD) // 10 100000000 <- expect

我想从double初始化timespec结构。如何实现分数部分到纳秒的精确转换

double x = 10.1;
struct timespec tp;
tp.tv_sec = (long) x;
tp.tv_nsec = (x - tp.tv_sec) * 1000000000L;
printf("%ld %ld\n", tp.tv_sec, tp.tv_nsec);
// 10 99999999  <- actual (BAD)
// 10 100000000 <- expected
我甚至设想了一种直接从字符串初始化的变通方法(例如:“10.1”)。这是可行的,因为我的初始化值不会随时间而改变

我最初的问题有什么解决办法吗? 初始化timespec有更好的方法吗


我想要一个可扩展的解决方案。我不想从十分之一秒或百分之一秒开始初始化。

只需在顶部附近添加以下内容:

x += 0.5e-9.

这将为timespec的最大精度增加一半的“epsilon”(最小值变化),有效地“舍入”输入。请注意,如果x的值超过精度的15位小数,它将永远不会精确,因为这是双精度的。但是,如果你像上面那样“取整”,10.1应该可以正常工作。

减法和乘法运算符在哪?你试过
tp.tv\u nsec=(x-tp.tv\u sec)*1000000000L在让时间更正之前进行向下投票非常好,谢谢你。+1。可能需要根据OP的“我想要一个可扩展的解决方案”进行扩展。在我看来,它的可扩展性足够强。所谓可伸缩性,我的意思是,如果需要更高的精度,我不想将init值从一个基转换为另一个基(比如将十分之一转换为百分之一,然后再转换为百分之一)。此外,最大理论计时器精度为1纳米。我永远都不需要。如果解决方案的工作时间达到微秒,就已经足够了。
x += 0.5e-9.