Ошибка показателя Java при мощности 2 ^ 31

1

Я пишу java-программу для вывода экспоненциальных степеней 2 (кстати, я не могу использовать Math.pow()), однако при 2 ^ 31 и 2 ^ 32 я получаю что-то еще. Кроме того, я не намерен принимать отрицательные целые числа.

Мой код:

class PrintPowersOf2 {
    public static void main (String[] args) {
        printPowersOf2(10);
        printPowersOf2(5);
        printPowersOf2(2);
        printPowersOf2(-5);
        printPowersOf2(30);
        printPowersOf2(32);
    }

    public static void printPowersOf2 (int x) {
        for(int i=0;i<x+1;i++) {
            int y = exponent (i);
            System.out.print(y);
            if(!(i == x)) {
                System.out.print(" ");
            }
        }
        System.out.println();
    }

    static int exponent(int power) {
        int output = 1; 
        for (int z=0; z<power; z++) 
        output *= 2; 
        return output; 
    }
}

Выход, который я получаю:

1 2 4 8 16 32 64 128 256 512 1024
1 2 4 8 16 32
1 2 4

1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 1073741824

1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 1073741824 -2147483648 0
  • 14
    Целочисленное переполнение, мой друг.
  • 2
    используйте long или BigInteger .
Показать ещё 2 комментария
Теги:

2 ответа

7
Лучший ответ

int представлен 32 битами. Таким образом, может быть представлено любое значение между -2^31 и 2^31-1. Ничего из этого диапазона.

Вы можете использовать long (64 бит) или BigInteger (структуры данных, которые могут отображать все числа до предела памяти).

Недостаток использования этих структур (особенно BigInteger) заключается в том, что ЦП не всегда предлагает инструкции для арифметики. Таким образом, для добавления двух экземпляров BigInteger требуется больше времени, чем при использовании int или long. В случае long, если процессор 32-разрядный, для его обработки требуется как минимум две инструкции.


На боковой стенке. ЦП предлагает лучший способ вычислить полномочия двух операций: смены.

Вы можете просто написать:

long value = 0x01L << power;//power of two, all in one simple instruction.

Это работает следующим образом: сдвиг перемещает биты влево. Таким образом, если исходное значение:

  0001 1011 << 2
= 0110 1100

Сдвиг влево в двоичном представлении арифметически совпадает с умножением на два.

1

В целом,

byte 8 bits, short 16 bits, int 32 bits, long 64 bits

Для Integer (int) вы можете сохранить значение между -2 ^ 31 и 2 ^ 31, т.е. Из -2, 147 483 648 до 2 147 483 647

Если вы действительно хотите вычислить степень 2 без каких-либо ограничений (по крайней мере, согласно теории), вы можете использовать строки и умножать соответственно.

Изменить:

Как и Commusoft, BigIntegers также может использоваться, что повышает производительность по сравнению с Strings.

  • 0
    Как насчет BigInteger , произвольной длины, но все же двоичное представление. Лучше, чем String так как представление более компактно.
  • 0
    Серьезно, я не знал об этом .. спасибо за информацию .. Я обновлю свой ответ

Ещё вопросы

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