Windows 使用NaN调用std::abs()会更改x87上的浮点控制字

Windows 使用NaN调用std::abs()会更改x87上的浮点控制字,windows,visual-studio-2015,floating-point,x86,precision,Windows,Visual Studio 2015,Floating Point,X86,Precision,我们在一个单元测试目标(Windows 32位,VS2015)中发现了以下行为。在执行以下操作时 #include <float.h> #include <stdio.h> #include <complex> int main() { unsigned int cw; _controlfp_s(&cw, 0, 0); printf("before %.04x\n", cw); std::abs(std::numeric_limits

我们在一个单元测试目标(Windows 32位,VS2015)中发现了以下行为。在执行以下操作时

#include <float.h>
#include <stdio.h>
#include <complex>

int main()
{
  unsigned int cw;
  _controlfp_s(&cw, 0, 0);
  printf("before %.04x\n", cw);
  std::abs(std::numeric_limits<double>::quiet_NaN());
  _controlfp_s(&cw, 0, 0);
  printf("after %.04x\n", cw);
}
#包括
#包括
#包括
int main()
{
无符号整数连续波;
_控制fp_s(&cw,0,0);
printf(“在%.04x\n之前”,cw);
std::abs(std::numeric_limits::quiet_NaN());
_控制fp_s(&cw,0,0);
printf(“在%.04x\n之后”,cw);
}
浮点控制字从
0x9001f
更改为
0xc001f
。因此,精度控制从
\u PC_53
(53位精度)更改为
\u PC_64
(64位精度)。另见


这反过来会在我们的测试中触发不同的浮点结果。我们只在32位windows系统上看到这种行为。有没有人能帮助理解上述行为?我找不到任何关于这种行为的文档,也找不到任何在
std::abs
的汇编中更改浮点控制字的内容。

无需复制。不能说我期待一个。确保应用更新,并在安装了更新2后进行验证。请记住,VS2015不再使用FPU指令。谢谢,我将检查我们安装的更新。您是否在x86或x64 CPU上运行过此功能?从C的角度(可能是C++)发布
FLT\u EVAL\u方法的结果。我怀疑它不是零。也许编译选项会影响这一点。我检查了FLT_EVAL_方法的值,如果出现错误,该值为0。同样,VS2015更新3也会出现这种情况。我们也遇到了同样的问题。我不记得Visual Studio的版本,但它也可能是2015年的版本。在2017年选中它,您的程序将呈现两个相同的控制字。换句话说,它似乎是固定的。奇怪的是,我无法在2013年或2015年对其重新进行更新2。我必须说我现在有点糊涂了。没有责备。不能说我期待一个。确保应用更新,并在安装了更新2后进行验证。请记住,VS2015不再使用FPU指令。谢谢,我将检查我们安装的更新。您是否在x86或x64 CPU上运行过此功能?从C的角度(可能是C++)发布
FLT\u EVAL\u方法的结果。我怀疑它不是零。也许编译选项会影响这一点。我检查了FLT_EVAL_方法的值,如果出现错误,该值为0。同样,VS2015更新3也会出现这种情况。我们也遇到了同样的问题。我不记得Visual Studio的版本,但它也可能是2015年的版本。在2017年选中它,您的程序将呈现两个相同的控制字。换句话说,它似乎是固定的。奇怪的是,我无法在2013年或2015年对其重新进行更新2。必须说我现在有点困惑。