在调试代码时,我发现GCC和Clang都产生0.0/0.0
了我所期望的nan,但是GCC产生了一个符号位设置为1的nan,而Clang将其设置为0(与ICC一致,如果我请记住正确)。
现在显然可以使用两种格式,但是我一直想知道为什么0.0/0.0
要使GCC输出“负”结果(打印给出-nan
),并-(0.0/0.0)
给出“正”结果?更令人困惑的是,它又-0.0/0.0
是“负”的。这是一个不断变化的怪异现象吗?
编辑
实际上,不断的折算使它成为一个积极的方面。如果我在运行时强制执行计算,那么我在GCC和Clang上都会得到负数nan
volatile float zero = 0.0;
std::cout << (zero/zero); // -nan
有人可以帮忙吗?x86 FPU上的符号位是否设置为1?
IEEE-754没有指定NaN的符号:
当输入或结果为NaN时,此标准不会解释NaN的符号。但是请注意,对位字符串的操作-copy,negate,abs,copySign-指定NaN结果的符号位,有时基于NaN操作数的符号位。逻辑谓词totalOrder也受NaN操作数的符号位影响。对于所有其他操作,即使只有一个输入NaN或无效操作产生了NaN,该标准也未指定NaN结果的符号位。
现在让我们看一下Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 1: Basic Architecture
。
其中,在这种情况下,Intel确实指定了NaN的特定值,该值称为QNaN Floating-Point Indefinite
(请参见表4-1),并在#IA
(无效的算术异常)时返回(请参见表8-10)。寻找0除以0。
您会看到为该值设置了符号位。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句