Вопрос по 64bit, java, java-7, biginteger – Печать очень больших BigIntegers

7

Я пытаюсь выяснить следующую проблему, связанную с BigIntegers в Java 7 x64. Я пытаюсь вычислить число до чрезвычайно высокой степени. Ниже приведен код с описанием проблемы.

import java.math.BigInteger;

public class main {

    public static void main(String[] args) {
        // Demo calculation; Desired calculation: BigInteger("4096").pow(800*600)
        BigInteger images = new BigInteger("2").pow(15544);

        System.out.println(
            "The number of possible 16 bpc color 800x600 images is: "
            + images.toString());        
    }
}

У меня возникают проблемы с печатью результата этой операции. Когда этот код выполняется, он печатает сообщение, но не значениеimages.toString().

Чтобы изолировать проблему, я начал вычислять степени двух вместо желаемого вычисления, указанного в комментарии к этой строке. В двух системах, на которых я это проверял,2^15544 наименьшее вычисление, которое вызывает проблему;2^15543 работает отлично.

Я не близок к достижению предела памяти в хост-системах, и я не верю, что я даже близок к пределу виртуальной машины (во всяком случае, с аргументами виртуальной машины).-Xmx1024M -Xms1024M не имеет никакого эффекта).

Покопавшись в интернете в поисках ответов, я начал подозревать, что я достигаю предела либо вBigInteger или жеString относится к максимальному размеру массива (Integer.MAX_VALUE) которые эти типы используют для внутреннего хранения данных. Если проблема вString Я думаю, что было бы возможно продлитьBigInteger и напишите метод печати, который выбрасывает несколько символов за раз, пока весьBigInteger печатается, но я скорее подозреваю, что проблема кроется в другом месте.

Спасибо, что нашли время, чтобы прочитать мой вопрос.

Вы можете отлаживать среду выполнения. Используйте JDK - у него есть источник Thorbjørn Ravn Andersen
работает на терминале на MacOSX lion TeaCupApp
Кажется, что существует жесткое ограничение на длину строки без CRLF, в моем случае это 4096. Однако, когда я попытался установитьFixed width console в настройках консоли номер появился сразу. Petr Janeček
Это может быть воспроизведено даже на Eclipse Juno (Eclipse 4.2),I found no filed bug about it и нет слов об этом в документации. Собираюсь подать ошибку и обобщить все это в ответ. Petr Janeček
Хм, этот код работает нормально для меня, а также отлично работает здесь:ideone.com/EA0yl. Oliver Charlesworth

Ваш Ответ

1   ответ
12

Проблема заключается в ошибке представления консоли в Eclipse.

В моей настройке Eclipse (Helios и Juno) не может показывать одну строку длиннее 4095 символов без CRLF. Максимальная длина может варьироваться в зависимости от вашего выбора шрифта - см. Ниже.

Таким образом, даже следующий код покажет проблему - нет необходимости вBigInteger.

StringBuilder str = new StringBuilder();
for (int i = 0; i < 4096; i++) {
    str.append('?');
}
System.out.println(str);

Тем не менее, строка на самом деле печатается в консоли - вы можете, например, скопировать ее из нее. Это просто не показано.

В качестве обходного пути вы можете установитьFixed width console установка в настройках консоли, сразу появится строка:

view of the pref

Соответствующие ошибки в Eclipse's bugzilla:

В соответствии с этим, это ошибка Windows / GTK, и разработчики Eclipse ничего не могут с этим поделать.

The bug is related to the length of the text is pixels, use a smaller font and you will be able to get more characters in the text before it breaks.

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

Похожие вопросы