我有一个应用程序,其中某些组件有时会在大型数据流中插入一个qNaN,然后​​使整个处理无效(对包含单个qNaN的 vector 进行FFT会得到一个全qNaN的输出)。现在,我想在行为中捕捉到这一点,并找出原因。

为此,我需要以某种方式在调试过程中发出所有NaN信号。使用x64 CPU执行32位代码,是否可以这样做?

最佳答案

如果要在调试期间进行所有NaN,溢出和Zerodives信令,则可以。

对于gcc:

#include <fenv.h>

#ifndef NDEBUG
feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
#endif

对于Visual Studio(未测试):
#include <float.h>

#ifndef NDEBUG
_clearfp();
_controlfp(_controlfp(0, 0) & ~(_EM_INVALID | _EM_ZERODIVIDE | _EM_OVERFLOW),
           _MCW_EM);
#endif

引用:Microsoftgcc

这些功能允许捕获由浮点运算(溢出,零除,无效运算)产生的NaN或用作某些浮点运算的输入的sNaN。它们不允许捕获用作浮点操作输入的qNaN。对于此类qNaN,找到它们的唯一方法是单独检查每个值(请参阅Luchian Grigore的答案)。

因此,如果要插入qNaN的组件是在同一程序中,还是要捕获它,或者如果该组件在单独的程序中,但是您有其源代码,则只需使用feenableexcept()/_controlfp()启用FP异常(exception)。否则,请使用isnan()(C++ 11)或x != x检查传入数据流中的每个值。

08-28 23:30