将浮点秒转换为 chrono::duration

Convert float seconds to chrono::duration

float 时间(以秒为单位)转换为 std::chrono::duration<int64_t, std::nano> 的最简单优雅的方法是什么?

它只是将秒转换为纳秒并传递给 std::chrono::duration 构造函数吗?

我试过这个代码:

constexpr auto durationToDuration(const float time_s)
{
    // need to convert the input in seconds to nanoseconds that duration takes
    const std::chrono::duration<int64_t, std::nano> output{static_cast<int64_t>(time_s * 1000000000.0F)};
    return output;
}

但它在许多输入值上的转换效果不佳 time_s

最好的方法也是最简单的 最安全。安全是使用 chrono 的一个关键方面。安全转化为:最不可能包含编程错误。

为此有两个步骤:

  1. float 转换为由 float 表示且周期为 secondschrono::duration
  2. 将步骤 1 的结果 duration 转换为 nanoseconds(与 duration<int64_t, std::nano> 相同)。

这可能看起来像这样:

constexpr
auto
durationToDuration(const float time_s)
{
    using namespace std::chrono;
    using fsec = duration<float>;
    return round<nanoseconds>(fsec{time_s});
}

fsec 是步骤 1 的结果类型。它完全没有计算,只是将类型从 float 更改为 chrono::duration。然后使用计时引擎进行实际计算,将一个 duration 更改为另一个 duration.

使用 round 实用程序是因为浮点类型容易出现舍入错误。因此,如果浮点值接近整数纳秒,但不精确,则通常需要接近的值。

但是 std::chrono::round 实际上是一个 C++17 工具。对于 C++14,只需使用网上流传的免费开源版本之一 (http://howardhinnant.github.io/duration_io/chrono_util.html or https://github.com/HowardHinnant/date/blob/master/include/date/date.h)。