2010-02-09 14 views
19

Qual è il modo migliore per emulare il virgola mobile a precisione singola in python? (O altri formati in virgola mobile per quella materia?) Basta usare i ctype?Modo corretto per emulare il virgola mobile a precisione singola in python?

+2

Cosa intendi per "emulare"? Leggi i float dai blob binari? Esegui la matematica con precisione singola e ottieni gli stessi risultati di un'altra lingua? (Se quest'ultimo, si noti che la matematica "float" in C su x86 viene effettivamente valutata in 80-bit e ridotta a 32-bit quando viene memorizzata.) –

risposta

3

Se l'applicazione adatta alle matrici/matrici, è possibile utilizzare NumPy con float32

11

Se numpy (l'ottimo suggerimento di altre risposte) è inapplicabile per voi (ad esempio, perché sei in un ambiente che non consente estensioni arbitrarie di terze parti), anche il modulo array nella libreria standard Python è corretto - il tipo di codice 'f' fornisce float a 32 bit. Oltre a quelli e ai (soliti) float a doppia precisione, non c'è molto per "altri formati in virgola mobile" - cosa avevi in ​​mente? (ad esempio, gmpy offre il supporto modesto di GMP per i float con dimensioni di bit arbitrarie molto più lunghe, ma è in effetti modesto, ad esempio, nessuna funzione trigonometrica).

6

come su ctypes.c_float dalla libreria standard?

1

È possibile utilizzare il modulo struct di Python per troncare un float a 64 bit alla precisione di un float a 32 bit.

Ad esempio:

>>> x = 1.1122334455667788 
>>> x 
1.1122334455667788 
>>> struct.unpack('f', struct.pack('f', x))[0] 
1.1122334003448486 

far di conto solo con i carri a 32 bit, si avrebbe bisogno di applicare questa operazione troncamento al risultato di ogni operazione aritmetica.

Problemi correlati