You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用无穷值初始化std::chrono::duration<double>是否合法及行为如何?

关于std::chrono::duration无穷值的合法性与加减行为

好问题!咱们一步步来拆解:

首先明确:创建包含无穷值的std::chrono::duration<double>是完全合法的。

C++标准并没有限制浮点类型的duration存储的值范围——毕竟它的底层就是double,而double本身支持IEEE 754规定的无穷大、NaN等特殊值。你写的这行代码:

std::chrono::duration<double>{ std::numeric_limits<double>::infinity() };

完全符合标准要求,现代编译器(只要环境支持IEEE 754浮点,这几乎是所有平台的标配)都不会报错。

接下来聊加减操作的行为:这本质上由底层double的算术规则决定,chrono::duration只是对数值做了单位封装,加减运算会直接委托给底层类型的计算,所以大部分情况会符合你对无穷值的预期,但有几个细节要注意:

  • 无穷值和任何有限值加减:结果仍然是同符号的无穷大。比如inf + 2.5s、inf - 100ms,结果都会保持无穷大。
  • 同符号无穷值相加:结果还是同符号的无穷大(比如inf + inf = inf,-inf + (-inf) = -inf)。
  • 正无穷和负无穷相加减:结果会变成NaN。比如inf + (-inf)、inf - inf,这时候就不再是无穷值了——这是IEEE 754浮点运算的固有特性,不是chrono的特殊处理。

你提到cppreference只在duration_cast里提了浮点转整数的情况,这很正常:因为浮点duration本身的数值行为就是遵循底层浮点类型的,标准不需要额外重复规定,只要duration的算术操作满足对应的代数要求即可,而IEEE 754的运算规则是符合这些要求的。

内容的提问来源于stack exchange,提问作者James Picone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:24:43