打印非常大的BigIntegers

7
我正在尝试解决与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的幂而不是该行注释中所需的计算。在我测试过的两个系统上,2^15544是触发问题的最小计算;2^15543运行良好。
我在主机系统上没有接近内存限制,也不认为我接近虚拟机限制(无论如何,使用VM参数-Xmx1024M-Xms1024M没有效果)。
在互联网上寻找答案后,我怀疑我正在击中BigIntegerString中与最大数组大小(Integer.MAX_VALUE)相关的限制。如果问题在于String,我认为可以扩展BigInteger并编写一个打印方法,以每次输出几个字符,直到整个BigInteger被打印出来,但我更加怀疑问题出在其他地方。
感谢您抽出时间阅读我的问题。

2
你可以调试运行时。使用JDK-它有源代码。 - Thorbjørn Ravn Andersen
数字2的15544次方有4680位十进制数。它不应该接近数组长度限制。我怀疑您的控制台是问题的源头。您使用哪个IDE/控制台? - Petr Janeček
1
它在MacOSX Lion的终端上运行。 - TeaCupApp
1
似乎存在一个硬限制,即使没有回车符和换行符(CRLF),在我的情况下是4096个字符。然而,当我尝试在控制台首选项中设置“固定宽度控制台”时,这个数字立即出现了。 - Petr Janeček
1
即使在Eclipse Juno(Eclipse 4.2)上也可以重现此问题,我没有找到任何关于它的错误报告,文档中也没有提到。我将提交一个错误报告,并将所有内容总结成一个答案。 - Petr Janeček
显示剩余4条评论
1个回答

13

这个问题是Eclipse中控制台视图的一个错误。

在我的设置中,Eclipse(Helios和Juno)无法显示没有换行符的单行超过4095个字符。最大长度可能因字体选择而异 - 请参见下文。

因此,即使以下代码也会显示问题-没有必要使用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的bugzilla上对应的错误是:

根据这些情况,这是一个Windows/GTK的bug,Eclipse的开发人员无法做任何事情。

该bug与文本的像素长度有关,使用较小的字体,您将能够在文本中获得更多字符,而不会中断。


果然启用了固定宽度控制台,结果显示出来了。我应该更好地进行问题隔离。谢谢你的时间。 - Techrocket9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接