Es sieht aus wie Martin Ankerl einige Artikel zu diesem Thema hat, Optimized Approximative pow() in C/C++ ist ein und es verfügt über zwei schnelle Versionen, ist wie folgt:
inline double fastPow(double a, double b) {
union {
double d;
int x[2];
} u = { a };
u.x[1] = (int)(b * (u.x[1] - 1072632447) + 1072632447);
u.x[0] = 0;
return u.d;
}
, die auf Typ punning durch eine Vereinigung setzt die ist nicht definiertes Verhalten in C++, von dem Normentwurf Abschnitt 9.5
[class.union]:
in einer Union, höchstens einer der nicht-statischen Datenelemente sein, kann ctive jederzeit, dh der Wert von meisten der nicht-statischen Daten Mitglieder können jederzeit in einer Union gespeichert werden. [...]
aber die meisten Compiler einschließlich gcc support this with well defined behavior:
Die Praxis von einem anderen Gewerkschaftsmitglied des Lesens als die zuletzt geschrieben (so genannten „Typ-punning“) ist weit verbreitet. Auch bei -fstrict-Aliasing, Typ-punning zulässig, sofern der Speicher durch die Vereinigung Typ zugegriffen wird
aber das ist nicht universell wie this article points out und wie ich point out in my answer herememcpy
verwenden, sollten identischen Code erzeugen und nicht undefiniert nicht aufrufen Verhalten.
Er verbindet sich auch mit einem zweiten Optimized pow() approximation for Java, C/C++, and C#.
Der erste Artikel auch Links zu seinem Microbenchmarks here
Ein bisschen hängt davon ab, welche Kräfte Sie berechnen - bitte zeigen Sie Code und/oder beschreiben Sie Ihre Daten. – paddy
Hardware ist schneller als Software im allgemeinen Fall, das ist irgendwie der Punkt von "pow" ... Sie können es nicht schlagen, es sei denn Sie können zusätzliche Beschränkungen für das, was Sie tun, setzen. – Mehrdad
Dieser Artikel könnte nützlich sein: http://martin.ankerl.com/2012/01/25/optimized-approximative-pow-in-c-and-cpp/ –