C++ NaN 字节表示在赋值期间发生变化

标签 c++ floating-point nan

尝试将 NaN 分配给 x64 处理器上的变量

*dest = *(float*)&sourceNaN;

在哪里

unsigned char sourceNaN[] = {00,00, 0xa0, 0x7f};

浮点指令 fld 和 fstp(在反汇编中看到)将 0xa0 字节更改为 0xe0。因此目的地有一个额外的位设置。有人可以解释为什么会这样吗?这是一个 Windows 应用程序。

汇编语言代码:

005C9B9C  mov         eax,dword ptr [ebp+10h]  
005C9B9F  fld         dword ptr [ebp-80h]  
005C9BA2  fstp        dword ptr [eax] 

最佳答案

0x7fa00000 是一个信号 NaN(“sNaN”)。 0x7fe00000 是一个安静的 NaN(“qNaN”)。我没有听说过 x86 下的这种行为,但在 ARM 下,sNaN 在操作中使用时会转换为相应的 qNaN,同时引发 FP 异常(通常被忽略)。看起来这里正在发生同样的事情。

好消息是,它们都是 NaN。除非您特别依赖信号行为,否则一切正常。

关于C++ NaN 字节表示在赋值期间发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27259234/

相关文章:

c++ - 尝试显示屏幕保护程序的配置窗口时出现问题(来自以高强制完整性级别运行的 GUI 应用程序)

c++ - 如何检测C中的浮点下溢

python - 在 Python 中将 float 与一个非常大的整数相乘

python - Inf 和 NaN 是如何实现的?

javascript - 获取 NaN 而不是值

python - 将值的StandardScaler()作为新列添加到DataFrame会部分返回NaN

c++ - 如何在 C++ 中使用 Cryptolib 加载 puttygen RSA key ?

c++ - #define var 在另一个#define in C

c++ - 未实现 : unexpected ast of kind ltgt_expr in C++

c++ - 为什么 printf 显示 -1.#IND 的 FPTAN 结果?