Forum: Compiler & IDEs Wurzel ziehen


von smart (Gast)


Lesenswert?

wie kann ich in C aus einem Bruch eine Wurzel ziehen?

z.B.


x/y und daraus die wurzel?


mfg

von NsN (Gast)


Lesenswert?

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, 
...)

von Klaus W. (mfgkw)


Lesenswert?

> 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.

von NsN (Gast)


Lesenswert?

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.)

von Albert .. (albert-k)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Albert .. (albert-k)


Lesenswert?

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

von egberto (Gast)


Lesenswert?

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.

von smart (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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!

von NsN (Gast)


Lesenswert?

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:

von smart (Gast)


Lesenswert?

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 ));

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

smart schrieb:
> too many arguments bei sqrt

C ist keine deutsche Programmiersprache.  Das Dezimalzeichen ist
daher kein Komma, sondern ein Punkt.

von Klaus W. (mfgkw)


Lesenswert?

C-Buch lesen!

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
Noch kein Account? Hier anmelden.