n-te Wurzel



  • Hallo,
    ich wollte ein Programm schreiben mit dem man kubische Gleichungen löst, doch jetzt bin ich an einem Punkt wo man von einer negativen Zahl die dritte Wurzel ziehen soll.
    Da es bei C ja keine vorgefertigete Funktion gibt hab ich es mit pow(x,(1.0/3.0)) probiert, aber es funktioniert einfach nicht.

    Hier die Zeile die Probleme macht:
    v=pow((-q/2.0)-sqrt(D),(1.0/3.0));
    wobei q=0 und D=1/27

    Meine Frage ist ob ich statt dem pow Befehl irgendwie anders die 3-Wurzel ziehen kann?



  • Mister004 schrieb:

    aber es funktioniert einfach nicht.

    Seltsam, wie äussert sich das?

    Dieses Programm:

    #include <stdio.h>
    #include <math.h>
    
    int main(void)
    {
        printf("%lf", pow(2, 1 / 2.0));
    }
    

    Gibt bei mir 1.414214 aus, und das ist die Wurzel aus 2, Ehrenwort.



  • Mister004 schrieb:

    Meine Frage ist ob ich statt dem pow Befehl irgendwie anders die 3-Wurzel ziehen kann?

    Da gibt es sicherlich viele Möglichkeiten. Das übliche Beispiel dafür, wie man das händisch macht, ist ein Iterationsverfahren nach Newton:
    http://de.wikipedia.org/wiki/Newton-Verfahren



  • Ich glaub dir dass das obenstehende Wurzel 2 ist.
    Gib bei dir einfach mal pow(-0,19,(1.0/3.0)) ein und schau ob und was er ausspuckt



  • printf("%lf"
    

    ist undefinertes Verhalten.



  • Wutz schrieb:

    printf("%lf"
    

    ist undefinertes Verhalten.

    Sieht ganz so aus.

    Warum ist das so?
    Weil etwaige float-Argumente für printf() sowieso zu double's promoted werden.



  • Mister004 schrieb:

    Gib bei dir einfach mal pow(-0,19,(1.0/3.0)) ein und schau ob und was er ausspuckt

    Kein Wunder, da soll pow() ja auch mit 3 Argumenten aufgerufen werden. pow() will aber nur 2 Argumente.


  • Mod

    Du merkst dir das Vorzeichen, ziehst die dritte Wurzel aus dem Betrag, stellst das Vorzeichen wieder vor das Ergebnis.



  • Zweite Fundstelle für math.h

    double pow(double x, double y);	// x[h]y[/h]. Ein Argumentfehler liegt vor bei x=0 und y<0, oder bei x<0 und y ist nicht ganzzahlig.
    

    Du kannst ja die Wurzel aus dem Absolutwert nehmen. Wenn der Wert < 0, muss die 3. Wurzel auch < 0 sein


  • Mod

    ⚠ Und noch was wichtiges: In C99 gibt es cbrt , das rechnet die dritte Wurzel korrekt aus.



  • Mister004 schrieb:

    Hier die Zeile die Probleme macht:
    v=pow((-q/2.0)-sqrt(D),(1.0/3.0));
    wobei q=0 und D=1/27

    Die Wurzel aus negativen Zahlen ist mathematisch nicht definiert. Ich vermute aber, dass hier die reelle der drei Wurzeln gemeint ist, d.h. im Grunde erweitert man die Definition auf $$\sqrt[3]{x} = -\sqrt[3]{-x}$$ für x < 0.



  • @SeppJ

    danke für den tollen Tipp mit cbrt() den hab ich bisher noch in keinem anderen forum gelesen. Jetzt funktionert der Teil endlich

    und danke auch an alle andere für die schnelle Hilfe



  • da ich hier schon unter Profis bin hätte ich noch eine Frage:

    wieso bekomme ich hier immer ein falsches Ergebnis:
    y2=2*sqrt((p/3)*(-1))*cos((phi/3)+((120.0*360.0)/(2.0pi)));
    y3=2*sqrt((p/3)*(-1))*cos((phi/3)+((240.0*360.0)/(2.0
    pi)));

    bei p=-1/3, phi=3.1415(pi) und pi ist mit 3.14159265 definiert

    es sollte rauskommen:
    y2=-2/3=-0,6666
    y3=-1/3=-0,3333

    und das kommt bei mir raus:
    y2=-0,61
    y3=-0,18

    ich hab herausgefunden das der fehler irgendwo beim cos liegen muss aber was mache ich flasch?



  • Wenn *360.0)/(2.0*pi) eine Umrechnung von Grad zu Bogenmaß sein soll, dann meinst du wohl das:

    y2=2*sqrt(-p/3)*cos(phi/3 + 120.0*pi/180);
    y3=2*sqrt(-p/3)*cos(phi/3 + 240.0*pi/180);
    

Log in to reply