# c++ Potenzen?



## Stryke89 (17. Oktober 2005)

hallo ers ma...
also ich hab angefagen mich mit c++ zubeschäftigen und ich wollte Gestern mal was kleines damit Programmieren. Da ist mir aufgefallen, dass ich nicht weiss, wie man in c++ Potenzen schreibt. Ich hatte eigentlich Gedacht, das geht z.B. so:
4^2
Aber gefunzt hat das nicht. Also wär nett, wenn mir jemand sagen kann, wie das geht ( kann ja eigentlich net so schwer sein^^ )...


----------



## Zeitkind (17. Oktober 2005)

Der cmath Header stellt eine Funktion zur Verfügung mit der man Potenzen bilden kann. Diese heißt pow(Basis, Potenz);

Hier mal ein kleines Beispiel:


> #include <iostream>
> #include <cmath>
> using namespace std;
> 
> ...



Die Ausgabe ist 1024 (also 2^10).


----------



## Stryke89 (17. Oktober 2005)

ok...danke für den Tipp
Ich hätte da allerdings noch ne kleine Frage:
Was ist der Unterschied zwischen "void main()" und "int main()"


----------



## MikeA (17. Oktober 2005)

int main ist eigentlich korrekt(er), da die Hauptfunktion dem OS bei Abfertigung ein Wert zurückgibt, anhand dessen es entscheiden kann, ob alles i.O. ist. Für "alles OK" ist das der Wert 0.
Bei "kleinen Programmen" wie man sie zum Ausprobieren oder in der Schule macht, spielt das jedoch kaum eine grosse Rolle.


----------



## ExeCuter (17. Oktober 2005)

Welchen Compiler benutzt den ihr?
Ich benutz den C++ Builder von Borland. Hab 'ne Lizens von meiner Schule(BBS Betzdorf-Kirchen Berufszweig Höhere Berufsfachschule für Informatik).
Wollt einfach nur 'ma wissen, was allg. benutzt wird!


----------



## struy (17. Oktober 2005)

ExeCuter am 17.10.2005 19:07 schrieb:
			
		

> Welchen Compiler benutzt den ihr?
> Ich benutz den C++ Builder von Borland. Hab 'ne Lizens von meiner Schule(BBS Betzdorf-Kirchen Berufszweig Höhere Berufsfachschule für Informatik).
> Wollt einfach nur 'ma wissen, was allg. benutzt wird!


Bei uns wurde der g++-Compiler benutzt (sowohl auf Linux wie auch auf Windows)


----------



## Stryke89 (18. Oktober 2005)

struy am 17.10.2005 20:18 schrieb:
			
		

> ExeCuter am 17.10.2005 19:07 schrieb:
> 
> 
> 
> ...



Also ich benutze Microsoft Visual Basic 6...
Aber nicht aus Schulichen Gründen oder so. Ich mach programmier einfach so in der Freizeit.
Was sind denn so die großen Unterschiede zwischen den Compilern?


----------



## ApF3LsAfT (18. Oktober 2005)

Zeitkind am 17.10.2005 13:50 schrieb:
			
		

> Der cmath Header stellt eine Funktion zur Verfügung mit der man Potenzen bilden kann. Diese heißt pow(Basis, Potenz);
> 
> Hier mal ein kleines Beispiel:
> 
> ...



Ich hätte einen counter gesetzt, der den Wert von y  (von x hoch y) hat. dann noch ne schleife, die solange x mal x rechnet und den counter jeweils einen runtersetzt, bis der counter auf 0 ist.

hab das jetzt gaaanz spontan hier reingeschrieben. also keine gewähr


----------



## skicu (18. Oktober 2005)

ApF3LsAfT am 18.10.2005 12:07 schrieb:
			
		

> Ich hätte einen counter gesetzt, der den Wert von y  (von x hoch y) hat. dann noch ne schleife, die solange x mal x rechnet und den counter jeweils einen runtersetzt, bis der counter auf 0 ist.
> 
> hab das jetzt gaaanz spontan hier reingeschrieben. also keine gewähr


Dauert ja nur ungefähr hundert mal länger als pow() *g*


----------



## ApF3LsAfT (18. Oktober 2005)

skicu am 18.10.2005 12:15 schrieb:
			
		

> ApF3LsAfT am 18.10.2005 12:07 schrieb:
> 
> 
> 
> ...


Ja, aber da er ja geschrieben hat, dass er ein Anfänger ist, sollte er erstmal Schleifen und Funktionen lernen


----------



## Marscel (18. Oktober 2005)

Stryke89 am 17.10.2005 16:23 schrieb:
			
		

> ok...danke für den Tipp
> Ich hätte da allerdings noch ne kleine Frage:
> Was ist der Unterschied zwischen "void main()" und "int main()"



Der GCC/G++ macht void main() - im Gegensatz zum MSVC++ - nicht mit, sondern nur int main().

Ansonsten, _void_ Funktionen geben keinen Wert zurück, _int_ dagegen eine ganze Zahl.


----------



## MikeA (19. Oktober 2005)

skicu am 18.10.2005 12:15 schrieb:
			
		

> ApF3LsAfT am 18.10.2005 12:07 schrieb:
> 
> 
> 
> ...



Kaum.
Mit irgendeiner Schlaufe muss auch pow() rechnen. Dazu kommt noch der Funktionsaufruf, resp. Stackframe-Auf- und Abbbau, was auch seine Zeit kostet.
Leicht optimiert (Stichwort: Fast Exponentiation) ist die Schleifenversion sogar ziemlich sicher schneller.
pow(,) sieht vielleicht kürzer aus (ist imo auch schönerer Stil, die Rechnung woanders abzuarbeiten), aber "hundert mal länger" geht's garantiert nicht. 





			
				Marcsel schrieb:
			
		

> Ansonsten, void Funktionen geben keinen Wert zurück, int dagegen eine ganze Zahl.



Afair lässt sich jeder Typ auf void casten. Man kann also void Funktionen auch ints zurückgeben lassen. Ist wiederum nicht besonders schön (und wie gesagt, lässt es nicht jeder compiler zu), aber unmöglich wär's nicht.


----------



## skicu (19. Oktober 2005)

MikeA am 19.10.2005 12:04 schrieb:
			
		

> skicu am 18.10.2005 12:15 schrieb:
> 
> 
> 
> ...


Kommt drauf an, wie pow() implementiert wurde.
Und ich bezweifle, dass pow() einfach nur der Aufruf einer normalen Schleife, geschrieben in C++ ist.
Finde leider auf die Schnelle nichts genaues dazu...

edit: Bei Microsoft findet sich was - die haben die Funktion offenbar mit SSE2 Unterstützung implementiert.
Und wenn dann deine Schleife immer noch schneller wäre - Respekt. *g*

nochmal edit:
http://groups.google.de/group/comp.lang.c++/browse_thread/thread/3fab8f7b6825261a/296ae1cfe4a1e688
Hängt also in jedem Fall von Plattform, Compiler und übergebenem Wert (int, float, double, long double) ab.


----------



## MikeA (19. Oktober 2005)

skicu am 19.10.2005 12:21 schrieb:
			
		

> MikeA am 19.10.2005 12:04 schrieb:
> 
> 
> 
> ...



Mit SSE2 werden einfach (bestimmte) Instruktionen schneller abgearbeitet. Ich behaupte aber weiterhin, dass irgendwo geloopt werden muss. Kann sein, dass mit Hilfe dieser Low-Level-Optimierungen der Aufrufsoverhead wieder wettgemacht wird, aber einen Bonus in der Grössenordnung von 100 kann ich mir dennoch nicht vorstellen. (Es sei denn, ich habe gerade eine Blockade und ein schneller Potenzieralgorithmus ohne Loop wäre trivial und ich sehe ihn einfach nicht, lasse mich gerne belehren.  ).


----------



## skicu (19. Oktober 2005)

MikeA am 19.10.2005 12:41 schrieb:
			
		

> Mit SSE2 werden einfach (bestimmte) Instruktionen schneller abgearbeitet. Ich behaupte aber weiterhin, dass irgendwo geloopt werden muss. Kann sein, dass mit Hilfe dieser Low-Level-Optimierungen der Aufrufsoverhead wieder wettgemacht wird, aber einen Bonus in der Grössenordnung von 100 kann ich mir dennoch nicht vorstellen. (Es sei denn, ich habe gerade eine Blockade und ein schneller Potenzieralgorithmus ohne Loop wäre trivial und ich sehe ihn einfach nicht, lasse mich gerne belehren.  ).


Ja, das hundert war sicher übertrieben, aber wie oben schon geschrieben: Kommt auf Plattform und Compiler an.

Aber spätestens beim zweiten Mal Potenzieren innerhalb einer Prozedur sollte der kleine Aufrufoverhead durch die doppelte Menge der Instruktionen, die in den beiden eigenen Schleifen nötig wären, wieder mehr als kompensiert sein, oder nicht? 

Außerdem heißts doch immer so schön: Redundanter Code muss ausgelagert werden. Wozu sollte man denn den Vorgang des Potenzierens jedes Mal per Hand schreiben?


----------



## MikeA (19. Oktober 2005)

skicu schrieb:
			
		

> Ja, das hundert war sicher übertrieben, aber wie oben schon geschrieben: Kommt auf Plattform und Compiler an.
> 
> Aber spätestens beim zweiten Mal Potenzieren innerhalb einer Prozedur sollte der kleine Aufrufoverhead durch die doppelte Menge der Instruktionen, die in den beiden eigenen Schleifen nötig wären, wieder mehr als kompensiert sein, oder nicht?



OK.




			
				skicu am 19.10.2005 12:48 schrieb:
			
		

> Außerdem heißts doch immer so schön: Redundanter Code muss ausgelagert werden. Wozu sollte man denn den Vorgang des Potenzierens jedes Mal per Hand schreiben?



Jepp, da bin ich deiner Meinung! Die Millisekunden, die man mit optimiertem Code spart, liegen in keiner Grössenordnung zur Zeit die man verliert, wenn man nach einem halben Jahr unschönen Code nicht mehr versteht/nicht mehr findet.


----------



## Stryke89 (19. Oktober 2005)

*dem-expertengespräch-zuhör-und-nix-verteh*


----------



## Marscel (22. Oktober 2005)

MikeA am 19.10.2005 12:04 schrieb:
			
		

> Afair lässt sich jeder Typ auf void casten. Man kann also void Funktionen auch ints zurückgeben lassen. Ist wiederum nicht besonders schön (und wie gesagt, lässt es nicht jeder compiler zu), aber unmöglich wär's nicht.



Wenn es geht, was ich gerade stark bezweifel, ist so ein Durcheinander Murks.



			
				Stryke89 am 19.10.05 17:30 schrieb:
			
		

> *dem-expertengespräch-zuhör-und-nix-verteh*



Dafür brauchst du kein Experte sein, wenn du Basen à la Schleifen kennen gelernt hast.

Ob nun _pow(b, e)_ oder eine selbstgeschriebene Schleife, berechnet wird beides, die Unterschiede dürfte man nur im Assemblat erkennen, wenn es denn welche sind.


----------

