2009-09-06 13 views
29

¿Hay alguna biblioteca para Square Root sobre BigDecimal en Java?¿Hay bibliotecas para Square Root en lugar de BigDecimal?

+0

Me pregunto, ¿por qué necesita calcular las raíces cuadradas de un BigDecimal? El doble tiene un rango demasiado pequeño? –

+11

Por la misma razón que alguien usa BigDecimal: doble falta de precisión. –

+0

Daniel, pero también lo hace el cálculo de la raíz cuadrada. No puede calcular sqrt (2) con precisión infinita. El uso del método de Newton para calcular la raíz cuadrada introduce un error propio, inherente al algoritmo. –

Respuesta

14

JScience v4.3.1 tiene una clase Real que parece ser el equivalente a BigDecimal y que podría ayudarle. Un ejemplo de uso:

// The Square Root of Two, to 30 digits 
// According to "The Square Root of Two, to 5 million digits." 
// Source: http://www.gutenberg.org/files/129/129.txt 
System.out.println("1.41421356237309504880168872420"); 

// Using JScience with 50 digits precision 
Real.setExactPrecision(50); 
System.out.println(Real.valueOf(2).sqrt()); 

// Using default java implementation 
System.out.println(Math.sqrt(2)); 

> 1.41421356237309504880168872420 
> 1.414213562373095048801689 
> 1.4142135623730951 

Editar: Actualizado el código y los enlaces para reflejar la versión actual en el momento (v4.3.1). Basado en @ile y comentarios de @Tomasz, gracias.

+0

¡Fantástico, gracias! –

+0

Descargué el paquete JScience y parece que ya no hay Decimal. El enlace de arriba está roto. –

+0

Tiene una clase LargeInteger que parece equivalente http://jscience.org/api/org/jscience/mathematics/number/LargeInteger.html –

12

Probar Big Square Roots. Utiliza el Newton's method para aproximar soluciones como las raíces cuadradas.

+0

El enlace está roto. Pero puedo obtener lo que parece ser el mismo código https://ritdml.rit.edu/bitstream/handle/1850/8800/BigSquareRoot.java?sequence=4 – demongolem

+0

El enlace en el comentario de demongolem también está roto –

1

(Esto es puede no ser una solución para usted)

Mientras su BigDecimal está en el rango del doble, se puede convertir el BigDecimal duplicar, usar Math.sqrt() y promover la doble vuelta a BigDecimal. Probablemente sea más rápido que llevar a cabo el cálculo en BigDecimales. En muchos casos, la pérdida de precisión debida a la conversión entre tipos será insignificante en comparación con el error inevitable al calcular la raíz cuadrada.

Cuestiones relacionadas