Potenzen und Wurzeln

OP #2368802
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?
#2368818
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.
OP #2368828
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...
#2368837
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.
#2368853
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.
#2368869
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 !
OP #2368940
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren