2010-12-16 5 views
1

Kann jemand mich im Detail erklären, wie diese log2 Funktion funktioniert:Ich bin in der Notwendigkeit für einen Floating-Point-Experten

inline float fast_log2 (float val) 
{ 
    int * const exp_ptr = reinterpret_cast <int *> (&val); 
    int   x = *exp_ptr; 
    const int  log_2 = ((x >> 23) & 255) - 128; 
    x &= ~(255 << 23); 
    x += 127 << 23; 
    *exp_ptr = x; 

    val = ((-1.0f/3) * val + 2) * val - 2.0f/3; // (1) 

    return (val + log_2); 
} 

Antwort

5

IEEE Schwimmer intern haben einen Exponenten E und eine Mantisse M, jeweils als binäre Ganzzahlen dargestellt. Der tatsächliche Wert ist im Grunde

2^E * M 

Grund logarithmische Mathematik sagt:

log2(2^E * M) 
= log2(2^E) + log2(M) 
= E + log2(M) 

Der erste Teil des Codes trennt E und M. Die Linie kommentiert (1) berechnet log2(M) durch eine Polynomannäherungseinheit verwenden. Die letzte Zeile addiert E und das Ergebnis der Approximation.

+0

-128 anstelle von -127, um E^2 anstelle von E zu erhalten? – Skeen

+0

@Skeen: ugh, natürlich ist es 2^E, nicht E^2 –

+0

Oh>. <, Ich scheitere beim Lesen, bitte töte mich nicht! : O, aber warum ist es dann -128 statt -127? – Skeen

2

Es ist eine Annäherung. Es nimmt zuerst log2 des Exponenten direkt (trivial to do) und verwendet dann eine Näherungsformel für log2 der Mantisse. Es fügt dann diese zwei log2-Komponenten hinzu, um das Endergebnis zu erhalten.

+0

Okay, ich kann verstehen, wie es den Exponenten extrahiert und es in eine Ganzzahl mit dem Namen log_2 platziert, und wie es das Zeichenbit und die Mantisse extrahiert und es in val über den Zeiger speichert. Was ich nicht verstehe ist, warum es funktioniert, diese zusammen zu addieren. – Skeen

+0

Und ich verstehe, dass es, wenn es das Zeichenbit und die Mantisse extrahiert, exp = 127 (0) und daher den Wert val = signbit * festlegt. Aber wie es funktioniert, das mit dem log_2 hinzuzufügen, ist was mich wirklich nervt. – Skeen

+0

Und wirklich extrahiert es nicht den Exponenten, was es ist, den Exponenten -1 zu extrahieren, wie das IEEE 754 ist signbit * 2^(exp-127) * Frac – Skeen

Verwandte Themen