2 unterschiedliche int Zahlen in C potenzieren
-
Bezugnehmend auf:
http://www.c-plusplus.net/forum/39478Welche Variante wählt ihr in C?
Die Schleife oder doch eher die pow() Funktion mit einem davorgeschriebenen typecast?
-
Jedenfalls nicht die Schleife in der angegebenen Form. Wenn, dann so etwas wie
int pow2(int basis, int exponent) { if(basis == 1) return 1; if(exponent < 0) return 0; int x = 1; while(exponent != 0) { if(exponent % 2 == 0) { exponent /= 2; basis *= basis; } else { x *= basis; --exponent; } } return x; }
Das kann einem dann durchaus Zeit sparen - in meinen Tests ist es bei einem Exponenten von 31 um den Faktor 3 schneller als std::pow, mit long (64-Bit) und Exponent 63 noch um etwa Faktor 2 (63 bzw. 31 erzeugen in dieser Zerlegung lange Folgen), und bei größeren Exponenten kriegt man mit int eh Probleme. Bei konstanten Eingabedaten allerdings kann es dir passieren, dass der Compiler std::pow falten kann (also etwa pow(2, 10) zur Compilezeit durch 1024 ersetzt), in welchem Fall keine Routine der Welt schneller sein kann.
Ich muss aber auch sagen, dass mir recht selten Fälle untergekommen sind, in denen ich pow mit ints benutzen wollte. Int als Exponent, ja, aber mit int als Basis und Ergebnis läuft einem sowas sehr schnell über. Bedenke, dass bereits 1010 nicht mehr in einen 32-Bit-Integer passt.