Причины для NaN в приложении C ++, которые не вызывают исключение с плавающей запятой - PullRequest
7 голосов
/ 22 марта 2011

Чтобы найти причину, по которой переменные с плавающей точкой установлены в NaN, в моей программе на C ++, я включил исключения с плавающей точкой, например:

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

Я знаю, что это работает, потому что когда я пишу:

int val = 0.0/0.0;

в моей программе исключение с плавающей запятой повышено.Но NaN "распространяются" в вычислениях с плавающей запятой моей программы, и я понятия не имею, какая переменная сначала устанавливается в NaN.

Какие существуют причины, по которым переменная установлена ​​в NaN, существует, что не приведет к плавающемуисключение точки?

Ответы [ 2 ]

6 голосов
/ 28 декабря 2012

Если какой-либо вход имеет тихое значение NaN, то результатом почти любой операции с плавающей запятой, которая потребляет его, будет NaN без вызова недопустимого исключения .

Наиболее вероятное объяснение состоит в том, что некоторые данные читаются с неправильного адреса, и что считанные данные (которые могут даже не быть данными с плавающей запятой) соответствуют тихой кодировке NaN. Это может произойти довольно легко, потому что относительно общий шаблон 0xffff... кодирует тихий NaN.

0 голосов
/ 25 марта 2011

Вы делаете какую-либо операцию с квадратным корнем? Если вы попытаетесь вычислить квадратный корень для отрицательного числа, как в sqrt (-1), то вы получите Nan. В этом случае вы должны получить исключение «Недопустимая операция». Вы уверены, что правильно перехватываете все исключения? Кажется, что числовое исключение где-то в вашем коде не обнаружено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...