2014-05-13 11 views
11

In Python muss ich eine Reihe von Floats in hexadezimale konvertieren. Es muss Nullen aufgefüllt werden (zum Beispiel 0x00000010 anstelle von 0x10). Genau wie http://gregstoll.dyndns.org/~gregstoll/floattohex/ tut. (Leider kann ich keine externen Bibliotheken auf meiner Plattform verwenden, daher kann ich die auf dieser Website enthaltene nicht verwenden.)Wie man einen float in hex konvertieren

Was ist der effizienteste Weg, dies zu tun?

+1

Ist das Hausaufgaben? –

+0

[Wie stelle ich eine gute Frage?] (Http://stackoverflow.com/help/how-to-ask) – J0HN

+0

Verwenden Sie 'struct' und dann Bytes extrahieren. – Anycorn

Antwort

26

Dies ist ein wenig schwierig in Python, weil nicht auf der Wert Fließkommazahl in eine (hex) Ganzzahl konvertieren möchten. Stattdessen versuchen Sie die IEEE 754 binäre Darstellung des Fließkommawertes als hex zu interpretieren.

Wir verwenden die Funktionen pack und unpack aus der integrierten Bibliothek struct.

Ein float ist 32-Bit. Wir werden zuerst pack es in eine binäre Zeichenfolge, und dann unpack es als int.

def float_to_hex(f): 
    return hex(struct.unpack('<I', struct.pack('<f', f))[0]) 

float_to_hex(17.5) # Output: '0x418c0000' 

Wir können für double das gleiche tun, wohl wissend, dass es 64 Bits:

def double_to_hex(f): 
    return hex(struct.unpack('<Q', struct.pack('<d', f))[0]) 

double_to_hex(17.5) # Output: '0x4031800000000000L' 

1 - eine Reihe von Roh-Bytes Bedeutung; nicht eine Folge von Einsen und Nullen.

+0

Vielen Dank. Ich wusste nicht, dass ich es zuerst in Binär konvertieren musste. – user2339945

11

In Python float ist immer doppelt genau.

Wenn Sie Ihre Antwort erfordern Ausgabe in Form einer hexadezimalen Ganzzahl zu sein, wurde die Frage bereits beantwortet:

import struct 

# define double_to_hex as in the other answer 

double_to_hex(17.5) # Output: '0x4031800000000000' 
double_to_hex(-17.5) # Output: '0xc031800000000000' 

Allerdings könnten Sie stattdessen sollten Sie die eingebaute Funktion mit:

(17.5).hex() # Output: '0x1.1800000000000p+4' 
(-17.5).hex() # Output: '-0x1.1800000000000p+4' 

# 0x1.18p+4 == (1 + 1./0x10 + 8./0x100) * 2**4 == 1.09375 * 16 == 17.5 

Dies ist die gleiche Antwort wie zuvor, nur in einem strukturierteren und für Menschen lesbaren Format.

Die unteren 52 Bits sind die Mantisse. Die oberen 12 Bits bestehen aus einem Vorzeichenbit und einem 11-Bit-Exponenten; die Exponentenabweichung ist 1023 == 0x3FF, also bedeutet 0x403 '4'. Siehe Wikipedia article on IEEE floating point.

+1

Ich wusste nicht, 'float.hex()' existierte - danke! –