【发布时间】:2018-09-06 17:22:51
【问题描述】:
像这样制作和使用具有无穷大的std::chrono::duration<double>'s 是否合法?
std::chrono::duration<double>{ std::numeric_limits<double>::infinity() };
它会表现得“像我预期的那样”,在与其他持续时间相加或相减时保持无限值吗?
我已经挖掘了 cppreference,但我发现讨论这个问题的唯一内容是duration_cast 上的页面,并指出:
当浮点值为 NaN、无穷大或太大而无法由目标的整数类型表示时,从浮点持续时间转换为整数持续时间会受到未定义行为的影响。否则,转换为整数持续时间会被截断,就像将任何 static_cast 转换为整数类型一样。
这似乎暗示它是合法的,但只是以一种反手的方式。
(我使用该类型来表示“请在 X 秒内唤醒我”的方式,而正无穷大是一个有用的标记来表示“我真的不在乎我什么时候醒来”)
【问题讨论】:
-
确定以无穷大作为操作数的运算结果的规则很简单:用有限数 x 代替无穷大,并在 x 趋于无穷大时取其极限。来自What Every Computer Scientist Should Know About Floating-Point Arithmetic
-
@Yola 我不是用双精度数做算术,我用
std::chrono::duration<double>做它,它可能对操作的域和范围有自己的看法。特别是因为std::chrono::duration<some integral type>是模板的更常见用例。 -
你会的。
constexpr duration& operator+=(const duration& d); Effects: As if by : rep_ += d.count();和constexpr rep count() const; Returns: rep_.在你的情况下,_rep是double。 -
还要考虑你的设计是否会更好,用一个单独的状态变量来表示“不关心”而不是一个显着的值。如果您使用双打来表示时间,我怀疑您是否担心紧凑性。我很好奇您想要使用浮点值来表示时间的原因是什么。除非您需要覆盖很大的范围并在更短的时间内具有更高的精度,否则我自己想不出一个好的用途。如果您想要更高的精度,您可以考虑使用 std::chrono::microseconds。
-
浮点在很多方面都比量化值更方便,并且代码与一些将时间视为浮点秒数的东西互操作(即不是 std::chrono,只是双)。
标签: c++ c++11 language-lawyer chrono