2014-05-13 19 views
11

In Python ho bisogno di convertire un gruppo di float in esadecimali. Deve essere riempito a zero (ad esempio, 0x00000010 invece di 0x10). Proprio come fa http://gregstoll.dyndns.org/~gregstoll/floattohex/. (purtroppo non posso usare libs esterne sulla mia piattaforma, quindi non posso usare quello fornito su quel sito)Come convertire un float in esadecimale

Qual è il modo più efficiente per farlo?

+1

È questo compito? –

+0

[Come faccio a fare una buona domanda?] (Http://stackoverflow.com/help/how-to-ask) – J0HN

+0

usa 'struct' e quindi estrai i byte. – Anycorn

risposta

26

Questo è un po 'complicato in Python, perché non si sta cercando di convertire il valore in virgola mobile in un numero intero (esadecimale). Invece, stai cercando di interpretare la rappresentazione binaria IEEE 754 del valore a virgola mobile come esadecimale.

Utilizzeremo le funzioni pack e unpack dalla libreria integrata struct.

A float è a 32 bit. Per prima cosa inseriamo lo pack in una stringa binario , quindi unpack come int.

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

float_to_hex(17.5) # Output: '0x418c0000' 

Possiamo fare lo stesso per double, sapendo che è di 64 bit:

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

double_to_hex(17.5) # Output: '0x4031800000000000L' 

1 - Nozione una stringa di byte prime; non una stringa di uno e zero.

+0

Grazie mille. Non ho capito che avevo bisogno di convertirlo prima in binario. – user2339945

11

In Python float è sempre a doppia precisione.

Se si richiede la risposta da emettere sotto forma di un intero esadecimale, la questione è stata già risposto:

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' 

Tuttavia si potrebbe invece considerare l'uso della funzione built-in:

(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 

Questa è la stessa risposta di prima, solo in un formato più strutturato e leggibile.

I 52 bit inferiori sono la mantissa. I 12 bit superiori sono costituiti da un bit di segno e da un esponente di 11 bit; la distorsione esponenziale è 1023 == 0x3FF, quindi 0x403 significa '4'. Vedi Wikipedia article on IEEE floating point.

+1

Non mi ero reso conto che 'float.hex()' esisteva - grazie! –