Forum: Mikrocontroller und Digitale Elektronik Potenzen und Wurzeln


von Micha S. (e-tec)


Lesenswert?

Hallo,

Normalerweise sagt man ja das quatdrat von x =
x*x oder pow(x, 2) oder sqr(x)

ich würde gerne auf die bibliotheksfunktionen komplett verzichten.
das quadrat am liebsten so x = x^2; (ich weiß der "^" ist eigentlich der
Xor op) und ebenso die quadratwurzel mit x = x^(1/2)  (werde ich vorher
noch mit 1000 multiplizieren, da ich die berechnung in int durchführen
möchte.)

also wie kann man eine potenz zahl angeben ohne bibliotheksfunktionen zu 
verwenden?

von Michael R. (dj_motionx)


Lesenswert?

Hab ich das richtig verstanden du möchtest in C anstelle von pow(x,2) 
x^2 schreiben ?

von Micha S. (e-tec)


Lesenswert?

so in etwa, nur das ich zwischen x und 2 keine xor will sonder am 
liebsten das quadrat. gibt es ne schreibweise? Ich will die wurzel aus 
einer zahl ziehen, für die xte wurzel potenzierst du die zahl mit dem 
kehrwert der potenz.

von Karl H. (kbuchegg)


Lesenswert?

Micha S. schrieb:
> so in etwa, nur das ich zwischen x und 2 keine xor will sonder am
> liebsten das quadrat. gibt es ne schreibweise?

Was ist an  x * x  falsch?

Wenn dir die Schreibweise nicht gefällt, dann verpack es halt in eine 
Funktion
1
double sqr( double x )
2
{
3
  return x * x;
4
}
5
6
...
7
8
9
   c = sqrt( sqr(a) + sqr(b) );
oder ein Makro
1
#define SQR(x)  ((x) * (x))
2
3
4
...
5
6
   c = sqrt( SQR(a) + SQR(b) );

um die Wurzel wirst du allerdings nicht herumkommen. Die wirst du nur 
los, wenn du sie mathematisch loswerden kannst.

von Micha S. (e-tec)


Lesenswert?

zum quadrieren nichts, aber um die wurzel zu ziehen!

von Michael R. (dj_motionx)


Lesenswert?

Sofern du nur x quadrat brauchst würde ich auch x*x schreiben. Bei 
höheren Potenzen wird das mühsam. Hmm Hätte ich aber noch nicht gehört 
dass man in C Operatoren redefinen kann. Quasi den ^ (XOR Operator) mir 
der pow(,) Funktion belegen.

von Michael R. (dj_motionx)


Lesenswert?

Micha S. schrieb:
> aber um die wurzel zu ziehen!

Wuzelziehen kannst du natürlich auch selbst in einer Funktion mit 
Iterationsverfahren implementieren a la
http://de.wikipedia.org/wiki/Wurzel_(Mathematik)
Numerische Berechnung

von Micha S. (e-tec)


Lesenswert?

@Michael Rathmair
also ich möchte auf die bibliotheksfunktionen komplett verzichten, da 
sie nur unnötig overhead darstellen! und overloading gibt es meines 
wissens nach nur in cpp...

mathematisch ist die quadratwurzel aus x = x ^ (1 / 2) (also x hoch 
0,5).
deswegen bin ich so scharf auf einen potenzoperator :)

alleine die sqrt funktion belegt ca 26%daten und und 19% des 
programmspeichers...

von Micha S. (e-tec)


Lesenswert?

Micha S. schrieb:
> quadratwurzel mit x = x^(1/2)

danke für den hinweis, siehe oben ^^

von Karl H. (kbuchegg)


Lesenswert?

Micha S. schrieb:
> @Michael Rathmair
> also ich möchte auf die bibliotheksfunktionen komplett verzichten, da
> sie nur unnötig overhead darstellen!

Und du denkst, du kannst das besser.

> mathematisch ist die quadratwurzel aus x = x ^ (1 / 2) (also x hoch
> 0,5).
> deswegen bin ich so scharf auf einen potenzoperator :)

Aha.
Und du glaubst ein allgemeiner Potenzoperator lässt sich leichter 
implementieren als eine spezialisierte Wurzelfunktion, die einen 
Sonderfall einer bestimmten Potenz darstellt.

> alleine die sqrt funktion belegt ca 26%daten und und 19% des
> programmspeichers...

Von nix kommt nix.
Wenn du Wurzel brauchst, dann musst du sie auch berechnen. Was du in 
Frage stellen kannst und musst ist etwas anderes: Muss es unbedingt die 
Wurzel sein. Wenn es zb nur um den Vergleich von Werten geht, muss man 
nicht notwendigerweise eine Wurzel ziehen, da die Wurzelfunktion streng 
monoton ist.

von Micha S. (e-tec)


Lesenswert?

danke für die freundliche antwort, mein gott warum bin ich noch in dem 
forum?
nein das ich es besser kann habe ich nie gesagt, aber ich kann die 
berechnung z.b. mal in int durchführen, oder seid wann hat der m16 eine 
floating point einheit?

von Michael R. (dj_motionx)


Lesenswert?

Also du könntest eine Funktion Schreiben die:

1. prüft ob der Exponent rational oder netürlich ist bzw > oder < 0 
(bzw. = 0)
2. bei natürlichem Exponenten in einer Schleife iterativ multiplizieren
3. bei rationalem negativem Exponenten mit intervallschachtelung 
Wurzelziehen

von Karl H. (kbuchegg)


Lesenswert?

Micha S. schrieb:
> danke für die freundliche antwort, mein gott warum bin ich noch in dem
> forum?

Weil du kein C-Buch hast?

> nein das ich es besser kann habe ich nie gesagt, aber ich kann die
> berechnung z.b. mal in int durchführen,

Dann such dir eine Wurzelfunktion die in int rechnet.
Auch solche gibt es im Web zur Genüge und eine einfache Implementierung 
ist gar nicht mal so schwer. Hast du ganz sicher auch oft gemacht. Die 
Umkehrung benutzen: einfach mal eine Zahl nehmen und davon das Quadrat 
ausrechnen. Ist das Quadrat größer als die Zahl, dann muss die Wurzel 
kleiner sein. Im Binärsystem kann man damit die Wurzel aus einer 16 Bit 
Zahl mit 8 Multiplikationen errechnen: Das Ergebnis kann nur 8 Bit haben 
und für jedes Bit muss man feststellen, ob es 0 oder 1 sein muss.

pow rettet dich hier nicht und auch das Verstecken hinter einer anderen 
Schreibweise ändert nichts daran, dass sie gerechnet werden muss.

von Micha S. (e-tec)


Lesenswert?

Nein weil ich gerne mit Leuten über etwaige Lösungen diskutiere. 
Ausserdem hatte ich während meines Studiums mehr als genug 
programmiersprachen, da sammelt man einiges an büchern^^

von Michael R. (dj_motionx)


Lesenswert?

Ähhmm ja ich halt mich da jetzt raus. Wies ich mal versuchen würde siehe 
oben. Funktioniert auch mit int -> einfach mal am PC testen und ab damit 
in den Controller. Was dann im Endeffekt besser ist musst du für dich 
selber entscheiden. (Unabhängig davon ob du ein C-Buch im Regal stehen 
hast oder nicht ;-) ) Wünsch dir viel Erfolg !

von Micha S. (e-tec)


Lesenswert?

Dankeschön den habe ich schon :)
funktioniert super!!!
1
ui16 int_sqrt(ui32 zahl)
2
{
3
   ui16 wurzel = UI16MAX ;
4
   ui16 temp   = wurzel-1;
5
   while ( temp < wurzel ) 
6
   {
7
      wurzel = temp;
8
      temp   = wurzel + zahl/wurzel >> 1;
9
   }
10
   return wurzel;
11
}

hoffe es hilft noch jemandem!

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.