Da dies CS und nicht Stackoverflow ist, gehe ich davon aus, dass Sie eine Frage zur numerischen Analyse und (um die Dinge einfach zu halten) insbesondere zum Gleitkomma nach IEEE-754 stellen. In diesem Fall hängt die Antwort auf Ihre Frage teilweise davon ab, was Sie mit "einfacher" meinen, und teilweise von den Details des Systems.
Keine modernen CPUs, die mir bekannt sind, verfügen über einen eingebauten Befehl, der genau das tut, was Sie entweder für die -Operation (die wir im Folgenden als ihren üblichen Namen in C bezeichnen) oder für 2 x ( ) erwarten . Sie werden beide mit Bibliotheksfunktionen implementiert.exexp
2xexp2
Wie bei allen numerischen Methoden für transzendentale Operationen sind einige Sonderfälle zu berücksichtigen:
exp(NaN) = NaN
exp(+Inf) = +Inf
exp(-Inf) = 0
Es gibt jedoch eine andere Sache, die das Problem etwas weniger kompliziert macht: Die nützliche Domäne ist ziemlich klein. Unterläuft für binary32, exp(x)
wenn oder so, und überläuft, wenn x > 88,7 oder so. Ungewöhnlich für transzendentale Operationen können wir auch den subnormalen Fall ignorieren, da nicht zu unterscheiden ist, ob subnormal ist. All dies gilt auch für die Domain, mit der Ausnahme, dass sich die Domain geringfügig unterscheidet.x<−104x>88.7exp(x)
1.0
x
exp2
Ihre Intuition ist richtig, da die meisten Implementierungen berechnen . Die Kosten für diese Multiplikation mit 1ex=2x/ln2 ist im Vergleich zum Rest des Rechnens trivial. Eine typische Methode verwendet eine vorberechnete Tabelle mitKElementen:1ln2exp2
K
exp2(x)=2n×T[j]×P(y)
wobei der ganzzahlige Teil von x ist , enthält die Tabelle T Werte von 2 j / K für alle j im Bereich [ 0 , K ) , und P ist eine polynomielle Annäherung an 2 x (für binär32 ist ein Viertel ausreichend) im Bereich [ 0 , 1nxT2j/Kj[0,K)P2x. Der2n-Teil ist billig, da er nur den Exponenten manipuliert. Tist eine Nachschlagetabelle. SoPist wahrscheinlich der teure Teil der Operation zu sein.[0,1K)2nTP
Ich möchte der Vollständigkeit halber darauf hinweisen, dass Intel x86-FPUs eine Anweisung enthalten f2xm1
, die für x im Bereich [ - 1 , 1 ] berechnet . Auf einer modernen CPU ist dies jedoch ein ziemlich teurer und nicht in Pipelines zusammengefasster Befehl, und Sie werden dringend davon abgeraten, ihn zu verwenden. Wie das Intel Optimization Reference Manual in Abschnitt 3.8.5 zu Recht feststellt:2x−1x[−1,1]
Obwohl x87 transzendentale Anweisungen unterstützt, kann die Implementierung der transzendentalen Funktion in der Softwarebibliothek in vielen Fällen schneller sein.
Bearbeiten: Es wurde in den Kommentaren darauf hingewiesen, dass ich einige der neuen Terminologie in IEEE 754-2008 erklären sollte. Ein Teil der Sprache hat sich seit 1985 und 1987 geändert, und die meisten Leute kennen den alten Jargon weitaus besser.
Die Ausdrücke "binary32" und "binary64" sind die neuen Bezeichnungen für 32-Bit- und 64-Bit-Gleitkommazahlen, die der alte Standard "single" bzw. "double" nannte.
Der Ausdruck "subnormale Zahl" ersetzt den vorherigen Ausdruck "denormalisierte Zahl" oder "denormalisierte Zahl" .