最简单、优雅的转换方式是什么 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 的一个关键方面。安全意味着:最不可能包含编程错误。
有两个步骤:
- 转换
float
到chrono::duration
由float
表示周期为seconds
. - 转换结果
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.html 或 https://github.com/HowardHinnant/date/blob/master/include/date/date.h )。
关于c++ - 将浮点秒数转换为 chrono::duration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69199288/