为什么在0.0 / 0.0时,GCC会产生-nan,而clang和intel会产生+ nan?

约翰尼斯·绍布-Litb

在调试代码时,我发现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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么0%0会产生1?

为什么0/0是NaN但0 / 0.00不是

Matlab:0 <NaN = 0

为什么typeof 1/0是NaN?

为什么series [0]和series [0:1]会产生不同的结果?

将 log 取到大于 0 的数字时产生的 NaN

用0除以0时的NAN

为什么clip-path inset(0 0 0 0)与未设置clip path会产生不同的结果?

NaN 或 0 总和出现

为什么Math.round()对于NaN参数返回0?

为什么Number(null)返回0,而parseFloat(null)返回NaN?

为什么Number('')返回0而parseInt('')返回NaN

为什么 Number([]) 返回 0 而 Number({}) 返回 NaN?

为什么在MATLAB中将angle(0)的值选择为0?我希望它是NaN。

为什么-1 >> 1和0xFFFFFFFF >> 1会产生不同的结果?

为什么 C 或 C++ “-0” 不产生浮点 -0?

如果[0] == 0和0 == [[0]]都为真,那么为什么[0] == [[0]]为假?

为什么++ []会引发错误,但是++ [[]] [0]会产生1?

用 NaN 替换浮点 0

Wordpress Ajax为什么会死('0')

为什么即使在使用 %f 时 pow 也会输出 0?

为什么十进制数字之前为0会产生SyntaxError?

为什么笛卡尔积会产生“ TypeError:在0维数组上的迭代”?

为什么 [0] === [0] 是假的

提取仅包含NaN和0的行

为什么 Pandas 不能使用掩码/替换将 nan 替换为 0 数组?

为什么Elm 0.19中的“ remainderBy 0 100”返回NaN,而不是Int?

为什么整数除以零1/0会产生错误,但浮点数1 / 0.0会返回“ Inf”?

连接到Java套接字时,为什么getInetAddress()返回/ 0:0:0:0:0:0:0:0:1?