Potenzen und Wurzeln

OP #2368802
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?
OP #2368812
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.
#2368818
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
@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
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.
OP #2368843
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?
#2368845
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
#2368853
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
Ä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
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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.