2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 -1.#IND
Сообщение15.05.2010, 14:41 
-1.#IND - это NAN в C++. Есть программа, в которой из арифметических операций только +,-,abs и умножение на константу. В процессе ее работы вычисляются значения некоторых матриц, и в результате появляется -1.#IND в некоторых элементах. Программа пишется на Visual Studio 2008. Можно ли как-то отловить момент, когда NAN появляется впервые в процессе вычисления? Трассировка слишком сложна и не помогает. И откуда вообще при таких операциях может появляться NAN? При этом числа не большие, и переполнения не возникает (хотя тогда было бы 1.#INF...).

 
 
 
 Re: -1.#IND
Сообщение15.05.2010, 15:00 
Можно воспользоваться стандартной функцией isnan(), или тем, что NAN != NAN

Код:
#include <math.h>
#include <assert.h>

double x = NAN;

assert(!isnan(x));

или

assert(x==x);

 
 
 
 Re: -1.#IND
Сообщение15.05.2010, 15:07 
Не понятно. Что есть х?

 
 
 
 Re: -1.#IND
Сообщение15.05.2010, 16:59 
х - переменная float или double, значение которой вы хотите проверить на NaN.
NaN расшифровывается как Not a Number - не число.
Появляется когда результат операции с числами не определён, например
Код:
x=sqrt(-1);
x=asin(2);
x=log(-1)
x=0.0/0.0;

Обратите внимание, что деление 0/0 должно быть с плавающей точкой. По историческим причинам целочисленное деление вызывает исключение.
В дальнейшем любая операция с NaN даёт NaN, любое сравнение с NaN даёт false, даже NaN == NaN. Так его и можно отличить от других значений.
В вашем случае NaN может получиться при делении 0.0/0.0, или сложении -бесконечности с +бесконечность, или при вычитании +бесконечость - +бесконечность, и тому подобное.

 
 
 
 Re: -1.#IND
Сообщение15.05.2010, 21:53 
Вот еще один более зависимый метод решения:
В Visual Studio 2008 в настройках компилятора можно сказать чтобы генерировались исключения:
Project ->Properties ->Configuration Properties ->C/C++ ->Code Generation ->Enable Floating Point Exceptions ->Yes

 
 
 
 Re: -1.#IND
Сообщение16.05.2010, 01:19 
2cyb12
Цитата:
И откуда вообще при таких операциях может появляться NAN? При этом числа не большие, и переполнения не возникает

Наверное глупость скажу, но может быть в процессе работы вы как-то перераспределяете память и забываете проинициализировать какие-то элементы (производя дальнейшие операции с "мусором")?

Цитата:
из арифметических операций только +,-,abs и умножение на константу

Вот abs ещё подозрительно смотрится... Может попробовать fabs? Или вы просто "образно" выразились? :)

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group