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/27Meine 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.
-
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
-
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/27Die 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.
-
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.0pi)));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,3333und das kommt bei mir raus:
y2=-0,61
y3=-0,18ich 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);