что такое NaN? а как создается?

У меня есть double[], и у него есть значение NaN. Когда я складываю элементы массива, NaN тоже дает результат NaN.

Как это произошло? Как я могу предотвратить добавление этого NaN в остальную часть моего массива?


person lonesome    schedule 23.01.2012    source источник
comment
en.wikipedia.org/wiki/NaN   -  person shikhar    schedule 23.01.2012
comment
Вопрос показывает полное отсутствие даже попыток исследования.   -  person Ray    schedule 23.01.2012
comment
@Ray, я знаю, что такое NaN, если ты прочитал вопрос, то увидишь, что я спросил, как предотвратить добавление NaN к остальной части массива ... хочу сказать, что мои знания - закон, я не боюсь, это нормально для меня, by время идет, я улучшаюсь, есть проблемы? :)   -  person lonesome    schedule 23.01.2012


Ответы (7)


NaN означает "не число". Он может возникать разными способами, например, в результате 0./0., sqrt(-1), или в результате расчета с участием других NaNs.

Самый простой способ проверить, является ли v NaN, - использовать _ 7_:

public static double sum(double arr[]) {
  double sum = 0.0;
  for (double val : arr) {
    if (!Double.isNaN(val)) {
      sum += val;
    }
  }
  return sum;
}

edit: @Stephen C хорошо замечает в комментариях: прежде чем вы решите проигнорировать это NaN, было бы благоразумно понять, откуда оно взялось. Возможно, это результат ошибки в другом месте вашего кода, и, слепо игнорируя NaN, вы могли бы просто замаскировать ошибку, а не исправлять ее.

person NPE    schedule 23.01.2012
comment
Хороший совет ... но тоже опасный. Если вы игнорируете NaN, не понимая, откуда они взялись, вы рискуете скрыть ошибки в своей программе и получить неверный результат. - person Stephen C; 23.01.2012
comment
@StephenC: Хороший вопрос, спасибо. Я отредактировал ответ, включив примечание по этому поводу. - person NPE; 23.01.2012

NaN означает «не число», поэтому «не число» + 10 = «не число».

Возможно, вы захотите отладить свое приложение, чтобы найти то, что находится в двойном массиве :)

person f2lollpll    schedule 23.01.2012
comment
это массив, который я создал для хранения результатов математической формулы, тогда это оказалось NaN в массиве, поэтому каким-либо способом удалить это NaN? - person lonesome; 23.01.2012
comment
этот ответ кажется законным stackoverflow.com/a/8971425/883671 - person f2lollpll; 23.01.2012

как я могу предотвратить добавление этого NaN к остальной части моего double []

Сюда:

double[] array = something;
double sum = 0;
for (int i = 0; i < array.length; i++) {
  if (!Double.isNaN(array[i])) {
    sum += array[i];
  }
}
person Joonas Pulakka    schedule 23.01.2012
comment
Хотя технически правильно, побуждать OP игнорировать значение NaN в математической программе не является хорошей идеей! - person Perception; 23.01.2012
comment
@Perception: имеет ли смысл игнорировать NaN, зависит от решаемой проблемы. Вы можете - в некоторых случаях - думать о NaN как о пустых ячейках Excel. При вычислении суммы по диапазону ячеек Excel обрабатывает пустые ячейки как нули, что вполне разумно. - person Joonas Pulakka; 24.01.2012
comment
Вы нарисовали невероятно тонкий крайний случай, основанный на шатком предположении, что значение контрольного индикатора Java сродни ячейке электронной таблицы. Мне еще предстоит увидеть определение NaN, приравнивающее его к нулю, что является вполне допустимым числом. - person Perception; 24.01.2012
comment
@Perception: Кто сказал, что ноль не совсем верное число или что NaN равно нулю? Игнорирование NaN полностью отличается от обработки их как нулей. В сумме игнорирование равно добавлению нуля (x+0=x), но в общем случае, например при вычислении среднего все будет иначе: вы просто не считаете NaN. Фактически, именно для этого изначально были изобретены NaN: представление отсутствующих значений. - person Joonas Pulakka; 24.01.2012

RTFM:

Документация Javadoc для NaN

public static final double NaN

Константа, содержащая нечисловое (NaN) значение типа double. Это эквивалентно значению, возвращаемому Double.longBitsToDouble (0x7ff8000000000000L).

И в соответствующем разделе спецификации JVM говорится любая операция, включающая NaN, также является NaN (немного похожа на null в SQL)

person Bohemian♦    schedule 23.01.2012

Вы не можете просто игнорировать NaN, это индикатор проблемы с вашей программой. Вам нужно выяснить, что вызывает NaN, и исправить это.

person Perception    schedule 23.01.2012

NaN - не число

кстати попробуйте:

double[] array = new double[10];
String result = StringUtils.join(array);
System.out.println(result+ " BATMAN !");
person light_303    schedule 23.01.2012

Java - не моя сильная сторона, но в других языках это связано с присвоением значения из строки. Попробуй это:

parseDouble

public static double parseDouble(String s)
                          throws NumberFormatException

Возвращает новый тип double, инициализированный значением, представленным указанной строкой, как это выполняется методом valueOf класса Double. Параметры: s - строка для анализа. Возвращает: двойное значение, представленное строковым аргументом. Выдает: NumberFormatException - если строка не содержит синтаксического двойника. Начиная с: 1.2 См. Также: valueOf (String)

Взято из здесь.

person LJ Wilson    schedule 23.01.2012
comment
parseDouble() не производит NaN значений ... если вы не попытаетесь проанализировать строку "NaN". Если вы попытаетесь проанализировать недопустимую числовую строку, вы получите исключение, а не NaN. - person Stephen C; 23.01.2012