Свойства Double .NaN и почему у целочисленной оболочки нет элемента данных NaN?

#java

#java

Вопрос:

 i=Double.NaN
while(i==i)
{
//some code
}
  

каков результат?
Почему у нас нет Integer.NaN ?

Ответ №1:

Плавающие точки IEEE имеют представление «Не число» по спецификации. У целых типов нет такого состояния. Каждое возможное двоичное представление целого числа является действительным числом.

Ответ №2:

каков результат?

Нет вывода, потому что NaN != NaN согласно стандарту IEEE 754, поэтому цикл никогда не будет введен.

Почему у нас нет Integer.NaN?

Потому что целые числа основаны на двоичном представлении, дополняющем двоичное представление, где каждый битовый шаблон является допустимым целым числом, и ни один из них не имеет особого значения.

Комментарии:

1. как мы должны справиться с ситуацией в случае целых чисел??

2. @ashutoshsrinet: обычно с использованием класса целочисленной оболочки с нулевым значением.

3. @Michael, или просто используя long . Слишком дорогие обертки.

4. @bestsss; long вам вообще не поможет для этой цели. И обертки не дорогие, если вы не создаете их миллионы.

5. Возможно, я ошибаюсь, но идея NaN представляет значение, которое не принадлежит набору float / double . Вы можете сделать то же самое с long, например, с любым long>Integer . MAX_VALUE (или Оболочки, используемые вместо обычных первоклассных примитивов, определенно дороже, помимо дополнительной памяти, они требуют косвенного извлечения значения.

Ответ №3:

Double.NaN == x всегда false , независимо от того, что x есть.

Ответ №4:

For float и double NaN не равны ничему, даже самому себе.

Для int long типов и я использовал MIN_VALUE как значение типа NaN , но вы должны закодировать это самостоятельно, если хотите, чтобы это работало таким образом.

Кстати: возникает загадка, когда следующий бесконечный цикл.

 while(x != x   0);
  

Существует три типа x , когда это бесконечный цикл.

Другой вопрос, когда это бесконечный цикл.

 while(x == -x);
  

Для этого существует 16 комбинаций типа / значения, намного больше, чем вы могли ожидать. 😉

Комментарии:

1. Большое спасибо!! можете ли вы ответить на первый вопрос для меня …!

2. У вас уже должно быть два типа / значения. Подсказка: третий тип поддерживает , но не - * или / .

Ответ №5:

Я не могу сказать вам, почему, но вы можете обойти это с помощью этого:

(int)Double.NaN;

итак, я предполагаю, что нет веской причины.