Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 591
Nathan Avatar asked Mar 22 '11 16:03

Nathan


1 Answers

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.

like image 83
Stephen Canon Avatar answered Oct 06 '22 01:10

Stephen Canon