x^y in c

Gast #318572
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.
Gast
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!
Gast
#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!
Gast
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.
Gast
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

Eine eigene Frage? Dieser Thread ist über 20 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.