【问题标题】:what is the data type for reading a nano second value?读取纳秒值的数据类型是什么?
【发布时间】:2014-05-12 11:12:35
【问题描述】:

我正在读取一个纳秒的值并希望将其存储在一个特定的变量中,这样我就不会丢失数据。有人能告诉我数据类型是什么吗?

例子:

struct timespec ts;
getrawmonotonic(&ts);
end_time = timespec_to_ns(&ts);

end_time 的数据类型可能是什么??

【问题讨论】:

  • 嗯,你用什么函数来读取它?
  • 你的意思是纳秒分辨率的时间点吗?还是以纳秒为单位测量的持续时间?
  • 它不能是负数...是它的属性之一...所以您可以使用无符号数据类型。同样,检查最大范围,您可以阅读。
  • 您有一台可以提供纳秒级结果的机器吗?
  • uint64_t 最有可能

标签: c++ c types


【解决方案1】:

在 C++ 中,这将是 std::chrono::nanoseconds。例如,要找出执行某些代码所花费的(墙)时间长度,您可以这样写:

auto start = std::chrono::system_clock.now();

//do some things
//...

auto end = std::chrono::system_clock.now();
std::chrono::nanoseconds nanoseconds_taken =
    duration_cast<std::chrono::nanoseconds>(end - start);
std::cout << "Took: " << nanoseconds_taken.count() << " nanoseconds\n";

【讨论】:

  • 我修改了我的问题。
  • 您可能需要一个持续时间转换 (duration_cast&lt;nanoseconds&gt;(end - start)),因为system_clock 的持续时间类型不一定可以隐式转换为 nanoseconds
【解决方案2】:

timespec_to_ns 的定义如下:

/**
 * timespec_to_ns - Convert timespec to nanoseconds
 * @ts:         pointer to the timespec variable to be converted
 *
 * Returns the scalar nanosecond representation of the timespec
 * parameter.
 */
static inline s64 timespec_to_ns(const struct timespec *ts)
{
        return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
}

所以你应该将它存储在一个 64 位整数中。

【讨论】:

  • 如何将纳秒值转换为毫秒??
  • 除以一百万。如果要将其存储为浮点值,请使用最佳可用精度 - 只需将其分配给双精度值。
  • uint64_t 和 double 一样??
  • 没有。 uint64_t 是一个 64 位整数。 double 是一个浮点值(通常是 64 位,但理论上可以是任何值)
【解决方案3】:

这真的取决于timespec_to_ns 的确切规范。

For linux,类型为s64。在您自己的系统上,您应该能够通过查看声明 timespec_to_ns 的标头来确定类型。

在一般情况下(仅适用于 C++),您可以使用auto 自动推断出正确的返回类型:

struct timespec ts;
auto end_time = timespec_to_ns(&ts);

//Convert to milliseconds:
auto millis = end_time/1000000.

【讨论】:

  • 如何将纳秒值转换为毫秒??
  • 除以1000000(可能在转换为浮点类型之后)。
  • 如何将其转换为浮点数??转换后我应该使用哪种数据类型来存储值??能举个例子吗??
  • @user3615655:我添加了一个示例。如果你在1000000.后面去掉.,它会被一个整数除,你会得到一个整数结果。
  • uint64_t 和 double 一样??
猜你喜欢
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
相关资源
最近更新 更多