Как представить NaN в массиве чисел? - PullRequest
4 голосов
/ 07 февраля 2011

Вопрос говорит сам за себя. У меня есть массив парных разрядов, и я что-то с ними делаю.

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

Ответы [ 5 ]

5 голосов
/ 07 февраля 2011

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

Double.NaN

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

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

Double.isNan(/* ... value ... */);
4 голосов
/ 07 февраля 2011

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

1 голос
/ 07 февраля 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.
}
0 голосов
/ 07 февраля 2011

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

// 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.

0 голосов
/ 07 февраля 2011

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

...