2012-06-23 47 views
7

Tôi đang cố gắng tìm ra vấn đề sau liên quan đến BigIntegers trong Java 7 x64. Tôi đang cố tính một con số với một sức mạnh cực kì cao. Mã bên dưới, tiếp theo là mô tả sự cố.In các bản BigIntegers rất lớn

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());   
    } 
} 

Tôi đang gặp sự cố khi in kết quả của thao tác này. Khi mã này thực thi nó sẽ in ra thông điệp nhưng không phải là giá trị của images.toString().

Để cách ly sự cố, tôi bắt đầu tính toán lũy thừa của hai thay vì tính toán mong muốn được liệt kê trong nhận xét trên dòng đó. Trên hai hệ thống tôi đã thử nghiệm này, 2^15544 là phép tính nhỏ nhất kích hoạt vấn đề; 2^15543 hoạt động tốt.

Tôi không có nơi nào gần đạt giới hạn bộ nhớ trên hệ thống lưu trữ và tôi không tin rằng tôi thậm chí còn gần với giới hạn VM (ở bất kỳ tốc độ nào chạy với đối số VM -Xmx1024M-Xms1024M không có hiệu lực).

Sau khi lướt qua internet tìm kiếm câu trả lời tôi đã nghi ngờ rằng tôi đang đạt đến giới hạn trong số BigInteger hoặc String liên quan đến kích thước tối đa của mảng (Integer.MAX_VALUE). Nếu vấn đề là ở String Tôi nghĩ rằng nó có thể mở rộng BigInteger và viết một phương pháp in mà spews ra một vài ký tự tại một thời gian cho đến khi toàn bộ BigInteger được in, nhưng tôi khá nghi ngờ rằng vấn đề nằm ở nơi khác.

Cảm ơn bạn đã dành thời gian đọc câu hỏi của tôi.

+0

Hmm, mã này hoạt động tốt cho tôi và cũng hoạt động tốt ở đây: http://ideone.com/EA0yl. –

+0

Tôi nghĩ rằng vấn đề có thể là thiết bị đầu cuối của bạn. Thay vào đó, hãy thử in tệp đó vào tệp. –

+2

Bạn có thể gỡ lỗi thời gian chạy. Sử dụng jdk - nó có nguồn –

Trả lời

11

Sự cố là lỗi của giao diện điều khiển trong Eclipse.

Khi thiết lập của tôi, Eclipse (Helios và Juno) không thể hiển thị một dòng dài hơn 4095 ký tự mà không có CRLF. Độ dài tối đa có thể khác nhau tùy thuộc vào lựa chọn phông chữ của bạn - xem bên dưới.

Do đó, ngay cả mã sau đây cũng sẽ hiển thị sự cố - không cần BigInteger.

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

Điều đó nói rằng, chuỗi này thực sự được in trong bảng điều khiển - ví dụ: bạn có thể sao chép chuỗi đó ra khỏi bảng điều khiển. Nó chỉ không được hiển thị.

Là một khắc phục, bạn có thể thiết lập Fixed width console thiết lập trong tùy chọn Console, chuỗi sẽ immediatelly xuất hiện:

view of the pref

Các lỗi tương ứng trên bugzilla của Eclipse là:

Theo đó, đó là lỗi Windows/GTK và các nhà phát triển Eclipse không thể làm gì được.

Các lỗi liên quan đến độ dài của văn bản là pixel, sử dụng một phông chữ nhỏ hơn và bạn sẽ có thể để có được nhân vật ở những văn bản trước khi nó phá vỡ.

+0

Chắc chắn kết quả hiển thị với bảng điều khiển chiều rộng cố định được bật. Tôi cần phải thực hiện cách ly vấn đề tốt hơn. Cảm ơn bạn đã dành thời gian. – Techrocket9