views:

130

answers:

4

I am going to do some math calculations using C++ .

The input floating point number is a valid number, but after calculations , the resulting value becomes NaN.

I would like to trace the point where NaN value appears (possibly using gdb), instead of inserting a lot of isNan() into the code.

But, I found that even code like this will not trigger any exceptions when NaN value appears.


    double dirty = 0.0;
    double nanvalue = 0.0/dirty;


Could anyone suggest some methods for tracing the NaN or turning Nan to exceptions?

Thank you very much :)

+1  A: 

One can enable so-called "signaling NaN". That should make it easily possible to make the debugger find the correct position.

Via google, I found this for enabling signaling NaNs in C++, no idea if it works:

std::numeric_limits::signaling_NaN();

http://stackoverflow.com/questions/2247447/usefulness-of-signaling-nan

Uli Schlachter
That expression evaluates to a signaling NaN, but I think pagedown is more interested in forcing a floating point exception for operations that return NaN, which would probably be a platform-specific compiler option, or runtime configuration of the FP processor.
Jim Lewis
Ah sorry. I understood it as making all NaN signaling.
Uli Schlachter
Thank you very much. My platform is GCC4.1 , Centos 5.5 Linux I am going to take a look at the compiler options :)
+2  A: 

In Visual Studio you can use the _controlfp function to set the behavior of floating-point calculations (see http://msdn.microsoft.com/en-us/library/e9b52ceh(VS.80).aspx). Maybe there is a similar variant for your platform.

Patrick
Hi, thank you for your answer.Unfortunately my platform is GCC4.1 , Centos 5.5 Linux. I am still trying to figure out how to achieve the same thing in Linux with GCC
feenableexcept() seems working, I am now trying to trace my program with this.http://gcc.gnu.org/onlinedocs/gcc-3.1.1/g77/Floating-point-Exception-Handling.html#Floating-point%20Exception%20Handling
+5  A: 

Since you mention using gdb, here's a solution that works with gcc -- you want the functions defined in fenv.h :

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

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

   feenableexcept(-1);  // Enable all floating point exceptions
   double nanval=0.0/dirty;
   printf("Succeeded! dirty=%lf, nanval=%lf\n",dirty,nanval);
}

Running the above program produces the output "Floating point exception". Without the call to feenableexcept, the "Succeeded!" message is printed.

If you were to write a signal handler for SIGFPE, that might be a good place to set a breakpoint and get the traceback you want. (Disclaimer: haven't tried it!)

Jim Lewis
Thank you very much
The bug is found :)
A: 

Some notes on floating point programming can be found on http://ds9a.nl/fp/ including the difference between 1/0 and 1.0/0 etc, and what a NaN is and how it acts.

bert hubert
Thank you very much