Как представить NaN в массиве чисел?

В вопросе сказано все. У меня есть массив двойников, и я что-то с ними делаю.

double expectedOutput[] = { 6.38792, 12.91079, 14.33333, 13.44517,
                12.34539, 12.05397, 8.34061, 2.07900, -2.01999, -5.47802,
                -8.21610, -9.26719, -11.02378 };

В идеале, я бы проверил, чтобы увидеть, если

6.38792 == 6.38792 и в итоге получаю пропуск

При определенных условиях я получаю такую ​​​​ситуацию, как

6.38792 != NaN

Зная, что иногда это допустимый случай, как я могу представить NaN в своем коде?

Мне либо нужно включить NaNs в мой массив ожидаемых элементов, либо каким-то образом выяснить, что результат не является числом

Я использую Java


person James Raitsev    schedule 07.02.2011    source источник
comment
Джава. я обновлю вопрос   -  person James Raitsev    schedule 07.02.2011
comment
Двойной.NaN? тестирование NaN x==x (гарантирует, что это не NaN), Double.isNaN() и так далее   -  person bestsss    schedule 07.02.2011


Ответы (5)


В Java вы можете получить NaN, используя

Double.NaN

Так что вы можете просто поместить это в свой массив.

Если ваш вопрос заключается в том, как проверить, является ли что-то NaN, вы можете позвонить

Double.isNan(/* ... value ... */);
person templatetypedef    schedule 07.02.2011

Вам придется проверить это явно, поскольку NaN != NaN вы не можете просто включить его в свой массив. Вы должны использовать Double.isNaN(x).

person porges    schedule 07.02.2011

double d = 0.0/0.0;
if(Double.isNan(d)){
    // Double d is not a number.
}

В качестве альтернативы:

double d = Double.Nan;
if(Double.isNan(d)){
    // Double d is not a number.
}
person Olhovsky    schedule 07.02.2011
comment
-1 NaN никогда не будет сравниваться равным NaN (или любым другим числом). - person Chris Jester-Young; 07.02.2011
comment
Исправлена. Неудача была неизбежна. - person Olhovsky; 07.02.2011
comment
Отменил отрицательный голос, потому что вы исправили свой ответ, но для вас все еще нет файла cookie. :-D - person Chris Jester-Young; 07.02.2011
comment
Хех, нет. Кто-то еще проголосовал, так что спасибо этому человеку. - person Olhovsky; 07.02.2011
comment
@TheBigO: На самом деле, я отменил отрицательный голос. (Но я не проголосовал за вас. Два пользователя изначально проголосовали за вас; я отозвал одного из них.) OTOH, я только что заметил, что кто-то решил последовательно проголосовать против моих сообщений. Если это вы, имейте в виду, что это может привести к аннулированию всех ваших голосов: blog.stackoverflow. com/2008/12/vote-fraud-and-you - person Chris Jester-Young; 07.02.2011
comment
@ Крис Джестер-Янг, если это правда, то извини. Я просто интерпретировал активность, которую SO отображал для меня, как я ее видел. И нет, я не минусовал вас, если хотите, я могу предоставить скриншот моей недавней активности. Я был бы удивлен, если бы SO не предотвратил злонамеренное голосование против и мошенническое голосование за. В любом случае, у вас есть свобода голосовать так, как вы считаете нужным, иначе голосование не сработает. - person Olhovsky; 07.02.2011
comment
@TheBigO: Я рад, что все прояснилось! :-) Кроме того, я верю вам в серийном голосовании. В любом случае, мне все равно, потому что у меня гораздо больше репутации, чем люди могут нанести ущерб, прежде чем система поймает их. :-) (С другой стороны, недавно на моей учетной записи был проведен пересчет репутации (очевидно, вызванный последовательным отрицательным голосованием), в результате которого я получил ~ 500 баллов. Ой!) - person Chris Jester-Young; 07.02.2011

Поскольку во многих языках NaN не равен самому себе (и в Java тоже), вы должны рассматривать это как частный случай. Используйте Float.NaN или Double.NaN для ссылки на NaN. Используйте Float.isNaN или Double.isNaN, чтобы проверить, является ли конкретное значение NaN.

person Pierre    schedule 07.02.2011
comment
многие языки должны быть совместимы с IEEE-754 :) - person porges; 07.02.2011
comment
Я все еще ищу краткий справочник IEEE, чтобы использовать его на светских вечерах;) - все равно спасибо за ссылку - person Pierre; 07.02.2011

Это тот случай, когда объекты Double на самом деле более полезны, чем примитивные объекты double.

// auto-boxes them all to Double objects
Collection<Double> expectedOutput =
    Arrays.asList(6.38792, 12.91079, 14.33333, 13.44517, 12.34539,
                  12.05397, 8.34061, 2.07900, -2.01999, -5.47802,
                  -8.21610, -9.26719, -11.02378, Double.NaN );
// maybe fill into HashSet for more efficient lookup?

// later:
double d = Double.NaN;
if(expectedOutput.contains(d)) {
    System.out.println("found");
}

Причина в том, что Double.equals фактически реализует условие рефлексивности договора равенства, а это означает, что Double.valueOf(Double.NaN).equals(Double.valueOf(Double.NaN)) дает true, в отличие от Double.NaN != Double.NaN.

person Paŭlo Ebermann    schedule 07.02.2011