c++ - 将浮点秒数转换为 chrono::duration

标签 c++ stl c++14 c++-chrono

最简单、优雅的转换方式是什么 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. 转换 floatchrono::durationfloat 表示周期为seconds .
  2. 转换结果 duration步骤 1 至 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 。然后使用chrono引擎进行实际计算,改变一个duration进入另一个duration .

round使用实用程序是因为浮点类型容易受到舍入误差的影响。因此,如果浮点值接近纳秒整数,但不精确,人们通常需要该接近值。

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

关于c++ - 将浮点秒数转换为 chrono::duration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69199288/

相关文章:

c++ - Const 限定符和前向引用

c++ - 如何在 main 中使用指针数组?

c++ - map 的迭代器

c++ - 如何重载 std::swap()

c++ - 无法重载现有的 std::vector 函数

c++ - std::vector::assign/std::vector::operator=(const&) 是否保证重用 `this` 中的缓冲区?

c++ - 如何解决比较结构作为键映射 C++

c++ - 使用 for 循环和指针打印 float 组

C++ STL函数模板类型推导

c++ - 是否可以忽略 c++11 的尾随返回类型特性而支持 c++14 的函数返回类型推导特性?