Gibt es keine integrierte Möglichkeit zur Berechnung der power bei der Kompilierung in C++?
Habe ich folgende sehr einfache Vorlage. Als ich erfuhr, dass ^
ist nicht die exponentielle operator. Jetzt bin ich auf der Suche nach einem Weg, um zu berechnen, diese macht. Es gibt viele Beispiele, die mit einem rekursiven template auf das internet. Dies ist nicht allzu schwierig.
Aber ich Frage mich: gibt es eigentlich keine "built-in" - Methode in C++ zu berechnen, diese auf die compile-Zeit?
template <int DIM>
class BinIdx : Idx
{
static const int SIZE = 3 ^ DIM; //whoops, this is NOT an exponential operator!
}
- Wenn es sich nur um eine Potenz von zwei sein, verwenden Sie
1 << DIM
. Ansonsten, Nein. - für Zweierpotenzen...
1 << DIM
:p - Es ist nicht notwendigerweise eine Potenz von 2 ist 😉
- Nein. Es gibt auch keine eingebaute compile-time
sqrt
oder built-in-compile-timeexp
oder built-in-compile-timelog
... glaubst du wirklich, es muss sein? - Sie könnten wahrscheinlich machen einige mit
constexpr
Funktionen... - Sie können immer darauf zurückgreifen, Vorverarbeitung und source-code-Generierung mit einigen script-Sprache. Es ist manchmal zwar für die Optionen Klassen und dergleichen. Ansonsten, die Antwort ist so kurz wie
<<
, die für die C++ - Programmierung, die Sie besser in der Lage sein, zu schauen dich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie mithilfe von template-metaprogramming. Ich zeige den code.
Verwendung:
(live-Beispiel)
Wie bereits erwähnt können Sie
<<
wenn der exponent eine Potenz von zwei.Andernfalls, wenn die Exponenten sind nicht negative ganze zahlen, schreiben Sie bitte eine constexpr Funktion wie diese.
Wird dies natürlich brechen für große Exponenten als auch die negativen, aber.
Ich bin nicht bewusst, wie gut die Compiler optimieren Sie Funktion Anrufe in Konstanten Ausdrücken. Hier ist eine manuelle Optimierung für die Fälle, in denen die Exponenten eine Potenz von zwei. Dies wird auch eine Verringerung der Menge der Rekursion getan.
Effizienter algorithmen sind ebenfalls verfügbar. Allerdings bin ich schlecht in informatik, also ich weiß nicht, wie um Sie zu implementieren.
std::pow
>o<<cmath>
Prototypen gekennzeichnetconstexpr
im GCCstd
namespace ermöglichen Ihnen sinnvolle Namen, um Ihre eigenen Funktionen ohne die Gefahr, in Konflikt mit der Bibliothek Namen.pow()
ist geerbt von C. In vielen Fällen, können wir sehen Menschen, einschließlich<math.h>
statt<cmath>
, die bewirken, dass Dinge kaputt zu sein.pow
. viel besser, wählen Sie eine nicht in Konflikt stehenden Namen.Als Ergänzung zu elyse Antwort, hier ist eine version mit Rekursionstiefe von
log(n)
:Nein, es gibt keine allgemein gebaut in der Weise zu berechnen, die macht der Werte. Es ist die
pow
- Funktion aus der standard-Bibliothek und können Sie die<<
shift-operator für den speziellen Fall2^x
.Dieser arbeiten würde in deinem Fall (*):
* = Aktualisieren Sie Ihre Frage aus
2^x
zu3^x
nachdem ich schrieb meine Antwort.Für einen weiteren Sonderfall x^y, wo x und y sind statisch, Sie können schreiben Sie einfach eine lange Multiplikation:
Benannte operator-Bibliothek:
Es unterstützt nur
operator*
, aber die Verlängerung sollte klar sein. Kommissionierung Namen fürtimes
- äquivalente ist ein bisschen ein Problem.@Anton-Lösung, ergänzt durch eine benannte Betreiber:
und jetzt das funktioniert:
live-Beispiel.