Подтвердить что ты не робот

Float.NaN == Float.NaN

Почему это сравнение дает мне "ложь"? Я посмотрел на источник и Float.NaN определяется как

/** 
 * A constant holding a Not-a-Number (NaN) value of type
 * <code>float</code>.  It is equivalent to the value returned by
 * <code>Float.intBitsToFloat(0x7fc00000)</code>.
 */
public static final float NaN = 0.0f / 0.0f;

EDIT: удивительно, если я это сделаю:

System.out.println("FC " + (Float.compare(Float.NaN, Float.NaN)));

он дает мне 0. Итак, Float.compare() считает, что NaN равно себе!

4b9b3361

Ответ 1

Поскольку Java реализует стандарт с плавающей точкой IEEE-754, который гарантирует, что любое сравнение с NaN вернет false (кроме !=, который возвращает true)

Это означает, что вы не можете проверить свои обычные способы, является ли число с плавающей запятой NaN, поэтому вы можете либо переинтерпретировать оба числа, как ints, и сравнить их или использовать гораздо более умное решение:

def isNan(val):
     return val != val

Ответ 2

Используйте Float.isNaN для проверки значений NaN.

Ответ 3

Все, что мне нужно сказать: Википедия О NaN.

Это написано довольно ясно. Интересная часть состоит в том, что плавающая точка NaN общего стандарта выражает NaN следующим образом:

s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx

s - знак (отрицательный или положительный), 1 - показатель степени, а x считается полезной нагрузкой.

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

Другое дело, что в стандарте у них есть сигнализация и довольно NaN. Передача сигналов NaN (sNaN) означает NaN, который должен вызвать реакцию как исключение. Его следует использовать, чтобы сказать вслух, что у вас есть проблема в вашем уравнении. Тихий NaN (qNaN) - это NaN, который молча пропускает.

A sNaN, который создал сигнал, преобразуется в qNaN, чтобы не далее производить больше сигналов в последующих операциях. Помните, что какая-то система определяет я ^ 0 = 1 в качестве константы, что NaN ^ 0 = 1. Таким образом, есть случаи, когда люди рассчитывают с помощью NaN.

Итак, в конце я бы пошел с этим: qNaN!= sNaN, но это внутренне и не наблюдается для пользователя (вы не можете проверить это). Смешайте по оплате и знаку (да, вы можете иметь отрицательный и положительный NaN), и мне кажется, что всегда возвращайте NaN!= NaN выглядит как гораздо более мудрый выбор, который я, наконец, научился ценить → Я никогда не буду жаловаться или удивляться о неравенстве NaN снова. Хвалите людей, которые были настолько задумчивыми, давая нам такой хороший стандарт!

Кстати: Java использует положительный NaN с полезной нагрузкой 0 (все x - нули).