关于C++中std::numeric_limits<double>::infinity()自乘的定义行为及结果的技术咨询
关于std::numeric_limits::infinity()自乘的定义行为问题
放心,这个操作是完全符合定义的,而且你可以预期运算结果保持为正无穷大——不用担心中途出现未定义行为或者奇怪的结果。
先给你明确核心依据:
- 现代C++实现里的
double几乎都遵循IEEE 754浮点数标准,而std::numeric_limits<double>::infinity()返回的正是标准里的正无穷大值。 - 根据IEEE 754的规则,正无穷大与自身相乘的结果就是正无穷大;同理,负无穷大自乘也是正无穷大,正负无穷大相乘则是负无穷大。
至于你说在cppreference上没找到直接说明,其实cppreference在std::numeric_limits::infinity的条目里提到它返回的是符合IEEE 754规范的无穷大值,而IEEE 754的运算规则是当前主流编译器(比如GCC、Clang、MSVC)默认遵循的浮点数运算标准,除非你特意开启了非标准的编译选项,否则这个行为是完全稳定可预期的。
你可以用这段简单的代码验证一下:
#include <iostream> #include <limits> #include <cmath> int main() { const double inf = std::numeric_limits<double>::infinity(); const double inf_squared = inf * inf; std::cout << std::boolalpha; std::cout << "inf * inf is positive infinity? " << (std::isinf(inf_squared) && inf_squared > 0) << std::endl; return 0; }
运行后会输出true,直接验证了结果符合预期。
总结一下:你的场景里,初始化为无穷大的边权重自乘是安全的,结果会保持无穷大,不会出现未定义行为,可以放心使用。
内容的提问来源于stack exchange,提问作者Alex Ni
相关产品推荐
相关产品推荐

