Causes for NaN in C++ application that do no raise a floating point exception

Nathan picture Nathan · Mar 22, 2011 · Viewed 7.8k times · Source

To find the cause of floating point variables beeing set to NaN in my C++ program I enabled floating point exceptions like this:

#include <fenv.h>
feenableexcept(FE_INVALID | FE_OVERFLOW);

I know it works because when I write:

int val = 0.0/0.0;

in my program a floating point exception is risen. But NaNs are "spreading" through the floating point calculations of my program and I have no idea which variable is set to NaN first.

What causes for a variable beeing set to NaN exist, that would not cause a floating point exception?

Answer

Stephen Canon picture Stephen Canon · Dec 28, 2012

If any input has a quiet NaN value, it will cause the result of nearly any floating-point operation that consumes it to be NaN without raising the invalid exception.

The most likely explanation is that some data is being read from the wrong address, and that the read data (which may not even be floating-point data) happens to match a quiet NaN encoding. This can happen pretty easily, because the relatively common pattern 0xffff... encodes a quiet NaN.