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

为何C++中0乘无穷大得到-nan?代码运行结果疑问

为什么inf * 0的计算结果是-nan?

问题代码

#include <iostream>

int main()
{
    double A = 1e3000000;
    double B = 0;
    double C = A * B;

    std::cout << "A = " << A << "\n";
    std::cout << "B = " << B << "\n";
    std::cout << "C = " << C << "\n";
}

运行输出

A = inf
B = 0
C = -nan

问题

使用clang 17及在线C++编译器测试,结果一致,请问为何变量C的结果为负数?


解答

首先,1e3000000远超出了double类型能表示的最大有限值(double的最大有限值约为1.7976931348623157e+308),因此变量A会被转换为正无穷大(+inf)。

根据IEEE 754浮点数标准(C++的double基本都遵循该标准),无穷大与0相乘的结果是NaN(非数字)——这是因为该运算在数学上属于未定义行为。

至于结果是-nan而非nan:IEEE 754标准允许NaN携带符号位,虽然NaN本身没有“正负”的数学含义,但符号位会被保留。在你的测试场景中,编译器或运行时环境在计算inf * 0时,将结果NaN的符号位设置为负,这完全符合标准规定——标准并未强制要求NaN的符号位必须为正,不同实现可以自行选择符号位的设置方式,都是合法的。

另外补充:double类型的0分为正0和负0,若B是负0,结果更可能是负NaN,但即使B是正0,实现依然有权设置负符号位,因为标准对此没有严格限制。


内容的提问来源于stack exchange,提问作者green lantern

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:12:15