Как отследить NaN в C ++ - PullRequest
       4

Как отследить NaN в C ++

30 голосов
/ 01 сентября 2010

Я собираюсь сделать некоторые математические вычисления, используя C ++.Входное число с плавающей запятой является действительным числом, но после вычислений результирующее значение равно NaN.Я хотел бы проследить точку, в которой появляется значение NaN (возможно, с использованием GDB), вместо того, чтобы вставлять много кода isNan() в код.Но я обнаружил, что даже подобный код не будет вызывать исключение при появлении значения NaN.

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

Может кто-нибудь предложить метод для отслеживания NaN или превращения NaN в исключение?

Ответы [ 4 ]

37 голосов
/ 01 сентября 2010

Поскольку вы упоминаете об использовании 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);
}

Запуск вышеуказанной программы приводит к выводу «Исключение с плавающей запятой». Без вызов feenableexcept, "Успешно!" сообщение распечатано.

Если бы вы написали обработчик сигнала для SIGFPE, это было бы хорошим местом для установить точку останова и получить желаемую трассировку. (Отказ от ответственности: не пробовал!)

7 голосов
/ 01 сентября 2010

В Visual Studio вы можете использовать функцию _controlfp для установки поведения вычислений с плавающей запятой (см. http://msdn.microsoft.com/en-us/library/e9b52ceh(VS.80).aspx). Возможно, есть аналогичный вариант для вашей платформы.

1 голос
/ 01 сентября 2010

Некоторые примечания по программированию с плавающей запятой можно найти в http://ds9a.nl/fp/, включая разницу между 1/0 и 1,0 / 0 и т. Д., А также что такое NaN и как он действует.

0 голосов
/ 01 сентября 2010

Можно включить так называемую «сигнализацию NaN».Это позволит легко отладчику найти правильную позицию.

Через Google я нашел это для включения сигнализации NaNs в C ++, не знаю, работает ли он:

std::numeric_limits::signaling_NaN();

Полезность сигнализации NaN?

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