selbst gemacht pow () c ++

7

Ich las durch Wie kann ich ein schreiben power function myself? und die antwort von dan04 hat meine aufmerksamkeit erregt, hauptsächlich weil ich mir über die antwort von fortran nicht im klaren bin, aber ich habe das verstanden und dies umgesetzt:

%Vor%

obwohl ich nicht sicher bin, ob ich dieses Recht übersetzt habe, weil alle Aufrufe von .5 als Exponent 0 ergeben. In der Antwort heißt es, dass es ein log2 (x) basierend auf a^b = 2^(b * log2(a)) benötigt, aber ich bin Ich bin mir nicht sicher, ob ich das einbringen soll, da ich nicht sicher bin, wo ich es hinstellen soll, oder ob ich überhaupt an dieses Recht denke.

HINWEIS: Ich weiß, dass dies in einer Math-Bibliothek definiert werden kann, aber ich brauche nicht die zusätzlichen Kosten einer ganzen Math-Bibliothek für einige Funktionen.

EDIT: Kennt jemand eine Fließkomma-Implementierung für gebrochene Exponenten? (Ich habe eine Doppelimplementierung gesehen, aber das war ein Trick mit Registern, und ich brauche Fließkommazahl und eine Bibliothek hinzuzufügen, nur um einen Trick zu machen, wäre es besser, wenn ich nur die Mathematikbibliothek mitnehme)

    
gardian06 11.03.2012, 04:48
quelle

5 Antworten

14

Im Folgenden finden Sie Links zu echten Implementierungen von powf.

Ich erwarte, dass einfachere Lösungen keine Genauigkeit im Ergebnis haben oder InF- und NaN-Parameter nicht behandeln.

Ссылка

Ссылка

    
Brian Swift 27.03.2012, 09:41
quelle
6

Ich habe dieses Papier hier angeschaut, in dem beschrieben wird, wie die Exponentialfunktion für die doppelte Genauigkeit approximiert wird. Nach ein wenig Recherche auf Wikipedia über Gleitkommadarstellung mit einfacher Genauigkeit habe ich die entsprechenden Algorithmen ausgearbeitet. Sie haben nur die exp-Funktion implementiert, also habe ich eine inverse Funktion für das Protokoll gefunden und dann einfach

%Vor%

Das Kompilieren von gcc4.6.2 ergibt eine pow-Funktion fast viermal schneller als die Implementierung der Standardbibliothek (kompiliert mit O2).

Hinweis: Der Code für EXP wird fast wörtlich aus dem Papier kopiert, das ich gelesen habe, und die LOG-Funktion wird von hier .

Hier ist der relevante Code:

%Vor%

Es gibt noch einige Optimierungen, die Sie hier machen können, oder vielleicht ist das gut genug. Dies ist eine grobe Annäherung, aber wenn Sie mit den Fehlern, die mit der doppelten Darstellung eingeführt wurden, zufrieden gewesen wären, würde ich mir vorstellen, dass dies zufriedenstellend sein wird.

    
SirGuy 22.03.2012 15:00
quelle
3

Ich denke, dass Sie versuchen könnten, es zu lösen, indem Sie die Taylor-Serie verwenden, Überprüfen Sie dies. Ссылка

Mit der Taylor-Reihe können Sie alle schwer zu lösenden Berechnungen wie 3 ^ 3.8 mit den bereits bekannten Ergebnissen wie 3 ^ 4 lösen. In diesem Fall hast du 3 ^ 4 = 81 so

3 ^ 3.8 = 81 + 3.8 * 3 (3.8 - 4) + .. + .. und so weiter hängt davon ab, wie groß Ihr n ist, Sie werden die nähere Lösung Ihres Problems bekommen.

    
AlexTheo 22.03.2012 15:06
quelle
2

Ich denke, der Algorithmus, nach dem Sie suchen, könnte nth root sein. Mit einer anfänglichen Schätzung von 1 (für k == 0):

%Vor%

test:

%Vor%     
CapelliC 13.03.2012 09:48
quelle
1

Ich und mein Freund hatten ein ähnliches Problem, während wir in einem OpenGL-Projekt waren, und math.h reichte in einigen Fällen nicht aus. Unser Lehrer hatte auch das gleiche Problem und er sagte uns, wir sollten die Kraft auf ganzzahlige und schwebende Teile trennen. Wenn Sie beispielsweise x ^ 11.5 berechnen, können Sie sqrt (x ^ 115, 10) berechnen, was zu einem genaueren Ergebnis führen kann.

    
Cihad Turhan 24.03.2012 20:33
quelle

Tags und Links