如何在C++中跟踪NaN

use*_*900 30 c++ debugging floating-point

我将使用C++进行一些数学计算.输入浮点数是有效数字,但在计算之后,结果值为NaN.我想跟踪NaN值出现的点(可能使用GDB),而不是isNan()在代码中插入很多.但我发现即使是这样的代码也不会在出现NaN值时触发异常.

double dirty = 0.0;
double nanvalue = 0.0/dirty;
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议一种跟踪NaN或将NaN变为异常的方法吗?

Jim*_*wis 37

既然你提到使用gdb,这里有一个与gcc一起使用的解决方案 - 你想要在下面定义的函数fenv.h:

#define _GNU_SOURCE
#include <fenv.h>
#include <stdio.h>

int main(int argc, char **argv)
{
   double dirty = 0.0;

   feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT);  // Enable all floating point exceptions but FE_INEXACT
   double nanval=0.0/dirty;
   printf("Succeeded! dirty=%lf, nanval=%lf\n",dirty,nanval);
}
Run Code Online (Sandbox Code Playgroud)

运行上述程序会产生输出"浮点异常".没有电话feenableexcept,"成功!" 邮件已打印.

如果您要为其编写信号处理程序SIGFPE,那么这可能是设置断点并获得所需回溯的好地方.(免责声明:没试过!)

  • 感谢您的回答,我只想指出启用*all*浮点异常也会启用经常发生的FE_INEXACT(即使对于:float f = 0.1)并且调试变得不可能.使用feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW)要好得多; (13认同)

Pat*_*ick 7

在Visual Studio中,您可以使用_controlfp函数来设置浮点计算的行为(请参阅http://msdn.microsoft.com/en-us/library/e9b52ceh(VS.80).aspx).也许您的平台有类似的变体.

  • feenableexcept()似乎正在工作,我现在正试图用这个跟踪我的程序.http://gcc.gnu.org/onlinedocs/gcc-3.1.1/g77/Floating-point-Exception-Handling.html#Floating-point%20Exception%20Handling (2认同)