7

Java7x64の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つのシステムで2^15544は、問題を引き起こす最小の計算です。2^15543正常に動作します。

私はホストシステムのメモリ制限に近づくところがなく、VM制限にさえ近いとは思いません(いずれにしても、VM引数を使用して実行し-Xmx1024M -Xms1024Mても効果はありません)。

インターネットを調べて答えを探した後、これらのタイプが内部データストレージに使用する配列()の最大サイズのいずれかBigIntegerまたはそれに関連する制限に達しているのではないかと思うようになりました。問題があれば、全体が印刷されるまで一度に数文字を吐き出す印刷メソッドを拡張して書くことは可能だと思いますが、問題は他の場所にあるのではないかと思います。StringInteger.MAX_VALUEStringBigIntegerBigInteger

時間を割いて私の質問を読んでいただきありがとうございます。

4

1 に答える 1

13

問題は、Eclipse のコンソール ビューのバグです。

私のセットアップでは、Eclipse (Helios と Juno) は、CRLF なしでは 4095 文字を超える 1 行を表示できません。最大長は、選択したフォントによって異なります。以下を参照してください。

したがって、次のコードでも問題が発生しBigIntegerます。

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

つまり、文字列は実際にはコンソールに出力されます。たとえば、コンソールからコピーできます。表示されていないだけです。

Fixed width console回避策として、コンソールの設定で設定を行うことができます。文字列はすぐに表示されます。

県の眺め

Eclipse の bugzilla の対応するバグは次のとおりです。

それらによると、これは Windows/GTK のバグであり、Eclipse の開発者はそれについて何もできません。

このバグは、テキストの長さがピクセルであることに関連しています。小さいフォントを使用すると、テキストが壊れる前により多くの文字を取得できます。

于 2012-06-24T00:02:33.813 に答える