2012-04-07 15 views

Respuesta

18

Como mencionó en su pregunta, debe usar BigInteger.

Pueden ser tan grandes como lo necesite, hasta que se quede sin memoria.

+0

el problema es que tengo que averiguar la raíz cuadrada de un número.Pero no hay una biblioteca incorporada para encontrar la fuente cuadrada de un entero de error. – Ashwin

+0

@Ashwin: Espere un minuto: si no se garantiza que la raíz cuadrada sea decimal, ¿por qué no está utilizando simplemente un doble? –

+0

@HovercraftFullOfEels: Como dije, mi número supera los 64 bits, donde el tamaño del doble es 64 bits – Ashwin

2

está buscando ya sea para la clase BigDecimal o si solo necesita enteros, que BigInteger. Su precisión arbitraria, por lo que el tamaño cambia en función de cuán grandes son los números que ingresa

3

¿Cuál es el tamaño de BigInteger en java?

Eso es un poco complicado. El problema es que no existe una especificación clara del límite en los javadocs.

  • La clase utiliza un int[] para representar la magnitud. Esto significa que podría representar números hasta ((2^32)^(2^31 - 1).

  • La API tiene un método que devuelve el número como una matriz de bytes de complemento a 2. El límite para esto es ((2^8)^(2^31 - 1).

  • La API tiene otro método que devuelve el tamaño del número en bits ... como int. Esto implica un límite de 2^(2^31 - 1) o quizás 2^(2^32).

En la práctica, estos números son todos tan grande que se quiere probablemente topado con límites de espacio de almacenamiento dinámico (o límites de rendimiento de la CPU) primero.


el problema es que tengo que averiguar la raíz cuadrada de un número.

Debería poder encontrar un algoritmo para calcular las raíces cuadradas en sus libros de texto de matemáticas de pregrado (o Wikipedia). Codificarlo debería ser una tarea simple.

(me gustaría señalarle al ejemplo de código, excepto que esta huele a "tareas", y yo no confían en su totalidad el código que he encontrado.)

No se olvide que la mayoría de enteros tiene una raíz cuadrada irracional ...

0

Para encontrar una raíz cuadrada de un BigInteger, debe hacer una búsqueda en Google con las respuestas "-StackOverflow" omitidas. https://www.google.com/search?q=java+extract+root+bignum&ie=utf-8&oe=utf-8#q=java+root+BigInteger+-stackoverflow.com+-stackexchange.com produce el primer enlace a http://faruk.akgul.org/blog/javas-missing-algorithm-biginteger-sqrt/ Aquí hay un algoritmo. Se supone que Java es "escribir una vez, usar en todas partes". Bueno, algunos usuarios de SO creen que debes reinventar la rueda. Pídales un módulo que respondan "huele a tarea, hágalo usted mismo". Y sí, BigInteger está medio cocido. No puede hacer logaritmos o raíces fuera de la caja. Es extremadamente lento El algoritmo se da a continuación.

BigInteger sqrt(BigInteger n) { 
    BigInteger a = BigInteger.ONE; 
    BigInteger b = new BigInteger(n.shiftRight(5).add(new BigInteger("8")).toString()); 
    while(b.compareTo(a) >= 0) { 
    BigInteger mid = new BigInteger(a.add(b).shiftRight(1).toString()); 
    if(mid.multiply(mid).compareTo(n) > 0) b = mid.subtract(BigInteger.ONE); 
    else a = mid.add(BigInteger.ONE); 
    } 
    return a.subtract(BigInteger.ONE); 
} 
Cuestiones relacionadas