mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik x^y in c


Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi ich habe eine Frage zu C, eine absolute Anfängerfrage..

ich will in C x^y ausrechnen.

meine idee
int x;
int y;
int erg;
erg = pow(x,y);

und schon sollte nach alles was ich gefunden habe in erg das Ergebinss
sein. als Testwerte habe ich x=2 und y=3 genommen so dass erg auch ein
Int sein sollte.
Ist pow die richtige Funktion? Irgendwie steh ich voll auf der Leitung,
so dass mir ohne hilfe wohl kein Licht aufgeht...

Irgendwelche Anregungen eurerseits wären mir eine Hilfe.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<math.h>

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ja und jetzt? Kommt ne Fehlermeldung oder ...?

Marcus

P.S

auch ne Möglichkeit:
<code>
int i;
int erg=1;
for (i=1;i<=y;i++){
erg*=x;
}
<\code>

Keine Wurzel möglich!

Autor: Michael Wolf (mictronics) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum liest Du nicht mal in einem Tutorial nach?

http://crasseux.com/books/ctutorial/Mathematical-f...

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <math.h>
Damit linkt er dir die Float-Libs mit ein, kann ziemlich viel
Speicher kosten.

Damit es klarer wird, verwende casting:
erg=(integer)(pow(float)x,(float)y));

Dürfte der Compiler zwar automatisch machen, aber dann wir gleich beim
Lesen des Codes offensichtlich, was er macht.

Wenn Du nur int als Eingangsvariablen hast und Du den Wertebereich
eingrenzen kannst z.B. auf 16 oder 32 bit integer, kannst Du auch eine
For-Schleife mit Multiplikationen machen:
erg=1;
for(i=1;i<y;i++){erg*=x;}

ungeprüfter Code - nur als Denkanstoß zu verstehen!

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie Profi schon erwähnte, ist es etwas übertrieben, wegen einer
Integer-Potenz große Teile der Floatingpoint-Bibliothek mit zu
schleppen.

Für Exponenten bis 3 schreibe ich das Produkt meist aus:

y = x * x;
y = x  x  x;

Zweierpotenzen (2^y) kann man auch durch Shift-Operationen darstellen:

1 << y;

Für größere oder zur Compile-Zeit nicht bekannte Exponenten bietet sich
die Schleifenlösung von Marcus bzw. Profi an. Insbesondere bei größeren
Exponenten reduziert folgende Funktion die Anzahl der benötigten
Multiplikationen (maximal 2*ld(y+1)-1 statt y):

|  int ipow(int b, int e) {
|    int p = 1;
|
|    for(;;) {
|      if(e & 1)
|        p *= b;
|      e >>= 1;
|      if(e == 0)
|        break;
|      b *= b;
|    }
|    return p;
|  }
|
|  /* ... */
|    erg = ipow(x, y);


So werden bspw. für 2^28 nur 7 statt 28 Multiplikationen benötigt, was
bei Prozessoren ohne Hardware-Multiplizierer schon einiges an
Geschwindigkeit bringt.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu meiner "Verteidigung" wegen "<math.h>":
SO wie ich den Ursprungstread verstanden habe, hat "anfänger" nach
der Potenzfunktion gefragt. Ich war der Meinung, dass man die in der
math.h findet.
Hätte ich Bedarf daran, würde ich sie mir auch selber programmieren...

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.