从双倍到时间的转换

Conversion from double to time

本文关键字:转换 时间      更新时间:2023-10-16

我正在开发的应用程序使用双精度类型进行距离计算。因此,最后我有一个变量类型双精度(比如deferTime = 0.024 seconds(,这是一个基于两个节点之间距离的比率。

我想使用此比率来安排类型time::seconds的事件。在 API 定义下方:

scheduleEvent (const time::nanoseconds & after, const EventCallback & callback)

在我的库文件中,我声明deferTime如下:

time::seconds meanWaiting;

在我的.cpp文件中,我将比率分配给deferTime:(**使用秒而不是纳秒更新**(

meanWaiting = std::chrono::duration<double>{(maxWait * 
(maxDistance - distance) / maxDistance)};

但我收到以下错误:

error: no match for ‘operator=’ (operand types are ‘boost::chrono::seconds {aka boost::chrono::duration<long int>}’ and ‘std::chrono::duration<double>’)
meanWaiting = std::chrono::duration<double>{(maxWait * (maxDistance - distance) / maxDistance)};
^
In file included from /usr/include/boost/chrono/chrono.hpp:11:0,
from /usr/include/boost/chrono/include.hpp:15,
from /usr/include/boost/chrono.hpp:17,
from /usr/local/include/ndn-cxx/util/time.hpp:26,
from /usr/local/include/ndn-cxx/name-component.hpp:28,
from /usr/local/include/ndn-cxx/name.hpp:30,
from /usr/local/include/ndn-cxx/interest.hpp:25,
from ./../core/common.hpp:57,
from <command-line>:0:
/usr/include/boost/chrono/duration.hpp:465:19: note: candidate: boost::chrono::duration<Rep, Period>& boost::chrono::duration<Rep, Period>::operator=(const boost::chrono::duration<Rep, Period>&) [with Rep = long int; Period = boost::ratio<1l>]
duration& operator=(const duration& rhs) = default;
^
/usr/include/boost/chrono/duration.hpp:465:19: note:   no known conversion for argument 1 from ‘std::chrono::duration<double>’ to ‘const boost::chrono::duration<long int>&’

可以在此处找到 ndn-cxx 库。

using namespace std::chrono;
meanWaiting = duration_cast<nanoseconds>(
duration<double>{(maxWait * (maxDistance - distance) / maxDistance)});

duration<double>将您的替身变成存储为双精度seconds。 接下来,您将这些seconds投射到nanoseconds.

在 C++17 中,如果需要,您可以将duration_cast替换为其他舍入模式:

  • duration_cast:截断为零。
  • floor:截断为负无穷大。
  • ceil:截断到正无穷大。
  • round:向最接近的积分舍入,以平局为偶数。

如果它对你的应用程序很重要,你不能等到C++17,那么这些开源实现就四处游荡,很容易找到。

通常,有两种情况需要使用duration_cast或其他一些显式舍入模式:

  1. 当您将精细持续时间分配或复制到粗持续时间时(例如nanosecondsseconds(,以及

  2. 从基于浮点的持续时间分配或复制到基于积分的持续时间时。

上述两种转换都涉及截断错误。 因此<chrono>要求您通过使用duration_cast明确确认您希望截断。

对于不涉及截断错误的转换(例如,从整秒到整纳秒,或整数持续时间到任何浮点持续时间(,可以使用隐式转换语法。

在修改后的答案中,meanWaitingseconds而不是nanoseconds,仍然需要duration_cast,因为您将截断双精度duration的小数部分:

meanWaiting = duration_cast<seconds>(
duration<double>{(maxWait * (maxDistance - distance) / maxDistance)});

有关<chrono>的完整视频教程,请参阅我的Cppcon 2016演讲:https://www.youtube.com/watch?v=P32hvk8b13M