2014 dxdy logo

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

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




 
 NaN == NaN - непонятно
Сообщение24.09.2010, 21:42 
Привет всем :)

Возник интерес написания алгоритма по получению результата деления элементов двух двумерных массивов одинаковой длины.

$R_i_j/P_i_j==R_i_h/R_j_h$

Массивы могут содержать нулевые значения и может возникать следующая ситуация как NaN==NaN

Нужно ли в таком условие определять результат как true?

Что вы думаете?

 
 
 
 Re: NaN == NaN - непонятно
Сообщение24.09.2010, 21:44 
Любое сравнение с NaN даёт false.
(NaN == NaN) == false
(NaN != NaN) == false
На этом основан простой тест, является ли число NaN:
Код:
bool isnan(double x)
{
    return !(x == x);
}

 
 
 
 Re: NaN == NaN - непонятно
Сообщение24.09.2010, 22:04 
То есть при таком условии блок не будет выполняться

Цитата:
if(NaN==NaN){block}


Если вроде NaN/NaN дает 1? Тогда почему нельзя возвращать true?

Если рассмотреть конкретный случай с этими массивами, то там случается деление на 0, что приводит к NaN значение как "бесконечность" .

 
 
 
 Re: NaN == NaN - непонятно
Сообщение24.09.2010, 22:18 
guest001 в сообщении #355921 писал(а):
То есть при таком условии блок не будет выполняться

Цитата:
if(NaN==NaN){block}


Если вроде NaN/NaN дает 1? Тогда почему нельзя возвращать true?

Любые арифметические операции, как и любые математические функции, кроме некоторых специальных типа isnan(), дают NaN, если среди аргументов есть NaN.
Т.е. результат деления NaN/NaN тоже NaN.

 
 
 
 Re: NaN == NaN - непонятно
Сообщение24.09.2010, 22:33 
Тут получается isnan и isInfinite вернет true :-) В этом варианте

if(isnan(NaN)==isnan(NaN)) вернет true получается?

 
 
 
 Re: NaN == NaN - непонятно
Сообщение24.09.2010, 22:56 
guest001 в сообщении #355927 писал(а):
Тут получается isnan и isInfinite вернет true :-) В этом варианте

if(isnan(NaN)==isnan(NaN)) вернет true получается?

isInfinite(NaN) вернёт false, а в остальном верно.

 
 
 
 Re: NaN == NaN - непонятно
Сообщение25.09.2010, 04:36 
venco в сообщении #355932 писал(а):
guest001 в сообщении #355927 писал(а):
Тут получается isnan и isInfinite вернет true :-) В этом варианте

if(isnan(NaN)==isnan(NaN)) вернет true получается?

isInfinite(NaN) вернёт false, а в остальном верно.


Это все понятно, но у меня почему-то
Цитата:
NaN == NaN


возвращает как если бы true, а точнее false, но блок все равно выполняется :shock:

Как я уже говорил, под NaN==NaN я имею ввиду два результата деления А==В
В одном из А или В или в двух одновременно случается NaN, но блок все равно выполняется

Код:
if(A==B){С[j]=1;}


То есть в результате я имею массив С заполненный только одними единицами, хотя вроде как не должен из-за false :x

Как это исправить - не пойму...

Хелп!

 
 
 
 Re: NaN == NaN - непонятно
Сообщение25.09.2010, 05:58 
Значит там у Вас не NaN.
Приведите всю программу, или хотя бы существенную часть.

 
 
 
 Re: NaN == NaN - непонятно
Сообщение25.09.2010, 06:09 
venco в сообщении #355968 писал(а):
Значит там у Вас не NaN.
Приведите всю программу, или хотя бы существенную часть.


Вроде бы работает. Я поменял индекс h с 0 на 1 - ну чтобы само на себя не делить на первой итерации - вроде теперь нормально :?
Но честно говоря, не понял почему не получается при h=0?
Если h=0, то блок по-любому выполняется даже с NaN :shock:

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


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