mikrocontroller.net

Forum: Compiler & IDEs Wurzel ziehen


Autor: smart (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kann ich in C aus einem Bruch eine Wurzel ziehen?

z.B.


x/y und daraus die wurzel?


mfg

Autor: NsN (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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, 
...)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: NsN (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Albert ... (albert-k)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Albert ... (albert-k)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: egberto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: smart (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <math.h>
...

  double   x = 1.123, y = 3.456;
  double   z = sqrt( x/y );

  int      i = 12, j = 24;
  double   z2 = sqrt( (double)i/j );

Ggf. das -lm beim Linken nicht vergessen!

Autor: NsN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und für die n-te Wurzel zum Beispiel:
#include <math.h>
...
  double bruch  = 42.0 / 23.0;
  double n      = 4;
  double wurzel = pow(bruch, (1.0/n));

...

denn:

Autor: smart (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ));

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
smart schrieb:
> too many arguments bei sqrt

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C-Buch lesen!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.