Ich möchte eine Funktion in reinem Lua erstellen, die einen Bruchteil (23 Bits), einen Exponenten (8 Bits) und ein Zeichen (1 Bit) von einer Zahl, so dass die Zahl ungefähr gleich math.ldexp(fraction, exponent - 127) * (sign == 1 and -1 or 1)
ist, und packt dann die generierten Werte in 32 Bits.
Eine bestimmte Funktion in der Mathematikbibliothek hat meine Aufmerksamkeit erregt:
Die frexp-Funktion zerlegt den Gleitkommawert (v) in eine Mantisse (m) und einen Exponenten (n), so dass der Absolutwert von m größer oder gleich 0,5 und kleiner als 1,0 ist, und v = m * 2 ^ n.
Beachten Sie, dass math.ldexp die umgekehrte Operation ist.
Ich kann mir jedoch keine Möglichkeit vorstellen, nicht ganzzahlige Zahlen richtig zu packen. Da die von dieser Funktion zurückgegebene Mantisse keine Ganzzahl ist, bin ich mir nicht sicher, ob ich sie benutzen kann.
Gibt es eine effiziente Möglichkeit, etwas Ähnliches wie math.frexp()
zu tun, das eine ganze Zahl als Mantisse zurückgibt? Oder gibt es vielleicht eine bessere Möglichkeit, Zahlen in das IEEE754 Gleitkomma-Format mit einfacher Genauigkeit in Lua zu packen?
Vielen Dank im Voraus.
Bearbeiten
Ich präsentiere hiermit die (hoffentlich) endgültige Version der Funktionen, die ich gemacht habe:
%Vor%Ich habe den Weg zur Verwendung des impliziten Bits verbessert und die richtige Unterstützung für spezielle Werte wie NaN und Unendlich hinzugefügt. Ich habe die Formatierung auf die des mit catwell verknüpften Skripts gestützt.
Ich danke Ihnen beiden für Ihren großartigen Rat.
Multiplizieren Sie die von math.frexp()
mit 2 ^ 24 erhaltene manificand und subtrahieren Sie 24 vom Exponenten, um zu kompensieren. Jetzt ist der Signifikand eine ganze Zahl. Beachten Sie, dass der Signifikand 24 Bits ist, nicht 23 (Sie müssen das implizite Bit in der IEEE-754-Codierung berücksichtigen).
Tags und Links floating-point ieee-754 lua pack