2009-09-06 12 views
29

Czy są jakieś biblioteki dla programu Square Root przez BigDecimal w Javie?Czy istnieją biblioteki programu Square Root w wersji BigDecimal?

+0

Zastanawiam się, dlaczego musisz obliczyć pierwiastek kwadratowy BigDecimal? Pokój dwuosobowy ma zbyt mały zasięg? –

+11

Z tego samego powodu każdy używa BigDecimal: double nie ma precyzji. –

+0

Daniel, ale także obliczenia pierwiastka kwadratowego. Nie można obliczyć sqrt (2) z nieskończoną precyzją. Użycie metody Newtona do obliczenia pierwiastka kwadratowego wprowadza własny błąd związany z algorytmem. –

Odpowiedz

14

JScience v4.3.1 ma klasę Real, która wydaje się być odpowiednikiem BigDecimal i która może ci pomóc. Przykład użycia:

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

Edit: Zaktualizowano kod i łącza, aby odzwierciedlać aktualną wersję w tym czasie (v4.3.1). Na podstawie komentarzy @ile a @ Tomasz, dzięki.

+0

Fantastyczne, dzięki! –

+0

Pobrałem pakiet JScience i wydaje się, że nie ma już dziesiętnego. Powyższy link jest uszkodzony. –

+0

Posiada klasę LargeInteger, która wydaje się być równoważna http://jscience.org/api/org/jscience/mathematics/number/LargeInteger.html –

12

Wypróbuj Big Square Roots. Używa on Newton's method do przybliżania rozwiązań takich jak pierwiastki kwadratowe.

+0

Link jest uszkodzony. Ale mogę dostać to, co wydaje się być ten sam kod https://ritdml.rit.edu/bitstream/handle/1850/8800/BigSquareRoot.java?sequence=4 – demongolem

+0

Link w komentarzu demongolem jest również zepsuty –

1

(To nie może być rozwiązaniem dla ciebie)

Dopóki BigDecimal jest w zakresie podwójne, można przekonwertować BigDecimal podwoić, użyj Math.sqrt() i promować zawrócić do BigDecimal. Prawdopodobnie będzie to szybsze niż wykonanie obliczeń na BigDecimals. W wielu przypadkach utrata precyzji z powodu konwersji między typami będzie nieistotna w porównaniu z nieuniknionym błędem w obliczaniu pierwiastka kwadratowego.

Powiązane problemy