Wurzelberechnung

Status
Nicht offen für weitere Antworten.

max5432

Aktives Mitglied
Hallo allerseits

Es würde mich interessieren, wie die Wurzelberechnung in der Tat implementiert wird. Die Methode Math.sqrt greift auf die Methode StrictMath.sqrt,die wiederum eine native-Methode ist: den Code kann ich nicht sehen.

Sicher könnte ich mit einem kleinen Wert beginnen, der danach mit sich multipliziert wird, bis der vorgegebne Delta-Wert unterschritten wird. Aber, richtig effizient ist das nicht.

Kennt jemand einen Algorithmus, mit dem dies effizient(er) gemacht werden kann?

Danke.
 

Ark

Top Contributor
Dauert dir das Wurzelziehen mittels Math.sqrt() zu lange? Wenn ja: Hier im Forum und in der Wikipedia sind genügend Beispiele zu finden, sowohl für Ganzzahlen als auch für Gleitkommazahlen. Einfach mal ein bisschen suchen. ;)

Ark
 

max5432

Aktives Mitglied
Ich möchte nicht mit Math.sqrt arbeiten. Es geht mir um Algorithmus. Und, habe zwar gesucht, jedoch nichts passendes gefunden. Aber, wenn du sagst, dass es genug Beispiele gibt, werde ich noch einmal Google bemühen.
 

max5432

Aktives Mitglied
Dauert dir das Wurzelziehen mittels Math.sqrt() zu lange? Wenn ja: Hier im Forum und in der Wikipedia sind genügend Beispiele zu finden, sowohl für Ganzzahlen als auch für Gleitkommazahlen. Einfach mal ein bisschen suchen. ;)

Ark

Ich habe jetzt noch etwas gesucht, bin aber nicht schlauer geworden.

Heron-Verfahren ? Wikipedia

Da habe ich gesehen, wie dies in etwa funktionieren sollte, aber nur in etwa.

Folgendes ist mein Problem:

Ich möchte das Potenzieren von Zahlen implementieren, ohne aber auf Math.pow(double, double) zuzugreifen (wieso, ist jetzt nicht relevant). Dabei soll der Exponent einen beliebigen Wert haben: sowohl ganze Zahlen als auch Fliesskommazahlen müssen berücksichtigt werden.

Ich weiss folgendes:
- die Basis darf nicht negativ sein, während
- der Exponent sowohl positiv als auch negativ sein darf.

Das geht noch, solange der Exponent eine ganze Zahl ist. Wenn aber der Exponent eine Fliesskommazahl ist, habe ich folgende Situation:

double a = 2^3.5

Berechnung:

a = 2^3 * 2^0.5

Auch das geht noch, da 2^0.5 an sich die zweite Wurzel aus 2 ist (1/0.5), und das kann man noch berechnen.

Sehen wir uns den folgenden Fall an:

a = 3^-0.776

Wie soll ich jetzt aus dem Nachkomateil herausfinden, um welche Wurzel es sich handelt? Wenn ich 1 / 0.776 berechne und daraus eine int-Zahl mache, muss ich mit Fehler rechnen (Rundung), der im Fall mit 0.5 nicht vorhanden war. Das Ergebnis ist dementsprechend ungenau. Was kann man hier machen? Gibt es hier etwas, wass ich im Moment nicht gesehen / gefunden habe?

Danke.
 

Ark

Top Contributor
Wenn du so was berechnen willst, greifst du der Einfachheit halber auf e als Basis zurück (^ bedeutet "hoch"):

Code:
a^x = e^(x * ln(a))

Taylorreihen dazu gibt's auch in der Wikipedia.

Ark
 

max5432

Aktives Mitglied
Nun, musste doch zu meinem Buch (Gieck: Technische Formelsammlung) greifen ;(.

Dort habe ich entsprechende Taylorsche Reihen sowohl für a^x als auch ln(x) gefunden. Jetzt kann ich die Potenz-, Wurzel und Ln-Berechnung machen, ohne auf die entsprechenden Methoden der Klasse Math zugreifen zu müssen.

Danke für den Tipp.
 
J

JohannisderKaeufer

Gast
Wenn ich das richtig verstanden habe geht es bei dir klar Ganzzahlige Wurzeln zu ziehen?
(Ganzzahlige Wurzel von beliebiger positiver Basis)

also 3^0.776 ist das selbe wie (3^(1/1000))^776

sofern du es nun schaffst die Tausendste Wurzel von 3 zu berechnen :toll:

aus 3^-0.776 wird 3^-1 * 3^(1-0.776) also 1/3 * 3^0.224 und somit 1/3 * (3^(1/1000))^224 :toll:

und somit Schlußendlich 1/3 * (TausendsteWurzel von 3)^224
 

max5432

Aktives Mitglied
Mag sein, dass ich etwas falsch mache, aber es klappt:

3^0.001 = 1.001099215984204

Und, wenn ich es umgekehrt rechne:

1.001099215984204 ^1000 = 2.999999999999948

Und das geht auch:

3^0.776 = 2.345557552755781

Oder, habe ich etwas falsch verstanden ???:L?
 

0x7F800000

Top Contributor
und somit Schlußendlich 1/3 * (TausendsteWurzel von 3)^224
Leit's mal ab, schau dir mal die Fehlerverstärkung an... Und was willst du dann mit 2^0.123456789 machen? Wurzelziehen, alles hoch 123456789 nehmen? :autsch:

Eine eher praktikable aber dennoch einfache Methode wird hier beschrieben:
CORDIC ? Wikipedia

Einen Beispiel zu den Arkusfunktionen hab ich hier schonmal geschrieben:
http://www.java-forum.org/allgemeine-java-themen/86583-arkussinus-effizient-berechnen.html (obwohl's anscheinend keiner brauchbar fand... funktioniert hat's jedenfalls^^)
 

Ark

Top Contributor
Einbauen? ???:L Wo wolltest du denn das einbauen? das war eigentlich als rein akademischer Spaß gedacht^^ Das alles ist doch eh schon in die Hardware reingebrannt, wozu da noch eine Softwareimplementierung?
Weil die Funktion für eine Umgebung zur Verfügung gestellt werden möchte, die so was nicht kennt. ;)

Ark
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben