Garantendo C ++ doppie sono 64 bit
-
09-09-2019 - |
Domanda
Nel mio programma C ++, ho bisogno di tirare un galleggiante a 64 bit da una sequenza di byte esterna. C'è qualche modo per garantire, al momento della compilazione, che doppie sono 64 bit? C'è qualche altro tipo dovrei usare per memorizzare i dati, invece?
Modifica:. Se stai leggendo questo e effettivamente alla ricerca di un modo per assicurare lo stoccaggio nel formato IEEE 754, hanno uno sguardo a risposta di Adam Rosenfield seguente
Soluzione
Un miglioramento sulle altre risposte (che assumono un carattere è 8-bit, lo standard non garantisce questo ..). Sarebbe in questo modo:
char a[sizeof(double) * CHAR_BIT == 64];
o
BOOST_STATIC_ASSERT(sizeof(double) * CHAR_BIT == 64);
Si possono trovare CHAR_BIT definito <limits.h>
o <climits>
.
Altri suggerimenti
In C99, si può solo verificare se il __STDC_IEC_559__
simbolo del preprocessore è definito. Se lo è, allora si ha la garanzia che un double
sarà un valore di 8 byte rappresentato con IEEE 754 (noto anche come IEC 60559) formato. Vedere lo standard C99, l'allegato F. Non sono sicuro se questo simbolo è disponibile in C ++, però.
#ifndef __STDC_IEC_559__
#error "Requires IEEE 754 floating point!"
#endif
In alternativa, è possibile controllare il costanti predefinite __DBL_DIG__
(dovrebbe essere 15), __DBL_MANT_DIG__
(dovrebbe essere 53), __DBL_MAX_10_EXP__
(dovrebbe essere 308), __DBL_MAX_EXP__
(dovrebbe essere 1024), __DBL_MIN_10_EXP
(dovrebbe essere -307), e __DBL_MIN_EXP__
( dovrebbe essere -1021). Questi dovrebbero essere disponibili in tutte le versioni di C e C ++.
Controlla std::numeric_limits< double >::is_iec559
se avete bisogno di sapere se l'implementazione C ++ supporta doppie standard. Ciò garantisce non solo che il numero totale di bit è 64, ma anche la dimensione e la posizione di tutti i campi all'interno della doppia.
Non credo che si dovrebbe concentrarsi sul "formato raw" del doppio (che è generalmente di 80 bit, non a 64 bit), ma piuttosto sulla sua precisione.
Grazie a numeric_limits :: digits10 questo è abbastanza facile.
È possibile utilizzare il Boost affermazioni statici a Fai questo. Guardate la rel="noreferrer"> esempio.
La soluzione senza boost è definire la matrice in questo modo
char a[ 8 == sizeof(double) ];
Se il doppio non è a 64 bit, allora il codice volontà appare come
char a[0];
che è un errore di compilazione. Basta mettere il commento appropriato nelle vicinanze di questo insegnamento.
questo post per un problema simile e una compilazione non-boost tempo asserzione chiamato CCASSERT.