Ho lavorato di recente a un sistema che ha bisogno di memorizzare e caricare grandi quantità di dati, compresi valori a virgola mobile a precisione singola. Ho deciso di standardizzare su ordine di byte di rete per gli interi, e anche deciso di memorizzare valori in virgola mobile in big-endian formato, vale a dire:Serializzazione portatile dei valori a virgola mobile IEEE754
|-- Byte 0 --| |-- Byte 1 -| Byte 2 Byte 3
# ####### # ####### ######## ########
Sign Exponent Mantissa
1b 8b, MSB first 23b, MSB first
Idealmente, voglio fornire funzioni come htonl()
e ntohl()
, dal momento che ho già state usando questi per fare lo swabing di interi, e voglio anche implementarlo in un modo che abbia il massimo di indipendenza dalla piattaforma possibile (pur supponendo che il tipo float
corrisponda ai valori in virgola mobile a 32 bit IEEE754). C'è un modo, forse usando ieee754.h
, per fare questo?
Ho una risposta che sembra al lavoro, e lo posterò sotto, ma sembra piuttosto lento e inefficiente e gradirei eventuali suggerimenti su come renderlo più veloce e/o più affidabile.
Che dire di questo: http://stackoverflow.com/a/2782742/1327576? – smocking
Ho guardato quella risposta, e chiaramente dipende dal presupposto che la rappresentazione dell'host sia little-endian. Sto cercando qualcosa che sia agnostico su host-byte-order. –
Probabilmente 'snprintf (b, sizeof (b),"% .9001f ", yourvalue)' (rappresentazione basata su testo) è la più portabile. –