Wurzelberechnung Newton BigDecimal

Kas

Neues Mitglied
Hallo!
Da dies hier mein erstes Thema ist, hoffe ich einfach, dass ich alles richtig mache...

Ich habe folgendes Problem. Wir sollen ein Programm schreiben, dass die Wurzel einer Zahl auf n stellen genau berechnet. Dazu sollen wir das newton-verfahren nutzen, dass sich durch die Folge x(i) = 0,5*(x(i-1)+a/x(i-1)) der wurzel aus a annähert.
Zur Umsetzung sollen wir die Klasse BigDecimal nutzen. Bisher habe ich damit aber noch nie gearbeitet und bin mir nicht sicher, ob ich sie richtig benutzt habe.
Das Programm, das ich geschrieben habe, läuft zwar durch, gibt aber immer nur eine Zahl mit einer Nachkommastelle aus. Ich weiß nicht, woran das liegt. Vielleicht könnt ihr mir ja helfen. Hier erstmal das, was ich so zustande bekommen habe:

Java:
import java.math.BigDecimal; 

public class Wurzel
{
	BigDecimal a;
	int N;
	BigDecimal x = new BigDecimal("1");
	
	public Wurzel(BigDecimal a, int N)
	{
		this.a = a;
		this.N = N;
	}
	
	public BigDecimal newton(BigDecimal na, BigDecimal nx)
	{
		BigDecimal ergebnis;
		BigDecimal halb = new BigDecimal("0.5");
		ergebnis = halb.multiply(nx.add(na.divide(nx)));
		
		return ergebnis;
	}
	public BigDecimal berechneWurzel()
	{
		BigDecimal zehn = new BigDecimal("10");
		BigDecimal eins = new BigDecimal("1");
		BigDecimal n = eins.divide(zehn.pow(N));
		
		while(a.subtract(x.multiply(x)).compareTo(n) == 1)
		{
			x = newton(a, x);
		}
		
		return x;
	}
	
	public static void main (String [] args)
	{
		Wurzel Test = new Wurzel(new BigDecimal("2"), 1);
		BigDecimal wurzel = Test.berechneWurzel();
		System.out.println(wurzel);
	}
}
 
S

SlaterB

Gast
keinen Sinn dafür es selber zu testen?
paar Bugs sind noch drin, vergleiche doch einfach mit Rechnung nebenher auf Papier,

deine main-Methode ist leider nicht so gutes Beispiel, bei Grenze 0.1 ist 1.5 schon nahe genug an der Wurzel von 2,
versuche offensichtlich auch größeres N, muss das erst jemand anders vorschlagen?

ein nicht ganz so leicht zu erkennendes denkbares Problem:
compareTo liefert theoretisch eigentlich nur entweder 0, <0 oder >0, du solltest nicht genau auf 1 testen,
auch wenn das hier bei BigDecimal wohl immer der Fall sein wird, prüfe auf >0, dann bist du bei beliebigen korrekten Implementierungen auf der richtigen Seite

System.out.println("zza".compareTo("dgfgf"));
liefert 22..
 

Kas

Neues Mitglied
Erstmal danke für deine Antwort!
Ja, dass 1 nicht so sinnvoll ist, habe ich auch ziemlich bald festgestellt :oops:
Also in der api von BigDecimal stand, dass es für < -1, für = 0 und für > 1 ausgibt, deshalb da die 1.

Aber wir haben es jetzt auch selbst hinbekommen. Es lag zum einen daran, dass man bei den Divisionen N als scale und RoundingMode.DOWN einsetzen musste, damit genügen Nachkommastellen angezeigt werden, und in der Bedingung der while-Schleife noch ein abs() hinzufügen, denn es kann ja auch sein, dass der die errechnete Zahl zu weit UNTER a liegt.
Also 2 echt kleine Sachen...

Viele Grüße, Kas
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Wurzelberechnung (mittels Newton) Java Basics - Anfänger-Themen 14
S Wurzelberechnung n-ter Ordnung (Geometrisches Mittel) Java Basics - Anfänger-Themen 4
T Newton Fraktal Java Basics - Anfänger-Themen 1
N Frage zum Newton-Fraktal Java Basics - Anfänger-Themen 1
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D BigDecimal Ausgabe sehr lang. Java Basics - Anfänger-Themen 2
I BigDecimal und Berechnungen weiterhin mit + / - usw. Java Basics - Anfänger-Themen 11
B TableView: laufender Saldo mit BigDecimal? Java Basics - Anfänger-Themen 6
I BigDecimal als Parameter verwenden Java Basics - Anfänger-Themen 3
Joker4632 Klassen BigDecimal Multiplikation liefert nicht erwarteten Wert Java Basics - Anfänger-Themen 6
A Kaufmännisches Runden mit BigDecimal Java Basics - Anfänger-Themen 14
G Compiler-Fehler BigDecimal Java Basics - Anfänger-Themen 5
AssELAss Datentypen BigDecimal Vergleichen ob Ergebnis >= 200 Java Basics - Anfänger-Themen 5
AssELAss Über ein Objekt vom Typ BigDecimal iterieren Java Basics - Anfänger-Themen 6
I BigDecimal < 0 Java Basics - Anfänger-Themen 12
E BigDecimal PQ Formel Java Basics - Anfänger-Themen 16
H DecimalFormat mit BigDecimal? Java Basics - Anfänger-Themen 6
W BigDecimal bei Rechnungen Java Basics - Anfänger-Themen 5
neurox BigDecimal setScale wird ignoriert Java Basics - Anfänger-Themen 2
N max(BigDecimal,BigDecimal) Java Basics - Anfänger-Themen 2
P Mit double und BigDecimal rechnen Java Basics - Anfänger-Themen 6
M JTable Spalte ist bigDecimal Java Basics - Anfänger-Themen 2
G BigDecimal -- exception Java Basics - Anfänger-Themen 3
G BigDecimal mit zwei Nachkommastellen darstellen Java Basics - Anfänger-Themen 2
H integer 2 bigdecimal ? Java Basics - Anfänger-Themen 2
A Problem mit BigDecimal? Java Basics - Anfänger-Themen 3
G sehr kleine Dezimalzahlen (BigDecimal) falsch angezeigt Java Basics - Anfänger-Themen 5
B BigDecimal Java Basics - Anfänger-Themen 6
B String to BigDecimal Java Basics - Anfänger-Themen 3
T Wissenschaftliche Notationen + BigDecimal Java Basics - Anfänger-Themen 5
T zwei BigDecimal vergleichen Java Basics - Anfänger-Themen 2
B Frage zu BigDecimal! dringend Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben