我有一个应用程序,其中某些组件有时会在大型数据流中插入一个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
引用:Microsoft,gcc。
这些功能允许捕获由浮点运算(溢出,零除,无效运算)产生的NaN或用作某些浮点运算的输入的sNaN。它们不允许捕获用作浮点操作输入的qNaN。对于此类qNaN,找到它们的唯一方法是单独检查每个值(请参阅Luchian Grigore的答案)。
因此,如果要插入qNaN的组件是在同一程序中,还是要捕获它,或者如果该组件在单独的程序中,但是您有其源代码,则只需使用
feenableexcept()
/_controlfp()
启用FP异常(exception)。否则,请使用isnan()
(C++ 11)或x != x
检查传入数据流中的每个值。