2012-06-23 4 views
7

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

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 работает нормально.

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

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

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

+0

Хмм, этот код отлично подходит для меня, а также отлично работает здесь: http://ideone.com/EA0yl. –

+0

Я думаю, что проблема может быть вашим терминалом. Попробуйте вместо этого напечатать его в файле. –

+2

Вы можете отлаживать время выполнения. Используйте jdk - у него есть источник –

ответ

11

Проблема - ошибка в представлении консоли в 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

Соответствующие ошибки на Bugzilla Затмений являются:

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

Эта ошибка связана с длиной текста пикселей, используйте меньший шрифт, и вы будете иметь возможность получить больше символов в тексте перед ней перерывами.

+0

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

Смежные вопросы