【发布时间】:2015-11-20 03:59:37
【问题描述】:
当我调试代码时,我发现 GCC 和 Clang 都为 0.0/0.0 生成 nan,这是我所期望的,但 GCC 生成的 nan 将符号位设置为 1,而 Clang 将其设置为 0(在与 ICC 达成协议,如果我没记错的话)。
现在显然这两种形式都是允许的,但我一直想知道为什么0.0/0.0 会使 GCC 输出“否定”结果(打印它会给出-nan),而-(0.0/0.0) 会给出“肯定”结果?更令人困惑的是,-0.0/0.0 又是“否定”了。这是一个不断折叠的怪癖吗?
编辑
实际上,正是不断的折叠使它成为一个积极的 nan。如果我在运行时强制计算,我会在 GCC 和 Clang 上得到负 nan
volatile float zero = 0.0;
std::cout << (zero/zero); // -nan
有人可以解释一下吗? x86 FPU 上的符号位是否设置为 1?
【问题讨论】: