打印非常大的BigIntegers

时间:2012-06-23 23:04:48

标签: java 64-bit biginteger java-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限制(无论如何使用VM参数运行-Xmx1024M {{1没有效果)。

在互联网上寻找答案后,我开始怀疑我在-Xms1024MBigInteger与数组最大大小(String)相关的限制这些类型用于内部数据存储。如果问题在Integer.MAX_VALUE,我认为可以扩展String并编写一个打印方法,一次喷出几个字符,直到整个BigInteger被打印出来,但我而是怀疑问题出在其他地方。

感谢您抽出宝贵时间阅读我的问题。

1 个答案:

答案 0 :(得分:12)

问题是Eclipse中的Console视图的错误。

在我的设置中,Eclipse(Helios和Juno)在没有CRLF的情况下不能显示超过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错误,Eclipse的开发人员无法做任何事情。

  

该bug与文本的长度有关,是像素,使用较小   字体,您将能够在它之前的文本中获得更多字符   符。