2015-05-20 8 views
6

Ho dati scientifici scaricati in file. Al momento li ho scaricati con la stessa rappresentazione che hanno in memoria. Ho documentato che sono IEEE754 ma mi piacerebbe avere questo fatto nel codice in modo che se viene trasferito su un'architettura bizzarra e separato dalla mia documentazione (i codici di ricerca vengono passati in giro) si tratta di errori nella compilazione. Al momento hoCome si può testare la rappresentazione in virgola mobile per l'archiviazione dei file?

static_assert(sizeof(double)==8), "message"); 

C'è un modo per testare IEEE754? E può essere statico affermato?

+3

A meno che i set di dati non siano enormi, prendere in considerazione la possibilità di archiviare i dati come testo - molto più utile, portatile e compatibile con le versioni precedenti. –

+0

Prima di tutto: è un problema in C o C++? Le soluzioni sono diverse. – LPs

+0

In teoria c'è '__STDC_IEC_559__' da verificare, ma in pratica quasi nessun compilatore che io conosca lo definisce; Mi accontenterei di controllare la rappresentazione binaria di un caso ad angolo di coppia. Comunque, più che non avere IEEE754 (che è relativamente raro) vorrei ricontrollare l'endianness. –

risposta

4

In C, verificare se questo è definito:

__STDC_IEC_559__ 

In C++, controllare se questo è true:

std::numeric_limits<double>::is_iec559() 

IEC559, acronimo di International Electrotechnical Commission di serie 559, è lo stesso IEEE 754.

1

È possibile utilizzare std::numeric_limits<double>'s is_iec559 - vedere here

3

La risposta per C++ è qui: How to check if C++ compiler uses IEEE 754 floating point standard

Per C, allegato F della corrente C standard specifica che il preprocessore costante __STDC_IEC_559__ sarà pre-definito per il valore 1 se la piattaforma è conforme alle specifiche IEEE 754 per aritmetica in virgola mobile. Ma i compilatori C meno recenti potrebbero non pre-definirlo anche se i float sono effettivamente IEEE 754.

Tuttavia, questo non è sufficiente per entrambe le lingue: questa conformità garantisce solo la semantica di IEEE 754, non la rappresentazione binaria, e dal momento che sei scaricando la rappresentazione binaria in un file, è necessario anche gestire il problema dell'endianness. Diventa ancora più complicato in quanto l'endianità degli interi può differire dall'endianità per i float.

Alla fine, è molto meglio utilizzare una rappresentazione testuale per memorizzare i valori in virgola mobile se si desidera ottenere la portabilità tra varie piattaforme, presenti e futuri. Ovviamente, dovrai usare la massima precisione per questa rappresentazione.

Un'altra soluzione è fornita da http://hdfgroup.org che gestisce questo problema in modo efficiente per grandi quantità di dati.

Problemi correlati