#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;
итак, я предполагаю, что нет веской причины.