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

Regarding arithemetic operations with std::numeric_limits<T>::infinity()

提问人:Alex Ni 提问时间:4/19/2022 更新时间:4/19/2022 访问量:123

问:

我有一个特殊的用例,其中我有一些带权重的边缘最初设置为 .这些权重将在程序执行的后期设置为其他内容。doublestd::numeric_limits<double>::infinity()

现在我们有了上下文,这是主要问题。我需要将这些边缘权重与我计算的某个权重的平方进行比较,并且为了计算出重量的平方,我还必须对边缘权重进行平方。当然,这将导致无穷大乘以无穷大。我想知道将双倍集乘以本身是否是定义的行为。我能指望它保持不变吗?std::numeric_limits<double>::infinity()

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

C++ STL std 乘法无 穷大

评论

0赞 Scheff's Cat 4/19/2022
乍一看,我想知道你的担忧。出于好奇,我用谷歌搜索了一下。现在,我得出的结论是,你的担忧是非常合理的。仅供参考:关于 IEEE 754 中指定的涉及无穷大和 NaN 的浮点计算的结果?,浮点运算是否会导致 IEC 559/IEEE 754 浮点类型的无穷大未定义行为
0赞 Scheff's Cat 4/19/2022
这个更有前途:std::numeric_limits::infinity() 的倒数是零吗? 这把我引向了无穷大和 NaN: 基本运算和数学函数都接受无穷大和 NaN 并产生合理的输出。 然而,这是关于 GNU C 库的。我不知道它与 C++ 标准有什么关系。
0赞 François Andrieux 4/19/2022
这是否取决于基础表示?如果是这样,你是在要求 IEEE 754 吗?
0赞 Paul Sanders 4/19/2022
这里真的有必要使用无穷大吗?的平方根(也许为了安全起见会被敲掉一点)你会吗?std::numeric_limits<double>max()

答:

5赞 Bathsheba 4/19/2022 #1

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

在IEEE754下,

  1. Inf * 0.0 = NaN
  2. -inf * 0.0 = inf * -0.0 = -NaN
  3. Inf * Inf = -Inf * -Inf = Inf
  4. -inf * inf = -inf

Inf 乘以任何正浮点值(包括次正态值)是 Inf,对于 -Inf 也是如此。

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