Forum: Mikrocontroller und Digitale Elektronik x^y in c


von anfänger (Gast)


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.

von Rahul (Gast)


Lesenswert?

<math.h>

von Marcus (Gast)


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!

von Michael W. (mictronics) Benutzerseite


Lesenswert?


von Profi (Gast)


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!

von yalu (Gast)


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.

von Rahul (Gast)


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...

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.