将浮点秒转换为 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 的一个关键方面。安全转化为:最不可能包含编程错误。
为此有两个步骤:
- 将
float
转换为由 float
表示且周期为 seconds
的 chrono::duration
。
- 将步骤 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)。
将 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
转换为由float
表示且周期为seconds
的chrono::duration
。 - 将步骤 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)。