αλεχολυτ Asked:2020-08-02 16:41:49 +0000 UTC2020-08-02 16:41:49 +0000 UTC 2020-08-02 16:41:49 +0000 UTC 值“减去 NaN”的语义负载 772 在另一个问题中,发现将零除以包含实数零的变量会得到-nan. #include <iostream> int main() { double zero = 0; std::cout << 0/zero << "\n"; } 对于主要的最流行的编译器,结果是相同的: 铛 海湾合作委员会 MSVC 这个减号有什么实际意义吗,为什么不只是nan? c++ 1 个回答 Voted Best Answer ixSci 2020-08-02T20:17:35Z2020-08-02T20:17:35Z 原来这是因为上面的例子都是在x86架构上运行的,对于FPU有这样一个规律: 当两个源操作数都不是 NaN,但操作生成浮点无效操作异常(参见表 8-10 和 11-1)时,结果通常是 QNaN FP Indefinite(第 4.8.3.7 节)。 摘自英特尔® 64 位和 IA-32 架构软件开发人员手册第 1 卷:基本架构第 4.8.3.5 节。 查看上面引用中提到的表格,我们在那里找到以下操作,它给出 QNaN 作为输出: 除法:∞除以∞;0 乘 0。 那些。正是我们在问题中所拥有的(那里还有其他操作)。如果我们查看第 4.2.2 节中的表 4-3,我们会看到 QNaN 的符号位设置为 1,这解释了输出中的负 NaN。 如果你从语言的角度来看这一切,那么你会得到未定义的行为,所以我们可以看到任何东西。 C++14,[表达式]p4: 如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。 答案的灵感来自 Raymond Chen的精彩帖子。
原来这是因为上面的例子都是在x86架构上运行的,对于FPU有这样一个规律:
摘自英特尔® 64 位和 IA-32 架构软件开发人员手册第 1 卷:基本架构第 4.8.3.5 节。
查看上面引用中提到的表格,我们在那里找到以下操作,它给出 QNaN 作为输出:
那些。正是我们在问题中所拥有的(那里还有其他操作)。如果我们查看第 4.2.2 节中的表 4-3,我们会看到 QNaN 的符号位设置为 1,这解释了输出中的负 NaN。
如果你从语言的角度来看这一切,那么你会得到未定义的行为,所以我们可以看到任何东西。
C++14,[表达式]p4:
答案的灵感来自 Raymond Chen的精彩帖子。