2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 -1.#IND
Сообщение15.05.2010, 14:41 


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

 Профиль  
                  
 
 Re: -1.#IND
Сообщение15.05.2010, 15:00 


28/12/09
8
Можно воспользоваться стандартной функцией 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 


27/01/10
260
Россия
Не понятно. Что есть х?

 Профиль  
                  
 
 Re: -1.#IND
Сообщение15.05.2010, 16:59 
Заслуженный участник


04/05/09
4586
х - переменная 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 


23/12/08
245
Украина
Вот еще один более зависимый метод решения:
В Visual Studio 2008 в настройках компилятора можно сказать чтобы генерировались исключения:
Project ->Properties ->Configuration Properties ->C/C++ ->Code Generation ->Enable Floating Point Exceptions ->Yes

 Профиль  
                  
 
 Re: -1.#IND
Сообщение16.05.2010, 01:19 
Заслуженный участник


26/07/09
1559
Алматы
2cyb12
Цитата:
И откуда вообще при таких операциях может появляться NAN? При этом числа не большие, и переполнения не возникает

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

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group