2012-06-23 17 views
7

मैं जावा 7 x64 में BigIntegers से संबंधित निम्न समस्या का पता लगाने की कोशिश कर रहा हूं। मैं एक संख्या को अत्यधिक उच्च शक्ति की गणना करने का प्रयास कर रहा हूं। समस्या के विवरण के बाद कोड नीचे है।प्रिंटिंग बहुत बड़े 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 ठीक काम करता है।

मुझे पता नहीं है, जहां मेजबान सिस्टम पर स्मृति सीमा तक पहुंच गए के करीब हूं और मैं नहीं मानता कि मैं भी वीएम सीमा के करीब हूँ (किसी भी वीएम तर्क -Xmx1024M-Xms1024M के साथ चल दर पर कोई प्रभाव नहीं है)।

जवाब मुझे लगता है कि मैं या तो BigInteger या String एक सरणी (Integer.MAX_VALUE) कि उन प्रकार आंतरिक डेटा भंडारण के लिए उपयोग का अधिकतम आकार से संबंधित में एक सीमा तक पहुंच गए हूँ आ गए हैं की तलाश में इंटरनेट के आसपास poking के बाद। यदि समस्या String में है, तो मुझे लगता है कि BigInteger का विस्तार करना संभव होगा और एक प्रिंट विधि लिखें जो एक समय में कुछ वर्णों को बाहर निकाल दे, जब तक कि पूरे BigInteger मुद्रित न हो जाएं, लेकिन मुझे संदेह है कि समस्या कहीं और है।

मेरे प्रश्न को पढ़ने के लिए समय निकालने के लिए धन्यवाद।

+0

हम्म, यह कोड मेरे लिए ठीक काम करता है, और यहां ठीक काम करता है: http://ideone.com/EA0yl। –

+0

मुझे लगता है कि समस्या आपका टर्मिनल हो सकता है। इसे इसके बजाय फ़ाइल में प्रिंट करने का प्रयास करें। –

+2

आप रनटाइम डीबग कर सकते हैं। जेडीके का प्रयोग करें - इसमें स्रोत –

उत्तर

11

समस्या ग्रहण में कंसोल दृश्य का एक बग है।

मेरे सेटअप पर, ग्रहण (हेलीओस और जूनो) सीआरएलएफ के बिना 40 9 5 वर्णों से अधिक एकल रेखा नहीं दिखा सकता है। आपकी फ़ॉन्ट पसंद के आधार पर अधिकतम लंबाई भिन्न हो सकती है - नीचे देखें।

इसलिए, निम्न कोड भी समस्या दिखाएगा - BigInteger की कोई आवश्यकता नहीं है।

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

यह कहा गया है कि स्ट्रिंग वास्तव में कंसोल में मुद्रित होती है - उदाहरण के लिए आप इसे कॉपी कर सकते हैं। यह अभी दिखाया नहीं गया है।

समाधान के लिए, आप कंसोल वरीयताओं में Fixed width console सेटिंग सेट कर सकते हैं, स्ट्रिंग immediatelly दिखाई देगा:

view of the pref

ग्रहण के बगजिला पर इसी कीड़े हैं:

उनके अनुसार, यह एक विंडोज/जीटीके बग है और ग्रहण डेवलपर्स इसके बारे में कुछ भी नहीं कर सकते हैं।

बग पाठ की लंबाई से संबंधित है पिक्सल, एक छोटे फ़ॉन्ट का उपयोग और आप इससे पहले कि यह टूटता पाठ में अधिक वर्ण प्राप्त करने में सक्षम हो जाएगा।

+0

निश्चित चौड़ाई निश्चित चौड़ाई कंसोल सक्षम के साथ दिखाता है। मुझे बेहतर समस्या अलगाव करना चाहिए था। आपके समय के लिए शुक्रिया। – Techrocket9

संबंधित मुद्दे