为什么海湾合作委员会产生-nan和clang以及英特尔收益率+为0.0 / 0.0?

时间:2015-08-26 08:04:13

标签: c++ gcc nan ieee-754

当我调试代码时,我发现GCC和Clang都为0.0/0.0产生了纳米,这正是我所期待的,但是GCC产生一个nan,其符号位设置为1,而Clang将其设置为0 (如果我没记错的话,与国际刑事法院达成协议)。

现在显然允许这两种形式,但我一直想知道为什么0.0/0.0会使GCC输出为“负面”结果(打印它会给出-nan),而-(0.0/0.0)给出“正面” “结果?更令人困惑的是-0.0/0.0再次“消极”。这是一个不变的折叠怪异吗?

修改

实际上,正常的折叠使它成为一个积极的纳米。如果我在运行时强制计算,我会在GCC和Clang上得到负值

volatile float zero = 0.0;
std::cout << (zero/zero); // -nan

有人可以对此嗤之以鼻吗? x86 FPU上的符号位是否设置为1?

1 个答案:

答案 0 :(得分:7)

IEEE-754未指定NaN的符号:

  

当输入或结果为NaN时,此标准不会   解释NaN的标志。但请注意,bit上的操作   字符串    - copy,negate,abs,copySign - 指定NaN结果的符号位,有时基于NaN操作数的符号位。该   逻辑谓词totalOrder也受a的符号位的影响   NaN操作数。对于所有其他操作,此标准未指定   NaN结果的符号位,即使只有一个输入NaN,   或者NaN是由无效操作产生的。

现在让我们看一下Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 1: Basic Architecture

其中,英特尔确实在这种情况下指定了NaN的特定值,称为QNaN Floating-Point Indefinite(参见表4-1),该值在#IA(无效算术异常)时返回(请参阅表8-10)。 找0除0。

您会看到该值已设置。