2009-09-06 1 views
29

Existe-t-il des bibliothèques pour la racine carrée sur BigDecimal en Java?Existe-t-il des bibliothèques pour la racine carrée sur BigDecimal?

+0

Je me demande, pourquoi avez-vous besoin de calculer les racines carrées d'un BigDecimal? Double a trop petite portée? –

+11

Pour la même raison, tout le monde utilise BigDecimal: le double manque de précision. –

+0

Daniel, mais aussi le calcul de la racine carrée. Vous ne pouvez pas calculer sqrt (2) avec une précision infinie. L'utilisation de la méthode de Newton pour calculer la racine carrée introduit une erreur propre, inhérente à l'algorithme. –

Répondre

14

JScience v4.3.1 a une classe Real qui semble être l'équivalent de BigDecimal et qui pourrait vous aider. Un exemple d'utilisation:

// 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 

Modifier: Mis à jour le code et les liens pour refléter la version en vigueur au moment (v4.3.1). Basé sur @ile an @Tomasz commentaires, merci.

+0

Fantastique, merci! –

+0

J'ai téléchargé le package JScience et il semble qu'il n'y ait plus de Decimal. Le lien ci-dessus est cassé. –

+0

Il a une classe LargeInteger qui semble équivalente http://jscience.org/api/org/jscience/mathematics/number/LargeInteger.html –

12

Essayez Big Square Roots. Il utilise le Newton's method pour approcher des solutions telles que les racines carrées.

+0

Le lien est rompu. Mais je peux obtenir ce qui semble être le même code https://ritdml.rit.edu/bitstream/handle/1850/8800/BigSquareRoot.java?sequence=4 – demongolem

+0

Lien dans le commentaire de demongolem est également cassé –

1

(Ce ne peut être une solution pour vous)

Tant que votre BigDecimal est dans la gamme de double, vous pouvez convertir le BigDecimal doubler, utiliser Math.sqrt() et promouvoir le double back à BigDecimal. Ce sera probablement plus rapide que de faire le calcul sur BigDecimals. Dans de nombreux cas, la perte de précision due à la conversion entre les types sera négligeable par rapport à l'erreur inévitable dans le calcul de la racine carrée.