• Aktualisierte Forenregeln

    Eine kleine Änderung hat es im Bereich Forenregeln unter Abschnitt 2 gegeben, wo wir nun explizit darauf verweisen, dass Forenkommentare in unserer Heftrubrik Leserbriefe landen können.

    Forenregeln


    Vielen Dank

c++ Potenzen?

Stryke89

Spiele-Novize/Novizin
Registriert
22.03.2005
Beiträge
152
Reaktionspunkte
0
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^^ )...
 
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;

void main()
{
int nValue = pow(2,10);
cout << nValue << endl;
}

Die Ausgabe ist 1024 (also 2^10).
 
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()"
 
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.
 
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!
 
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)
 
struy am 17.10.2005 20:18 schrieb:
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)

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?
 
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:
#include <iostream>
#include <cmath>
using namespace std;

void main()
{
int nValue = pow(2,10);
cout << nValue << endl;
}

Die Ausgabe ist 1024 (also 2^10).

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 :-P
 
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 :-P
Dauert ja nur ungefähr hundert mal länger als pow() *g*
 
skicu am 18.10.2005 12:15 schrieb:
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 :-P
Dauert ja nur ungefähr hundert mal länger als pow() *g*
Ja, aber da er ja geschrieben hat, dass er ein Anfänger ist, sollte er erstmal Schleifen und Funktionen lernen ;-)
 
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.
 
skicu am 18.10.2005 12:15 schrieb:
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 :-P
Dauert ja nur ungefähr hundert mal länger als pow() *g*

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. ;)
 
MikeA am 19.10.2005 12:04 schrieb:
skicu am 18.10.2005 12:15 schrieb:
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 :-P
Dauert ja nur ungefähr hundert mal länger als pow() *g*

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. ;)
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.
 
skicu am 19.10.2005 12:21 schrieb:
MikeA am 19.10.2005 12:04 schrieb:
skicu am 18.10.2005 12:15 schrieb:
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 :-P
Dauert ja nur ungefähr hundert mal länger als pow() *g*

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. ;)
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*

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. ;) ).
 
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? :)
 
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. :-)
 
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.
 
Zurück