2012-06-23 23 views
7

Estoy tratando de resolver el siguiente problema relacionado con BigIntegers en Java 7 x64. Estoy intentando calcular un número a una potencia extremadamente alta. El código está debajo, seguido de una descripción del problema.Impresión BigIntegers muy grandes

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

Tengo problemas para imprimir el resultado de esta operación. Cuando este código se ejecuta, imprime el mensaje pero no el valor de images.toString().

Para aislar el problema comencé a calcular las potencias de dos en lugar del cálculo deseado que figura en el comentario en esa línea. En los dos sistemas en los que he probado esto, 2^15544 es el cálculo más pequeño que desencadena el problema; 2^15543 funciona bien.

No estoy ni cerca de alcanzar el límite de memoria en los sistemas host y no creo que esté ni siquiera cerca del límite de VM (al menos ejecutar con los argumentos de VM -Xmx1024M no tiene ningún efecto).

Después de hurgar la Internet en busca de respuestas que he llegado a sospechar que estoy golpeando un límite, ya sea en BigInteger o String relacionado con el tamaño máximo de una matriz (Integer.MAX_VALUE) que esos tipos utilizan para el almacenamiento de datos interno. Si el problema está en String, creo que sería posible extender BigInteger y escribir un método de impresión que arroje algunos caracteres a la vez hasta que se imprima el BigInteger completo, pero sospecho que el problema está en otra parte.

Gracias por tomarse el tiempo para leer mi pregunta.

+0

Hmm, este código funciona bien para mí, y también funciona bien aquí: http://ideone.com/EA0yl. –

+0

Creo que el problema podría ser su terminal. Intente imprimirlo en un archivo en su lugar. –

+2

Puede depurar el tiempo de ejecución. Use jdk - tiene fuente –

Respuesta

11

El problema es un error de la vista de la consola en Eclipse.

En mi configuración, Eclipse (Helios y Juno) no puede mostrar una sola línea de más de 4095 caracteres sin CRLF. La duración máxima puede variar según la elección de fuente, ver abajo.

Por lo tanto, incluso el siguiente código mostrará el problema: no es necesario un BigInteger.

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

Dicho esto, la cadena se imprime realmente en la consola; por ejemplo, puede copiarla de ella. Simplemente no se muestra.

Como solución alternativa, se puede establecer Fixed width console configuración en Preferencias de la consola, la cadena immediatelly aparecer:

view of the pref

Los errores correspondientes en Bugzilla de Eclipse son:

Según esos, es un error de Windows/GTK y los desarrolladores de Eclipse no pueden hacer nada al respecto.

El error está relacionado con la longitud del texto es el píxel, utilizan un pequeño fuente y usted será capaz de obtener más caracteres en el texto antes de descansos.

+0

Efectivamente, el resultado se muestra con la consola de ancho fijo habilitada. Debería haber hecho un mejor aislamiento del problema. Gracias por tu tiempo. – Techrocket9

Cuestiones relacionadas