wie kann ich in C aus einem Bruch eine Wurzel ziehen? z.B. x/y und daraus die wurzel? mfg
Ich würd entweder die Wurzel aus Zähler und Nenner einzeln ziehen, und dann wieder auf einen schönen Bruch erweitern, oder den Bruch in eine Kommazahl umwandeln, und dann die Wurzel ziehen. Gibts irgendwelche Rahmenbedingungen? (Keine Fließkommazahlen, wenig Speicher, möglichst schnell, hohe Genauigkeit, maximal 8 bit, glatter Bruch muss rauskommen, keine math.h, ...)
> Ich würd entweder die Wurzel aus Zähler und Nenner einzeln ziehen, ...
Wurzelziehen ist aber relativ langsam; deshalb wäre es i.d.R.
effizienter, erst zu dividieren, und dann nur einmal die
Wurzel zu ziehen.
Klaus Wachtler schrieb: > Wurzelziehen ist aber relativ langsam; deshalb wäre es i.d.R. > effizienter, erst zu dividieren, und dann nur einmal die > Wurzel zu ziehen. Ja, die Frage ist, ob es einen besonderen Grund gibt, wieso man die Zahl als Bruch hat, und ob man die als Bruch behalten will. Ich könnte mir vorstellen, dass es einfacher ist wieder auf einen glatten Bruch zu kommen, wenn man die Wurzeln getrennt zieht, sonst seh ich keinen direkten Vorteil daran mit einem Bruch weiter zu machen. (Abgesehen von irgendwelchen Situationen, in denen man komische Festkommaarithmetik mit unterschiedlichen Basen machen, um möglichst große Genauigkeit zu erziehlen.)
Man könnte das Newtonsche Näherungsverfahren dafür anwenden. Und zwar würde die Formel dafür so aussehen: Für eine Wurzelfunktion wie folgt
Würde die Formel wie folgt lauten
Das ganze lässt du nun in einer Schleife solange durchlaufen bis die genauigkeit so gut ist wie du sie brauchst
Eine dritte Alternative wäre es möglicherweise, die Wurzel gar nicht zu ziehen, wenn es nicht sein muss, sondern mathematisch zu umgehen. Natürlich nur, wenn dies möglich ist. Beispiel: Gegeben eine Menge von Städten, mit ihren Koordinaten. Gesucht die beiden Städte, deren Distanz maximal ist. Kein Problem denkt man sich da. Einfach in 2 ineinander geschachtelten Schleifen jede Stadt mit jeder anderen paaren und mittels Phythagoras die Distanz ausrechnen. Die jeweilige Distanz mit dem bisher gefundenen Maximum vergleichen und wenn größer hat man ein neues bisheriges Maximum. Aber: um den Phythagors anzuwenden, muss man Wurzeln ziehen. Das braucht man eber eigentlich gar nicht. Denn sqrt(x) > sqrt(y) dann und nur dann, wenn x > y das Wurzel ziehen ist also unnötig. Es reicht völlig die Summe der Quadrate der Koorinatendifferenzen miteinander zu vergleichen um die Aufgabe zu lösen. Wie gesagt: Das kommt immer aufs Problem an. Aber manchmal funktioniert es und man kann sich teure Operationen ersparen, weil man sie aufgrund mathematischer Zusammenhänge gar nicht berechnen braucht.
Albert ... schrieb: > Man könnte das Newtonsche Näherungsverfahren dafür anwenden. > Das ganze lässt du nun in einer Schleife solange durchlaufen bis die > genauigkeit so gut ist wie du sie brauchst Das bringt aber nichts. Denn etwas anderes macht die mitgelieferte sqrt Funktion höchst wahrscheinlich auch nicht. Nur ist die bereits hochgradig optimiert worden :-)
Karl heinz Buchegger schrieb: > Albert ... schrieb: >> Man könnte das Newtonsche Näherungsverfahren dafür anwenden. >> Das ganze lässt du nun in einer Schleife solange durchlaufen bis die >> genauigkeit so gut ist wie du sie brauchst > > Das bringt aber nichts. > Denn etwas anderes macht die mitgelieferte sqrt Funktion auch nicht. Nur > ist die bereits hochgradig optimiert worden :-) Achso, ich dachte er wüsste gar nicht wie man in C eine Wurzel zieht. Dann würde ich es so machen wie weiter oben beschrieben. Wurzel aus Zähler und Nenner separat und dann beide Dividieren. Vl. auch noch den Weg über die Logarithmen? Wer weiß ob es damit schneller/einfacher geht
Frag mal Opa oder jemanden dieser Altersklasse - die haben noch gelernt, schriftlich Wurzel zu ziehen. Ein weiterer Ansatz sind die Logarithmengesetze - wenn du z.B. schon einen Wert logarithmisch (z.B. vom Sensor) hast, kannst du gleich damit weiter rechnen.
ich weis auch nicht wie man die wurzel zieht :) kann ich auch den bruch in eine Variable schreiben und dann die wurzel aus der variable ziehen?
smart schrieb: > kann ich auch den bruch in eine Variable schreiben und dann die wurzel > aus der variable ziehen? Einen Bruch kannst du nicht in eine Variable schreiben. Eine Variable nimmt einen Wert auf. Aber du kannst natürlich den Wert des Bruches berechnen und diesen Wert in eine Variable schreiben. Aber eigentlich brauchst du die Variablr gar nicht. z = sqrt( (double)x / y ); Berechnet den Bruch als Gleitkommazahl und zieht die Wurzel davon. Die Frage ist nur: willst du das eigentlich? Oder hast du irgendwelche Beschränkungen, so dass es besser ist z = sqrt(x) / sqrt(y); zu berechnen. Vielleicht gibt es auch einen Weg, die Wurzel komplett zu vermeiden. Hint, hint, hint: erzähl doch mal etwas mehr, zeig vielleicht auch etwas Code. Dann kann man auch besser beraten.
ja, aber du kannst auch ohne die Variable gleich die Wurzel aus dem Bruch ziehen. Falls die Zahlen keine Gleitkommazahlen sind ggf. vorher umwandeln:
1 | #include <math.h> |
2 | ...
|
3 | |
4 | double x = 1.123, y = 3.456; |
5 | double z = sqrt( x/y ); |
6 | |
7 | int i = 12, j = 24; |
8 | double z2 = sqrt( (double)i/j ); |
Ggf. das -lm beim Linken nicht vergessen!
Und für die n-te Wurzel zum Beispiel:
1 | #include <math.h> |
2 | ...
|
3 | double bruch = 42.0 / 23.0; |
4 | double n = 4; |
5 | double wurzel = pow(bruch, (1.0/n)); |
6 | |
7 | ...
|
denn:
hallo habe es versucht aber es kommt die fehlermeldung too many arguments bei sqrt hier mein code: z = (sqrt( (double)(1023-tein) / 1023 )); y = (sqrt( (double) 325 / 1,414213562 ));
smart schrieb: > too many arguments bei sqrt C ist keine deutsche Programmiersprache. Das Dezimalzeichen ist daher kein Komma, sondern ein Punkt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.