пытаясь найти диапазон длинных типов данных в Java

1

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

class range
{
public static void main(String [] args)
{
         long i;
     for(i=0;;i++)
    {
         long c= (long)(i+1);
         if(i>c)    //upper_limit+1=lower_limit
            break;  // hence, at i=upper_limit c(=i+1) < i

    }
    System.out.println("upper ="+i);
    for(i=-1;;i--)
    {
        long c=(long)(i-1);         
        if(i<c)             //lowerlimit-1=upperlimit
            break;          //hence at i=lowerlimit c(=i-1)>i
    }
    System.out.println("lower ="+i);
}
}
  • 1
    Long.MAX_VALUE для вас слишком популярно?
  • 0
    Вы могли бы использовать Long.MAX_VALUE и Long.MIN_VALUE?
Показать ещё 1 комментарий
Теги:

4 ответа

7

Ваша программа будет работать в конечном итоге, но сначала ей нужно выполнить 2 63 итерации (в каждом направлении). Это займет очень много времени. Long.MAX_VALUE и Long.MIN_VALUE - это более простые способы выяснить это. Или просто посмотрите JLS 4.2.1:

Значения интегральных типов являются целыми числами в следующих диапазонах:

  • ...

  • long от -9223372036854775808 до 9223372036854775807 включительно

Если вы хотите, чтобы ваша программа находила правильные значения, просто запустите ее ближе к окончательному результату:

for(i=Long.MAX_VALUE - 10;;i++)
...
for(i=Long.MIN_VALUE + 10;;i--)

Это быстро заканчивается выходом:

upper =9223372036854775807
lower =-9223372036854775808
  • 0
    Но i > c никогда не буду true .. Нет?
  • 2
    @MarounMaroun будет переполнен и станет отрицательным. Попробуйте Long.MAX_VALUE + 1 , вы увидите :)
Показать ещё 1 комментарий
1

Почему, по-вашему, ваша программа неверна? Это займет много времени - до тех пор, пока не переполнятся (около 2 ^ 63 итераций). Я предлагаю вам использовать Long.MIN_VALUE и Long.MIN_VALUE или если вы хотите избежать этого решения, используйте двоичный поиск, когда происходит переполнение.

Также вы можете использовать short версию той же программы, чтобы убедиться, что она правильная, просто очень трудоемкая.

0

Нет причин начинать с 0 или -1.

Если вы хотите проверить значения MIN/Max, попробуйте сделать это следующим образом:

class range
{
public static void main(String [] args)
{
         long i;
     for(i=Long.MAX_VALUE;;i++)
    {
         long c= (long)(i+1);
         if(i>c)    //upper_limit+1=lower_limit
            break;  // hence, at i=upper_limit c(=i+1) < i

    }
    System.out.println("upper ="+i);
    for(i=Long.MIN_VALUE;;i--)
    {
        long c=(long)(i-1);         
        if(i<c)             //lowerlimit-1=upperlimit
            break;          //hence at i=lowerlimit c(=i-1)>i
    }
    System.out.println("lower ="+i);
}
}
0

Вы можете использовать Long.MAX_VALUE и Long.MIN_VALUE

Это займет много времени, чтобы перечислить все 2 ^ 64 возможных длинных значения

Ещё вопросы

Сообщество Overcoder
Наверх
Меню