关于 std::numeric_limits<T>::infinity() 的算术运算

Ale*_* Ni 4 c++ stl std multiplication infinity

我有一个特殊的用例,其中一些边的权double重最初设置为std::numeric_limits<double>::infinity()。这些权重将在稍后的程序执行中设置为其他值。

现在我们已经了解了背景,这是主要问题。我需要将这些边权重与我计算的某些权重的平方进行比较,并且为了考虑计算的权重的平方,我还必须对边权重进行平方。当然,这将导致初始无穷大乘以无穷大。我想知道将双精度集乘以std::numeric_limits<double>::infinity()自身是否是定义的行为。我可以期望它保持不变吗?

即使在 cppreference 上我也找不到任何文档。

Bat*_*eba 5

将这个答案限制在 IEEE754 上,使用 +/-Inf 作为某种起始值会带来一些麻烦。

在 IEEE754 下,

  1. 天道酬勤 * 0.0 = NaN
  2. -Inf * 0.0 = Inf * -0.0 = -NaN
  3. 天道酬勤 * 天道酬勤 = - 天道酬勤 * - 天道酬勤 = 天道酬勤
  4. -Inf * Inf = -Inf

Inf 乘以任何正浮点值(包括次正规值)就是 Inf,-Inf 也类似。

换句话说,您需要在乘法时将 +0.0 和 -0.0 视为特殊情况,并且是有符号负零产生不同结果的罕见情况之一。如果不能采用其他方案,则用于std::isnan测试。