# Wurzelberechnung



## max5432 (11. Okt 2009)

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 (11. Okt 2009)

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 (11. Okt 2009)

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 (11. Okt 2009)

Ark hat gesagt.:


> 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 (11. Okt 2009)

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


```
a^x = e^(x * ln(a))
```

Taylorreihen dazu gibt's auch in der Wikipedia.

Ark


----------



## max5432 (11. Okt 2009)

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.


----------



## JohannisderKaeufer (12. Okt 2009)

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 (12. Okt 2009)

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 (12. Okt 2009)

JohannisderKaeufer hat gesagt.:


> 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 (12. Okt 2009)

0x7F800000 hat gesagt.:


> 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^^)



Vielen Dank für die arcsin-Implementierung, aber irgendwie kam ich nicht dazu, sie einzubauen.  Also nochmals: Danke. 

Ark


----------



## 0x7F800000 (12. Okt 2009)

Ark hat gesagt.:


> irgendwie kam ich nicht dazu, sie einzubauen.


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?


----------



## Ark (12. Okt 2009)

0x7F800000 hat gesagt.:


> 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


----------



## 0x7F800000 (12. Okt 2009)

Ark hat gesagt.:


> Weil die Funktion für eine Umgebung zur Verfügung gestellt werden möchte, die so was nicht kennt.


Betriebsgeheimnis? Wenn nicht: wie klein war es, und was war es ungefähr^^ Vielleicht hast du ja versucht sowas zu einer zielsuchenden rakete umzubauen oder so?


----------



## Ark (12. Okt 2009)

0x7F800000 hat gesagt.:


> Betriebsgeheimnis?


Ja. :bae:

Ark


----------



## 0x7F800000 (12. Okt 2009)

Ark hat gesagt.:


> Ja. :bae:


Oooooooh^^ :applaus:


----------

