Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich möchte gerne eine Potenzmethode schreiben die auch Funktioniert wenn man zwei double werte eingibt. Das Problem liegt eigentlich nur an k dem Exponenten denn ist dieser ja ein Bruch so habe ich ja eine Wurzel.
Ich habe so angefangen das klappt aber nur wenn k = int ist!
Ich müsste ja im ersten schritt mir erst mal k anschauen und es kleiner machen als 1 danach dann die gesagte Wurzel ziehen mit diesem Exponenten!
Doch ich weiß nicht so recht wie ich das machen soll.
Die Quadratwurzel und Kubikwurzel folgen noch der Code ist fast fertig. Muss ich dann für jeden Fall die passende Wurzel berechnen?
Hat jemand so etwas schon mal gemacht? Ich mach es nur aus Spaß also falls nichts gescheides dabei raus kommt wäre es nicht so schlimm doch Interessieren tut mich eben schon
public static double pow(double x, double k) {
double result = 1.0; // bitte verwende Sum nicht für etwas was keine Summe ist
for(int exp = 1; exp <= k; exp++) { // for-Schleife anstatt solcher while-Konstruktionen
result *= x;
}
// für Wurzel
double w = k - (int)k;
// hier Wurzel
return result;
}
Ich würde mal vermuten, dass so etwas intern durch exp(k*ln(x)) berechnet wird. Für die numerische Berechnung der Exponentialfunktion und den Logarithmus gibt es effiziente Algorithmen. Zum Spaß kann man das aber mal über Reihenentwicklungen realisieren.
Okay soweit habe ich das alles verstanden und es läuft mein Problem ist jetzt nur noch der Rest.
Denn wir Potenzieren ja bei k=2.33 Basis ^2. Aber was ist mit dem Rest von .33? Ich würde den jetzt erst in einen Bruch versuchen umzuwandeln was aber auch wieder keine Gute Idee ist da es ja auch zahlen gibt wie .33 die Periodisch im Binären sind.
Wie kann ich den mit Log oder exp eine Wurzel umschreiben das verstehe ich grade nicht?
Denn die können ja in einer Pow Methode nicht jede Primzahl-Wurzel Implementiert haben. Denn jede Ungerade Wurzel -1 gibt gerade das kann man ja über das Potenzgesetz ((Basis)^1/2)^1/2 = 4te Wurzel von Basis ... und so weiter rechnen doch wenn man bei der 7ten Wurzel ist wie dann?
Java:
public static double sqrt(double x) {
double q=1.0;
int step=0;
while(Math.abs(x-q*q)>1e-8) {
q=(q+x/q)/2;
step++;
}
return q;
}
Java:
public static double exp(double x) {
int n=0;
double an=1;
double sn=1;
while(Math.abs(an)>EPSILON*Math.abs(sn)) {
an *= x/(n+1);
sn += an;
n++;
}
return sn;
}
Kennst du die Algorithmen für exp und ln z. B. die schneller (effizienter) sind als die Reihenentwicklung?
Denn mit der Reihenentwicklung habe ich jetzt einige Funktionen geschrieben das ist ja auch nicht wirklich weiter schwer
Hier mal noch ln(x) für -1<x<=1
Java:
public static double ln1plusX(double x) {
int n=1;
double an=x;
double sn=x;
while(Math.abs(an)>EPSILON*Math.abs(sn)) {
an *= -x*n/(n+1);
sn += an;
n++;
}
da hab ich gar nicht mehr dran gedacht ich habe ja dann eine Rationale Zahl! mhhh... misst dann weiß ich keine Annäherungsverfahren an eine N-te Wurzel
Ich könnte die Zahl mit String in einen Bruch umwandeln doch das Hilft ja alles nix! Komme ich auf eine Primzahl habe ich das Problem mit der doofen Wurzel
Denn ich kann ja nicht in meiner POW methode Math.Pow(x, k) = exp(k*ln(x)) benutzen das wäre ja doof außer ich nehme meine Reihen oder eben den BKM Algorithmus aber erstmal wichtigere Dinge machen das ist ja nur so just for fun =)
Nur für -exponenten läuft es nicht da mein log nur für positive x definiert ist und ich keine Ahnung habe wie ich eine negative Variante hin bekomme aber so läuft es ja erstmal =)
Ich denke das die Pow methode in java anders läuft es gibt sicher eine Methode die N-Te Wurzel irgendwie so zu berechnen!
Den Link verstehe ich nicht da wir noch kein c hatten vielleicht verstehe ich das ja auch dann später mal und verstehe wie es RICHTIG gemacht wird
Denn ich will es ja auch Ordentlich Lernen also viel ÜBEN
Ohne das im Detail verstehen zu müssen, kann man erkennen, dass hier letztlich exp(y*log(x)) berechnet werden muss. Die etwas andere Darstellung dürfte sich ergeben, weil hier auf Bit-Ebene mit Gleitkommazahlen nach IEEE-754 gearbeitet wird. Das will ich jetzt aber echt nicht nachvollziehen