关于 std::numeric_limits<T>::infinity() 的算术运算
Regarding arithemetic operations with std::numeric_limits<T>::infinity()
我有一个特殊的用例,我有一些边缘 w/ double
权重最初设置为 std::numeric_limits<double>::infinity()
。这些权重将在稍后的程序执行中设置为其他值。
既然我们已经了解了上下文,那么接下来就是主要问题了。我需要将这些边权重与我计算的某些权重的平方进行比较,并且为了计算我计算的权重的平方,我还必须对边权重进行平方。当然,这将导致初始的无穷大乘以无穷大。我想知道将双精度集乘以 std::numeric_limits<double>::infinity()
本身是否是定义的行为。我可以期望它保持不变吗?
我什至在 cppreference 上也找不到任何文档。
将此答案限制为 IEEE754,使用 +/-Inf 作为某种起始值会带来一些麻烦。
在 IEEE754 下,
- Inf * 0.0 = NaN
- -Inf * 0.0 = Inf * -0.0 = -NaN
- Inf * Inf = -Inf * -Inf = Inf
- -Inf * Inf = -Inf
Inf 乘以任何正浮点值(包括次正规值)是 Inf,对于 -Inf 也是如此。
换句话说,您需要在乘法时将 +0.0 和 -0.0 视为特殊情况,并且是带符号的负零产生不同结果的罕见情况之一。使用std::isnan
测试,如果不能采用其他方案。
我有一个特殊的用例,我有一些边缘 w/ double
权重最初设置为 std::numeric_limits<double>::infinity()
。这些权重将在稍后的程序执行中设置为其他值。
既然我们已经了解了上下文,那么接下来就是主要问题了。我需要将这些边权重与我计算的某些权重的平方进行比较,并且为了计算我计算的权重的平方,我还必须对边权重进行平方。当然,这将导致初始的无穷大乘以无穷大。我想知道将双精度集乘以 std::numeric_limits<double>::infinity()
本身是否是定义的行为。我可以期望它保持不变吗?
我什至在 cppreference 上也找不到任何文档。
将此答案限制为 IEEE754,使用 +/-Inf 作为某种起始值会带来一些麻烦。
在 IEEE754 下,
- Inf * 0.0 = NaN
- -Inf * 0.0 = Inf * -0.0 = -NaN
- Inf * Inf = -Inf * -Inf = Inf
- -Inf * Inf = -Inf
Inf 乘以任何正浮点值(包括次正规值)是 Inf,对于 -Inf 也是如此。
换句话说,您需要在乘法时将 +0.0 和 -0.0 视为特殊情况,并且是带符号的负零产生不同结果的罕见情况之一。使用std::isnan
测试,如果不能采用其他方案。