为何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
相关产品推荐
相关产品推荐

