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

关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:18:09