当我调试代码时,我发现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?
答案 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。
您会看到该值已设置。