Erste Schritte Potenzmethode per double

Diskutiere Potenzmethode per double im Java Basics - Anfänger-Themen Forum; Hallo, ich möchte gerne eine Potenzmethode schreiben die auch Funktioniert wenn man zwei double werte eingibt. Das Problem liegt eigentlich nur...

  1. ocsme
    ocsme Mitglied
    Hallo,

    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!

    Code (Java):
    public static double pow(double x, double k) {
            double sum=1.0;
            while(k>0) {
                sum*=x;
                k--;
            }
            return sum;
        }
    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 :)

    LG
     
  2. Vielleicht hilft dir dieses Training hier weiter.
  3. MoxxiManagarm
    MoxxiManagarm Aktives Mitglied
    Deinen bestehenden Code so umschreiben:
    Code (Java):

    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;
    }
     
  4. mihe7
    mihe7 Bekanntes Mitglied
    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.
     
  5. ocsme
    ocsme Mitglied
    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?

    Code (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;
        }
    Code (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;
        }
       
     
  6. mihe7
    mihe7 Bekanntes Mitglied
    Lesen:
    pow(x, k) = exp(k*ln(x))
     
  7. ocsme
    ocsme Mitglied
    achso hast du es gemeint. Hier hab ich noch einen Link für die herleitung der nten Wurzel so könnte man es sicher auch irgendwie hin bekommen. Da ich noch mehr zu tun habe lasse ich das erst einmal und versuche sowas wieder später :D
    https://www.math.uni-sb.de/ag/wittstock/lehre/WS00/analysis1/Vorlesung/node38.html

    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 :D

    Hier mal noch ln(x) für -1<x<=1

    Code (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++;
            }
    EPSILON ist eine Konstante bei mir sieht so aus.
    Code (Java):
        public final static double EPSILON = 1E-16;
     
     
  8. mihe7
    mihe7 Bekanntes Mitglied
    Dein n ist aber keine natürliche Zahl.

    z. B. https://de.wikipedia.org/wiki/BKM-Algorithmus - ansonsten findet man ein Uni-Skript, hab den Link aber nicht mehr - Google hilft.
     
  9. ocsme
    ocsme Mitglied
    o_O 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 :D außer ich nehme meine Reihen oder eben den BKM Algorithmus :D aber erstmal wichtigere Dinge machen das ist ja nur so just for fun =)

    Danke für den Link :)
     
  10. ocsme
    ocsme Mitglied
    Läuft danke ich konnte die Finger doch nicht davon lassen :D
    Mit dem Trick von dir echt geiloooo verstehe es zwar nicht zu 100% aber es geht :D

    Hier der Code:
    Code (Java):
    public static double pow(double x, double k) {
            double tmp=1;
            for(int i=1;i<=k;i++) {
                tmp*=x;
            }
            double kk=k-(int)k;
            return tmp*exp(kk*lnxx(x));
        }
    System.out.println(Undefined.pow(5, 4.1212));
    System.out.println(Math.pow(5, 4.1212));


    Ausgabe:
    759.6178855890656
    759.6178855890657

    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 :D 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!

    LG
     
  11. mihe7
    mihe7 Bekanntes Mitglied
    ocsme gefällt das.
  12. Wenn du Java lernen möchtest, empfehlen wir dir dieses Online-Training hier
Passende Stellenanzeigen aus deiner Region:





Die Seite wird geladen...

Potenzmethode per double - Ähnliche Themen

Random Double mit Math.round() runden?
Random Double mit Math.round() runden? im Forum Java Basics - Anfänger-Themen
Double oder nicht?
Double oder nicht? im Forum Java Basics - Anfänger-Themen
int array als double array ausgeben
int array als double array ausgeben im Forum Java Basics - Anfänger-Themen
Double mit zwei festen NK-Stellen ausgeben
Double mit zwei festen NK-Stellen ausgeben im Forum Allgemeine Java-Themen
Int und Double in Array speichern
Int und Double in Array speichern im Forum Java Basics - Anfänger-Themen
Thema: Potenzmethode per double