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 -Xms1024M都没有效果)。

在互联网上四处寻找答案后,我开始怀疑我在BigInteger这些类型用于内部数据存储String的数组(Integer.MAX_VALUE如果问题出在String我认为可以扩展BigInteger和编写一个打印方法,该方法一次喷出几个字符,直到整个BigInteger打印出来,但我宁愿怀疑问题出在其他地方。

感谢您花时间阅读我的问题。

4

1 回答 1

13

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

在我的设置中,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在控制台首选项中设置设置,该字符串将立即出现:

首府的看法

Eclipse 的 bugzilla 上对应的 bug 是:

根据这些,这是一个 Windows/GTK 错误,Eclipse 的开发人员对此无能为力。

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

于 2012-06-24T00:02:33.813 回答